From ee82183fd7e3251a08fe843db8b7bd0ef24ef8d3 Mon Sep 17 00:00:00 2001 From: Travis Vasceannie Date: Tue, 13 Jan 2026 09:58:31 +0000 Subject: [PATCH] feat: implement ASR configuration and HuggingFace token management services - Introduced `AsrConfigService` for managing ASR engine reconfiguration, including job tracking and capabilities validation. - Added `HfTokenService` for secure management of HuggingFace API tokens, including storage, validation, and retrieval functionalities. - Updated gRPC service to include endpoints for ASR configuration and HuggingFace token management. - Refactored existing services to improve integration with new ASR and token management features. - Added unit and integration tests for both services to ensure functionality and reliability. --- src/noteflow/application/services/__init__.py | 3 +- .../services/asr_config_service.py | 307 + .../application/services/asr_config_types.py | 72 + .../application/services/export_service.py | 10 +- .../application/services/hf_token_service.py | 248 + src/noteflow/domain/constants/fields.py | 7 + .../grpc/_client_mixins/converters.py | 22 +- src/noteflow/grpc/_mixins/__init__.py | 4 + src/noteflow/grpc/_mixins/_servicer_state.py | 4 + src/noteflow/grpc/_mixins/asr_config.py | 288 + .../grpc/_mixins/converters/_domain.py | 22 +- src/noteflow/grpc/_mixins/hf_token.py | 134 + src/noteflow/grpc/proto/noteflow.proto | 164 + src/noteflow/grpc/proto/noteflow_pb2.py | 616 +- src/noteflow/grpc/proto/noteflow_pb2.pyi | 7584 ++++++++++++----- src/noteflow/grpc/proto/noteflow_pb2_grpc.py | 303 + src/noteflow/grpc/proto/noteflow_pb2_grpc.pyi | 319 +- src/noteflow/grpc/service.py | 33 + src/noteflow/infrastructure/asr/__init__.py | 3 +- tests/application/test_asr_config_service.py | 414 + tests/application/test_hf_token_service.py | 546 ++ tests/integration/test_asr_config_grpc.py | 225 + tests/integration/test_hf_token_grpc.py | 259 + 23 files changed, 9276 insertions(+), 2311 deletions(-) create mode 100644 src/noteflow/application/services/asr_config_service.py create mode 100644 src/noteflow/application/services/asr_config_types.py create mode 100644 src/noteflow/application/services/hf_token_service.py create mode 100644 src/noteflow/grpc/_mixins/asr_config.py create mode 100644 src/noteflow/grpc/_mixins/hf_token.py create mode 100644 tests/application/test_asr_config_service.py create mode 100644 tests/application/test_hf_token_service.py create mode 100644 tests/integration/test_asr_config_grpc.py create mode 100644 tests/integration/test_hf_token_grpc.py diff --git a/src/noteflow/application/services/__init__.py b/src/noteflow/application/services/__init__.py index 29b6af4..dfb6d1f 100644 --- a/src/noteflow/application/services/__init__.py +++ b/src/noteflow/application/services/__init__.py @@ -7,7 +7,8 @@ from noteflow.application.services.auth_service import ( LogoutResult, UserInfo, ) -from noteflow.application.services.export_service import ExportFormat, ExportService +from noteflow.application.services.export_service import ExportService +from noteflow.domain.value_objects import ExportFormat from noteflow.application.services.identity import IdentityService from noteflow.application.services.meeting import MeetingService from noteflow.application.services.project_service import ProjectService diff --git a/src/noteflow/application/services/asr_config_service.py b/src/noteflow/application/services/asr_config_service.py new file mode 100644 index 0000000..24c1c69 --- /dev/null +++ b/src/noteflow/application/services/asr_config_service.py @@ -0,0 +1,307 @@ +"""ASR configuration service for runtime reconfiguration. + +Orchestrates ASR engine reconfiguration including model reload with progress tracking. +""" + +from __future__ import annotations + +import asyncio +from collections.abc import Callable +from typing import TYPE_CHECKING +from uuid import UUID, uuid4 + +from noteflow.application.services.asr_config_types import ( + AsrCapabilities, + AsrComputeType, + AsrConfigJob, + AsrConfigPhase, + AsrDevice, + DEVICE_COMPUTE_TYPES, +) +from noteflow.domain.constants.fields import ( + JOB_STATUS_COMPLETED, + JOB_STATUS_FAILED, + JOB_STATUS_QUEUED, + JOB_STATUS_RUNNING, +) +from noteflow.infrastructure.asr import VALID_MODEL_SIZES +from noteflow.infrastructure.logging import get_logger + +if TYPE_CHECKING: + from noteflow.infrastructure.asr import FasterWhisperEngine + +logger = get_logger(__name__) + +class AsrConfigService: + """Service for managing ASR engine configuration at runtime. + + Provides capabilities discovery, validation, and orchestrated model reload + with progress tracking via background jobs. + """ + + def __init__( + self, + asr_engine: FasterWhisperEngine | None, + *, + on_engine_update: Callable[[FasterWhisperEngine], None] | None = None, + ) -> None: + """Initialize the service. + + Args: + asr_engine: The ASR engine instance to manage. May be None if ASR is disabled. + on_engine_update: Optional callback when the active engine is replaced. + """ + self._asr_engine = asr_engine + self._on_engine_update = on_engine_update + self._jobs: dict[UUID, AsrConfigJob] = {} + self._job_lock = asyncio.Lock() + self._reload_lock = asyncio.Lock() + + def detect_cuda_available(self) -> bool: + """Detect if CUDA is available for ASR. + + Returns: + True if CUDA is available, False otherwise. + """ + try: + import torch + + return torch.cuda.is_available() + except ImportError: + return False + + def get_capabilities(self) -> AsrCapabilities: + """Get current ASR configuration and capabilities. + + Returns: + Current ASR configuration including available options. + """ + cuda_available = self.detect_cuda_available() + current_device = AsrDevice.CPU + current_compute_type = AsrComputeType.INT8 + + if self._asr_engine is not None: + current_device = AsrDevice(self._asr_engine.device) + current_compute_type = AsrComputeType(self._asr_engine.compute_type) + + return AsrCapabilities( + model_size=self._asr_engine.model_size if self._asr_engine else None, + device=current_device, + compute_type=current_compute_type, + is_ready=self._asr_engine.is_loaded if self._asr_engine else False, + cuda_available=cuda_available, + available_model_sizes=VALID_MODEL_SIZES, + available_compute_types=DEVICE_COMPUTE_TYPES[current_device], + ) + + def validate_configuration( + self, + model_size: str | None, + device: AsrDevice | None, + compute_type: AsrComputeType | None, + ) -> str | None: + """Validate configuration before applying. + + Args: + model_size: Requested model size (or None to keep current). + device: Requested device (or None to keep current). + compute_type: Requested compute type (or None to keep current). + + Returns: + Error message if validation fails, None if valid. + """ + if model_size is not None and model_size not in VALID_MODEL_SIZES: + valid_sizes = ", ".join(VALID_MODEL_SIZES) + return f"Invalid model size: {model_size}. Valid: {valid_sizes}" + + if device == AsrDevice.CUDA and not self.detect_cuda_available(): + return "CUDA requested but not available on this server" + + if device is not None and compute_type is not None: + valid_types = DEVICE_COMPUTE_TYPES[device] + if compute_type not in valid_types: + return ( + f"Compute type {compute_type.value} not available for {device.value}" + ) + + return None + + + def _check_reconfiguration_preconditions( + self, + has_active_recordings: bool, + ) -> str | None: + """Check preconditions for ASR reconfiguration. + + Args: + has_active_recordings: Whether there are active recording streams. + + Returns: + Error message if preconditions fail, None if OK. + """ + if has_active_recordings: + return "Cannot reconfigure ASR while recordings are active" + return "ASR engine is not available" if self._asr_engine is None else None + + async def start_reconfiguration( + self, + model_size: str | None, + device: AsrDevice | None, + compute_type: AsrComputeType | None, + has_active_recordings: bool, + ) -> tuple[UUID | None, str | None]: + """Start ASR reconfiguration. + + Returns: + Tuple of (job_id, error_message). job_id is None on validation failure. + """ + if precondition_error := self._check_reconfiguration_preconditions( + has_active_recordings + ): + return None, precondition_error + + # Use current values as defaults + caps = self.get_capabilities() + target_model = model_size or caps.model_size or "base" + target_device = device or caps.device + target_compute = compute_type or caps.compute_type + + if error := self.validate_configuration( + target_model, target_device, target_compute + ): + return None, error + + # Create and queue job + job_id = uuid4() + job = AsrConfigJob( + job_id=job_id, + status=JOB_STATUS_QUEUED, + phase=AsrConfigPhase.VALIDATING, + progress_percent=0.0, + error_message="", + target_model_size=target_model, + target_device=target_device, + target_compute_type=target_compute, + ) + + async with self._job_lock: + self._jobs[job_id] = job + + job.task = asyncio.create_task(self._run_reconfiguration(job)) + return job_id, None + + + def _build_engine_for_job( + self, + job: AsrConfigJob, + current_engine: FasterWhisperEngine | None, + ) -> tuple[FasterWhisperEngine, bool]: + """Return an engine to load the model into. + + If device/compute settings change, create a new engine but keep the + current one active until the new model loads successfully. + + Args: + job: The reconfiguration job with target settings. + current_engine: The currently active engine (if any). + + Returns: + Tuple of (engine_to_use, is_new_engine). + """ + if ( + current_engine is not None + and job.target_device.value == current_engine.device + and job.target_compute_type.value == current_engine.compute_type + ): + return current_engine, False + + # Import here to avoid circular imports + from noteflow.infrastructure.asr import FasterWhisperEngine + + return ( + FasterWhisperEngine( + compute_type=job.target_compute_type.value, + device=job.target_device.value, + ), + True, + ) + + def _set_active_engine(self, engine: FasterWhisperEngine) -> None: + """Swap the active engine and notify listeners.""" + self._asr_engine = engine + if self._on_engine_update is not None: + self._on_engine_update(engine) + + async def _load_model( + self, + engine: FasterWhisperEngine, + model_size: str, + ) -> None: + """Load a model into the provided engine.""" + loop = asyncio.get_running_loop() + await loop.run_in_executor(None, engine.load_model, model_size) + + def _mark_job_completed(self, job: AsrConfigJob) -> None: + """Update job state for successful completion.""" + job.phase = AsrConfigPhase.COMPLETED + job.status = JOB_STATUS_COMPLETED + job.progress_percent = 100.0 + + def _mark_job_failed(self, job: AsrConfigJob, error: Exception) -> None: + """Update job state for failure and log.""" + job.phase = AsrConfigPhase.FAILED + job.status = JOB_STATUS_FAILED + job.error_message = str(error) + logger.error("asr_reconfiguration_failed", error=str(error)) + + async def _execute_reconfiguration(self, job: AsrConfigJob) -> None: + """Run reconfiguration steps and swap engine after success.""" + current_engine = self._asr_engine + job.status = JOB_STATUS_RUNNING + job.phase = AsrConfigPhase.LOADING + job.progress_percent = 10.0 + + engine_to_use, is_new_engine = self._build_engine_for_job(job, current_engine) + job.progress_percent = 50.0 + + await self._load_model(engine_to_use, job.target_model_size) + job.progress_percent = 90.0 + + if is_new_engine: + self._set_active_engine(engine_to_use) + if current_engine is not None: + current_engine.unload() + + self._mark_job_completed(job) + logger.info( + "asr_reconfigured", + model_size=job.target_model_size, + device=job.target_device.value, + compute_type=job.target_compute_type.value, + ) + + async def _run_reconfiguration(self, job: AsrConfigJob) -> None: + """Execute the reconfiguration in background. + + Args: + job: The job to execute. + """ + async with self._reload_lock: + try: + await self._execute_reconfiguration(job) + except Exception as e: + self._mark_job_failed(job, e) + + def get_job_status(self, job_id: UUID) -> AsrConfigJob | None: + """Get status of a reconfiguration job. + + Args: + job_id: The job identifier. + + Returns: + The job status, or None if not found. + """ + job = self._jobs.get(job_id) + if job is None: + logger.debug("job_not_found", job_id=str(job_id)) + return job diff --git a/src/noteflow/application/services/asr_config_types.py b/src/noteflow/application/services/asr_config_types.py new file mode 100644 index 0000000..43bea0c --- /dev/null +++ b/src/noteflow/application/services/asr_config_types.py @@ -0,0 +1,72 @@ +"""Types and constants for ASR configuration.""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass, field +from enum import Enum +from typing import Final +from uuid import UUID + + +class AsrConfigPhase(str, Enum): + """Phases of ASR reconfiguration.""" + + VALIDATING = "validating" + DOWNLOADING = "downloading" + LOADING = "loading" + COMPLETED = "completed" + FAILED = "failed" + + +class AsrDevice(str, Enum): + """Supported ASR devices.""" + + CPU = "cpu" + CUDA = "cuda" + + +class AsrComputeType(str, Enum): + """Supported compute types.""" + + INT8 = "int8" + FLOAT16 = "float16" + FLOAT32 = "float32" + + +DEVICE_COMPUTE_TYPES: Final[dict[AsrDevice, tuple[AsrComputeType, ...]]] = { + AsrDevice.CPU: (AsrComputeType.INT8, AsrComputeType.FLOAT32), + AsrDevice.CUDA: ( + AsrComputeType.INT8, + AsrComputeType.FLOAT16, + AsrComputeType.FLOAT32, + ), +} + + +@dataclass +class AsrConfigJob: + """Tracks ASR reconfiguration job state.""" + + job_id: UUID + status: str # One of JOB_STATUS_* constants + phase: AsrConfigPhase + progress_percent: float + error_message: str + target_model_size: str + target_device: AsrDevice + target_compute_type: AsrComputeType + task: asyncio.Task[None] | None = field(default=None, repr=False) + + +@dataclass(frozen=True) +class AsrCapabilities: + """Current ASR capabilities and configuration.""" + + model_size: str | None + device: AsrDevice + compute_type: AsrComputeType + is_ready: bool + cuda_available: bool + available_model_sizes: tuple[str, ...] + available_compute_types: tuple[AsrComputeType, ...] diff --git a/src/noteflow/application/services/export_service.py b/src/noteflow/application/services/export_service.py index 530a131..8a22150 100644 --- a/src/noteflow/application/services/export_service.py +++ b/src/noteflow/application/services/export_service.py @@ -5,7 +5,6 @@ Orchestrates transcript export to various formats. from __future__ import annotations -from enum import Enum from pathlib import Path from typing import TYPE_CHECKING @@ -14,6 +13,7 @@ from noteflow.config.constants import ( EXPORT_EXT_HTML, EXPORT_EXT_PDF, ) +from noteflow.domain.value_objects import ExportFormat from noteflow.infrastructure.export import ( HtmlExporter, MarkdownExporter, @@ -31,14 +31,6 @@ if TYPE_CHECKING: logger = get_logger(__name__) -class ExportFormat(Enum): - """Supported export formats.""" - - MARKDOWN = "markdown" - HTML = "html" - PDF = "pdf" - - # Module-level constant mapping file extensions to format values. # Keys are lowercase extensions, values are ExportFormat enum value strings. _EXTENSION_TO_FORMAT: dict[str, str] = { diff --git a/src/noteflow/application/services/hf_token_service.py b/src/noteflow/application/services/hf_token_service.py new file mode 100644 index 0000000..95769fe --- /dev/null +++ b/src/noteflow/application/services/hf_token_service.py @@ -0,0 +1,248 @@ +"""HuggingFace token service for secure token management.""" + +from __future__ import annotations + +import base64 +from dataclasses import dataclass +from typing import TYPE_CHECKING, Final, cast + +import httpx + +from noteflow.domain.utils.time import utc_now +from noteflow.infrastructure.logging import get_logger +from noteflow.infrastructure.security.protocols import EncryptedChunk + +if TYPE_CHECKING: + from collections.abc import Callable + + from noteflow.domain.ports.unit_of_work import UnitOfWork + from noteflow.infrastructure.security.crypto import AesGcmCryptoBox + +_MetadataDict = dict[str, str | float | bool | None] +_EncryptedDataDict = dict[str, str] + +logger = get_logger(__name__) + +# Preference keys for HF token storage +_HF_TOKEN_KEY: Final[str] = "_hf_token_encrypted" +_HF_TOKEN_META_KEY: Final[str] = "_hf_token_meta" +_HF_WHOAMI_URL: Final[str] = "https://huggingface.co/api/whoami-v2" + +# Metadata and encrypted data field keys +_META_USERNAME: Final[str] = "username" +_META_VALIDATED_AT: Final[str] = "validated_at" +_META_IS_VALIDATED: Final[str] = "is_validated" +_ENC_WRAPPED_DEK: Final[str] = "wrapped_dek" +_ENC_NONCE: Final[str] = "nonce" +_ENC_CIPHERTEXT: Final[str] = "ciphertext" +_ENC_TAG: Final[str] = "tag" +_ASCII_ENCODING: Final[str] = "ascii" + + +@dataclass(frozen=True) +class HfTokenStatus: + """Status of the HuggingFace token.""" + + is_configured: bool + is_validated: bool + username: str + validated_at: float | None + + +@dataclass(frozen=True) +class HfValidationResult: + """Result of HuggingFace token validation.""" + + valid: bool + username: str + error_message: str + + +class HfTokenService: + """Service for managing HuggingFace API tokens.""" + + def __init__( + self, + uow_factory: Callable[[], UnitOfWork], + crypto: AesGcmCryptoBox, + ) -> None: + """Initialize with UoW factory and crypto box.""" + self._uow_factory = uow_factory + self._crypto = crypto + + async def set_token( + self, + token: str, + *, + validate: bool = True, + ) -> tuple[bool, HfValidationResult | None]: + """Set and optionally validate a HuggingFace token.""" + validation_result: HfValidationResult | None = None + username = "" + validated_at: float | None = None + + if validate: + validation_result = await self.validate_token_internal(token) + if not validation_result.valid: + return False, validation_result + username = validation_result.username + validated_at = utc_now().timestamp() + + encrypted_data = self.encrypt_token(token) + is_valid = validate and validation_result is not None and validation_result.valid + metadata: dict[str, str | float | bool | None] = { + _META_USERNAME: username, + _META_VALIDATED_AT: validated_at, + _META_IS_VALIDATED: is_valid, + } + + async with self._uow_factory() as uow: + if not uow.supports_preferences: + error_result = HfValidationResult( + False, + "", + "Preferences storage not available", + ) + logger.warning("hf_token_storage_unavailable") + return False, error_result + await uow.preferences.set(_HF_TOKEN_KEY, encrypted_data) + await uow.preferences.set(_HF_TOKEN_META_KEY, metadata) + await uow.commit() + + logger.info("hf_token_stored", username=username, validated=validate) + return True, validation_result + + async def get_status(self) -> HfTokenStatus: + """Get the current status of the HuggingFace token.""" + async with self._uow_factory() as uow: + if not uow.supports_preferences: + return HfTokenStatus(False, False, "", None) + encrypted_data = await uow.preferences.get(_HF_TOKEN_KEY) + metadata = await uow.preferences.get(_HF_TOKEN_META_KEY) + + if encrypted_data is None: + return HfTokenStatus(False, False, "", None) + + if metadata is not None and isinstance(metadata, dict): + meta = cast(_MetadataDict, metadata) + username = str(meta.get(_META_USERNAME, "")) + is_validated = bool(meta.get(_META_IS_VALIDATED, False)) + raw_validated_at = meta.get(_META_VALIDATED_AT) + validated_at = float(raw_validated_at) if raw_validated_at is not None else None + else: + username, is_validated, validated_at = "", False, None + + return HfTokenStatus(True, is_validated, username, validated_at) + + async def delete_token(self) -> bool: + """Delete the stored HuggingFace token.""" + async with self._uow_factory() as uow: + if not uow.supports_preferences: + return False + deleted_token = await uow.preferences.delete(_HF_TOKEN_KEY) + await uow.preferences.delete(_HF_TOKEN_META_KEY) + await uow.commit() + + if deleted_token: + logger.info("hf_token_deleted") + return deleted_token + + async def _update_validation_metadata(self, username: str) -> None: + """Update token validation metadata after successful validation.""" + metadata: dict[str, str | float | bool | None] = { + _META_USERNAME: username, + _META_VALIDATED_AT: utc_now().timestamp(), + _META_IS_VALIDATED: True, + } + async with self._uow_factory() as uow: + if uow.supports_preferences: + await uow.preferences.set(_HF_TOKEN_META_KEY, metadata) + await uow.commit() + + async def validate_stored_token(self) -> HfValidationResult: + """Validate the currently stored HuggingFace token.""" + async with self._uow_factory() as uow: + if not uow.supports_preferences: + return HfValidationResult(False, "", "Preferences storage not available") + encrypted_data = await uow.preferences.get(_HF_TOKEN_KEY) + + if encrypted_data is None: + return HfValidationResult(False, "", "No token configured") + + try: + token = self.decrypt_token(encrypted_data) + except ValueError as e: + logger.error("hf_token_decrypt_failed", error=str(e)) + return HfValidationResult(False, "", "Token decryption failed") + + result = await self.validate_token_internal(token) + if result.valid: + await self._update_validation_metadata(result.username) + return result + + async def get_token(self) -> str | None: + """Get the decrypted HuggingFace token, or None if not configured.""" + async with self._uow_factory() as uow: + if not uow.supports_preferences: + return None + encrypted_data = await uow.preferences.get(_HF_TOKEN_KEY) + + if encrypted_data is None: + return None + + try: + return self.decrypt_token(encrypted_data) + except ValueError: + return None + + async def validate_token_internal(self, token: str) -> HfValidationResult: + """Validate a token against HuggingFace API.""" + try: + async with httpx.AsyncClient(timeout=10.0) as client: + response = await client.get( + _HF_WHOAMI_URL, + headers={"Authorization": f"Bearer {token}"}, + ) + + if response.status_code == 200: + data = response.json() + return HfValidationResult(True, str(data.get("name", "")), "") + if response.status_code == 401: + return HfValidationResult(False, "", "Invalid or expired token") + return HfValidationResult(False, "", f"HuggingFace API error: {response.status_code}") + except httpx.TimeoutException: + return HfValidationResult(False, "", "Connection timeout") + except httpx.RequestError as e: + return HfValidationResult(False, "", f"Connection error: {e}") + + def encrypt_token(self, token: str) -> dict[str, str]: + """Encrypt a token for storage.""" + dek = self._crypto.generate_dek() + wrapped_dek = self._crypto.wrap_dek(dek) + token_bytes = token.encode("utf-8") + encrypted = self._crypto.encrypt_chunk(token_bytes, dek) + return { + _ENC_WRAPPED_DEK: base64.b64encode(wrapped_dek).decode(_ASCII_ENCODING), + _ENC_NONCE: base64.b64encode(encrypted.nonce).decode(_ASCII_ENCODING), + _ENC_CIPHERTEXT: base64.b64encode(encrypted.ciphertext).decode(_ASCII_ENCODING), + _ENC_TAG: base64.b64encode(encrypted.tag).decode(_ASCII_ENCODING), + } + + def decrypt_token(self, encrypted_data: object) -> str: + """Decrypt a stored token. Raises ValueError if decryption fails.""" + if not isinstance(encrypted_data, dict): + raise ValueError("Invalid encrypted data format") + + data = cast(_EncryptedDataDict, encrypted_data) + try: + wrapped_dek = base64.b64decode(data[_ENC_WRAPPED_DEK]) + nonce = base64.b64decode(data[_ENC_NONCE]) + ciphertext = base64.b64decode(data[_ENC_CIPHERTEXT]) + tag = base64.b64decode(data[_ENC_TAG]) + except (KeyError, ValueError) as e: + raise ValueError(f"Invalid encrypted data: {e}") from e + + dek = self._crypto.unwrap_dek(wrapped_dek) + chunk = EncryptedChunk(nonce=nonce, ciphertext=ciphertext, tag=tag) + plaintext = self._crypto.decrypt_chunk(chunk, dek) + return plaintext.decode("utf-8") diff --git a/src/noteflow/domain/constants/fields.py b/src/noteflow/domain/constants/fields.py index e733ced..9b7df23 100644 --- a/src/noteflow/domain/constants/fields.py +++ b/src/noteflow/domain/constants/fields.py @@ -69,3 +69,10 @@ WRAPPED_DEK: Final[str] = "wrapped_dek" # Entity type names (for logging/messages) ENTITY_MEETING: Final[str] = "Meeting" ENTITY_WORKSPACE: Final[str] = "Workspace" + +# Job status constants +JOB_STATUS_QUEUED: Final[str] = "queued" +JOB_STATUS_RUNNING: Final[str] = "running" +JOB_STATUS_COMPLETED: Final[str] = "completed" +JOB_STATUS_FAILED: Final[str] = "failed" +JOB_STATUS_CANCELLED: Final[str] = "cancelled" diff --git a/src/noteflow/grpc/_client_mixins/converters.py b/src/noteflow/grpc/_client_mixins/converters.py index 291594e..4ad9288 100644 --- a/src/noteflow/grpc/_client_mixins/converters.py +++ b/src/noteflow/grpc/_client_mixins/converters.py @@ -5,7 +5,18 @@ from __future__ import annotations from collections.abc import Sequence from typing import Protocol -from noteflow.domain.constants.fields import ACTION_ITEM, DECISION, NOTE, RISK, UNKNOWN +from noteflow.domain.constants.fields import ( + ACTION_ITEM, + DECISION, + JOB_STATUS_CANCELLED, + JOB_STATUS_COMPLETED, + JOB_STATUS_FAILED, + JOB_STATUS_QUEUED, + JOB_STATUS_RUNNING, + NOTE, + RISK, + UNKNOWN, +) from noteflow.grpc._types import AnnotationInfo, MeetingInfo from noteflow.grpc.proto import noteflow_pb2 @@ -84,10 +95,11 @@ EXPORT_FORMAT_TO_PROTO: dict[str, int] = { # Job status mapping JOB_STATUS_MAP: dict[int, str] = { noteflow_pb2.JOB_STATUS_UNSPECIFIED: UNKNOWN, - noteflow_pb2.JOB_STATUS_QUEUED: "queued", - noteflow_pb2.JOB_STATUS_RUNNING: "running", - noteflow_pb2.JOB_STATUS_COMPLETED: "completed", - noteflow_pb2.JOB_STATUS_FAILED: "failed", + noteflow_pb2.JOB_STATUS_QUEUED: JOB_STATUS_QUEUED, + noteflow_pb2.JOB_STATUS_RUNNING: JOB_STATUS_RUNNING, + noteflow_pb2.JOB_STATUS_COMPLETED: JOB_STATUS_COMPLETED, + noteflow_pb2.JOB_STATUS_FAILED: JOB_STATUS_FAILED, + noteflow_pb2.JOB_STATUS_CANCELLED: JOB_STATUS_CANCELLED, } diff --git a/src/noteflow/grpc/_mixins/__init__.py b/src/noteflow/grpc/_mixins/__init__.py index 2304b44..2567884 100644 --- a/src/noteflow/grpc/_mixins/__init__.py +++ b/src/noteflow/grpc/_mixins/__init__.py @@ -2,11 +2,13 @@ from ._types import GrpcContext, GrpcStatusContext from .annotation import AnnotationMixin +from .asr_config import AsrConfigMixin from .calendar import CalendarMixin from .diarization import DiarizationMixin from .diarization_job import DiarizationJobMixin from .entities import EntitiesMixin from .export import ExportMixin +from .hf_token import HfTokenMixin from .identity import IdentityMixin from .meeting import MeetingMixin from .observability import ObservabilityMixin @@ -24,6 +26,7 @@ from .webhooks import WebhooksMixin __all__ = [ "AnnotationMixin", + "AsrConfigMixin", "CalendarMixin", "DiarizationJobMixin", "DiarizationMixin", @@ -31,6 +34,7 @@ __all__ = [ "ExportMixin", "GrpcContext", "GrpcStatusContext", + "HfTokenMixin", "IdentityMixin", "MeetingMixin", "ObservabilityMixin", diff --git a/src/noteflow/grpc/_mixins/_servicer_state.py b/src/noteflow/grpc/_mixins/_servicer_state.py index c8dc600..cc5b4d5 100644 --- a/src/noteflow/grpc/_mixins/_servicer_state.py +++ b/src/noteflow/grpc/_mixins/_servicer_state.py @@ -13,7 +13,9 @@ if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker + from noteflow.application.services.asr_config_service import AsrConfigService from noteflow.application.services.calendar import CalendarService + from noteflow.application.services.hf_token_service import HfTokenService from noteflow.application.services.identity import IdentityService from noteflow.application.services.ner_service import NerService from noteflow.application.services.project_service import ProjectService @@ -42,6 +44,7 @@ class ServicerState(Protocol): # Engines and services asr_engine: FasterWhisperEngine | None + asr_config_service: AsrConfigService | None diarization_engine: DiarizationEngine | None summarization_service: SummarizationService | None ner_service: NerService | None @@ -49,6 +52,7 @@ class ServicerState(Protocol): webhook_service: WebhookService | None project_service: ProjectService | None identity_service: IdentityService + hf_token_service: HfTokenService | None diarization_refinement_enabled: bool # Audio writers diff --git a/src/noteflow/grpc/_mixins/asr_config.py b/src/noteflow/grpc/_mixins/asr_config.py new file mode 100644 index 0000000..4deeabf --- /dev/null +++ b/src/noteflow/grpc/_mixins/asr_config.py @@ -0,0 +1,288 @@ +"""ASR configuration mixin for gRPC service. + +Provides runtime ASR engine reconfiguration including model size, +device, and compute type changes with job-based progress tracking. +""" + +from __future__ import annotations + +from typing import Protocol, cast + +from noteflow.application.services.asr_config_service import ( + AsrComputeType, + AsrConfigPhase, + AsrConfigService, + AsrDevice, +) +from noteflow.domain.constants.fields import ( + JOB_STATUS_COMPLETED, + JOB_STATUS_FAILED, + JOB_STATUS_QUEUED, + JOB_STATUS_RUNNING, +) +from noteflow.infrastructure.logging import get_logger + +from ..proto import noteflow_pb2 +from ._types import GrpcContext + + +class _Copyable(Protocol): + """Protocol for protobuf CopyFrom method.""" + + def CopyFrom(self, other: _Copyable) -> None: ... + +logger = get_logger(__name__) + + +# Proto enum value maps +_DEVICE_TO_PROTO: dict[AsrDevice, int] = { + AsrDevice.CPU: noteflow_pb2.ASR_DEVICE_CPU, + AsrDevice.CUDA: noteflow_pb2.ASR_DEVICE_CUDA, +} + +_PROTO_TO_DEVICE: dict[int, AsrDevice] = { + noteflow_pb2.ASR_DEVICE_CPU: AsrDevice.CPU, + noteflow_pb2.ASR_DEVICE_CUDA: AsrDevice.CUDA, +} + +_COMPUTE_TYPE_TO_PROTO: dict[AsrComputeType, int] = { + AsrComputeType.INT8: noteflow_pb2.ASR_COMPUTE_TYPE_INT8, + AsrComputeType.FLOAT16: noteflow_pb2.ASR_COMPUTE_TYPE_FLOAT16, + AsrComputeType.FLOAT32: noteflow_pb2.ASR_COMPUTE_TYPE_FLOAT32, +} + +_PROTO_TO_COMPUTE_TYPE: dict[int, AsrComputeType] = { + noteflow_pb2.ASR_COMPUTE_TYPE_INT8: AsrComputeType.INT8, + noteflow_pb2.ASR_COMPUTE_TYPE_FLOAT16: AsrComputeType.FLOAT16, + noteflow_pb2.ASR_COMPUTE_TYPE_FLOAT32: AsrComputeType.FLOAT32, +} + +_STATUS_TO_PROTO: dict[str, int] = { + JOB_STATUS_QUEUED: noteflow_pb2.JOB_STATUS_QUEUED, + JOB_STATUS_RUNNING: noteflow_pb2.JOB_STATUS_RUNNING, + JOB_STATUS_COMPLETED: noteflow_pb2.JOB_STATUS_COMPLETED, + JOB_STATUS_FAILED: noteflow_pb2.JOB_STATUS_FAILED, +} + +_PHASE_TO_STRING: dict[AsrConfigPhase, str] = { + AsrConfigPhase.VALIDATING: "validating", + AsrConfigPhase.DOWNLOADING: "downloading", + AsrConfigPhase.LOADING: "loading", + AsrConfigPhase.COMPLETED: "completed", + AsrConfigPhase.FAILED: "failed", +} + + +def _build_configuration_proto( + service: AsrConfigService, +) -> noteflow_pb2.AsrConfiguration: + """Build ASR configuration proto message from service state. + + Args: + service: The ASR config service. + + Returns: + Populated AsrConfiguration proto message. + """ + caps = service.get_capabilities() + + # Convert compute types to proto enum values + available_compute_types = [ + _COMPUTE_TYPE_TO_PROTO[ct] for ct in caps.available_compute_types + ] + + return noteflow_pb2.AsrConfiguration( + model_size=caps.model_size or "", + device=_DEVICE_TO_PROTO.get(caps.device, noteflow_pb2.ASR_DEVICE_UNSPECIFIED), + compute_type=_COMPUTE_TYPE_TO_PROTO.get( + caps.compute_type, noteflow_pb2.ASR_COMPUTE_TYPE_UNSPECIFIED + ), + is_ready=caps.is_ready, + cuda_available=caps.cuda_available, + available_model_sizes=list(caps.available_model_sizes), + available_compute_types=available_compute_types, + ) + + + +def _parse_update_request( + request: noteflow_pb2.UpdateAsrConfigurationRequest, +) -> tuple[str | None, AsrDevice | None, AsrComputeType | None]: + """Parse UpdateAsrConfiguration request parameters. + + Args: + request: The gRPC request. + + Returns: + Tuple of (model_size, device, compute_type) with None for unspecified fields. + """ + model_size = request.model_size if request.HasField("model_size") else None + device = ( + _PROTO_TO_DEVICE.get(request.device) + if request.HasField("device") + and request.device != noteflow_pb2.ASR_DEVICE_UNSPECIFIED + else None + ) + compute_type = ( + _PROTO_TO_COMPUTE_TYPE.get(request.compute_type) + if request.HasField("compute_type") + and request.compute_type != noteflow_pb2.ASR_COMPUTE_TYPE_UNSPECIFIED + else None + ) + return model_size, device, compute_type + + +def _create_job_error_response( + job_id: str, + error_message: str, +) -> noteflow_pb2.AsrConfigurationJobStatus: + """Create error response for job status request. + + Args: + job_id: The requested job ID. + error_message: The error message to include. + + Returns: + Error response proto message. + """ + return noteflow_pb2.AsrConfigurationJobStatus( + job_id=job_id, + status=noteflow_pb2.JOB_STATUS_FAILED, + progress_percent=0.0, + phase="failed", + error_message=error_message, + ) + +class AsrConfigMixin: + """Mixin providing ASR configuration management functionality. + + Requires host to have: + - asr_config_service: AsrConfigService | None + - active_streams: set[str] + """ + + # Protocol requirements (declared for type checking) + asr_config_service: AsrConfigService | None + active_streams: set[str] + + async def GetAsrConfiguration( + self, + request: noteflow_pb2.GetAsrConfigurationRequest, + context: GrpcContext, + ) -> noteflow_pb2.GetAsrConfigurationResponse: + """Get current ASR configuration and available options. + + Returns capabilities including available model sizes, compute types, + and CUDA availability for the UI to display configuration options. + """ + if self.asr_config_service is None: + logger.warning("asr_config_requested_but_no_service") + # Return empty configuration if ASR is not available + return noteflow_pb2.GetAsrConfigurationResponse( + configuration=noteflow_pb2.AsrConfiguration( + model_size="", + device=noteflow_pb2.ASR_DEVICE_UNSPECIFIED, + compute_type=noteflow_pb2.ASR_COMPUTE_TYPE_UNSPECIFIED, + is_ready=False, + cuda_available=False, + available_model_sizes=[], + available_compute_types=[], + ) + ) + + config_proto = _build_configuration_proto(self.asr_config_service) + return noteflow_pb2.GetAsrConfigurationResponse(configuration=config_proto) + + async def UpdateAsrConfiguration( + self, + request: noteflow_pb2.UpdateAsrConfigurationRequest, + context: GrpcContext, + ) -> noteflow_pb2.UpdateAsrConfigurationResponse: + """Update ASR configuration and start model reload. + + Initiates a background job to reconfigure the ASR engine. The job + handles model download (if needed) and reload. Returns immediately + with a job ID for progress tracking. + """ + if self.asr_config_service is None: + return noteflow_pb2.UpdateAsrConfigurationResponse( + job_id="", + status=noteflow_pb2.JOB_STATUS_FAILED, + accepted=False, + error_message="ASR service is not available", + ) + + model_size, device, compute_type = _parse_update_request(request) + has_active_recordings = len(self.active_streams) > 0 + + job_id, error = await self.asr_config_service.start_reconfiguration( + model_size=model_size, + device=device, + compute_type=compute_type, + has_active_recordings=has_active_recordings, + ) + + if error: + return noteflow_pb2.UpdateAsrConfigurationResponse( + job_id="", + status=noteflow_pb2.JOB_STATUS_FAILED, + accepted=False, + error_message=error, + ) + + return noteflow_pb2.UpdateAsrConfigurationResponse( + job_id=str(job_id), + status=noteflow_pb2.JOB_STATUS_QUEUED, + accepted=True, + error_message="", + ) + + async def GetAsrConfigurationJobStatus( + self, + request: noteflow_pb2.GetAsrConfigurationJobStatusRequest, + context: GrpcContext, + ) -> noteflow_pb2.AsrConfigurationJobStatus: + """Get status of an ASR reconfiguration job. + + Returns progress information for a running or completed job, + including the new configuration once reload is complete. + """ + from uuid import UUID + + if self.asr_config_service is None: + return _create_job_error_response(request.job_id, "ASR service is not available") + + try: + job_id = UUID(request.job_id) + except ValueError: + return _create_job_error_response(request.job_id, "Invalid job ID format") + + job = self.asr_config_service.get_job_status(job_id) + if job is None: + return noteflow_pb2.AsrConfigurationJobStatus( + job_id=request.job_id, + status=noteflow_pb2.JOB_STATUS_UNSPECIFIED, + progress_percent=0.0, + phase="", + error_message="Job not found", + ) + + # Build response + status_proto = _STATUS_TO_PROTO.get(job.status, noteflow_pb2.JOB_STATUS_UNSPECIFIED) + phase_str = _PHASE_TO_STRING.get(job.phase, "") + + response = noteflow_pb2.AsrConfigurationJobStatus( + job_id=request.job_id, + status=status_proto, + progress_percent=job.progress_percent, + phase=phase_str, + error_message=job.error_message, + ) + + # Include new configuration if job completed successfully + if job.status == JOB_STATUS_COMPLETED: + config_field = cast(_Copyable, response.new_configuration) + config_proto = _build_configuration_proto(self.asr_config_service) + config_field.CopyFrom(cast(_Copyable, config_proto)) + + return response diff --git a/src/noteflow/grpc/_mixins/converters/_domain.py b/src/noteflow/grpc/_mixins/converters/_domain.py index ac30264..7166730 100644 --- a/src/noteflow/grpc/_mixins/converters/_domain.py +++ b/src/noteflow/grpc/_mixins/converters/_domain.py @@ -5,7 +5,6 @@ from __future__ import annotations import time from typing import TYPE_CHECKING, Protocol, cast -from noteflow.application.services.export_service import ExportFormat as ApplicationExportFormat from noteflow.domain.entities import ( Annotation, Meeting, @@ -18,8 +17,7 @@ from noteflow.domain.entities import ( Summary, WordTiming, ) -from noteflow.domain.value_objects import AnnotationType, MeetingId -from noteflow.domain.value_objects import ExportFormat as DomainExportFormat +from noteflow.domain.value_objects import AnnotationType, ExportFormat, MeetingId from noteflow.infrastructure.converters import AsrConverter from ...proto import noteflow_pb2 @@ -324,25 +322,23 @@ def create_segment_from_asr( ) -def proto_to_export_format(proto_format: int) -> ApplicationExportFormat: - """Convert protobuf ExportFormat to application ExportFormat.""" +def proto_to_export_format(proto_format: int) -> ExportFormat: + """Convert protobuf ExportFormat to domain ExportFormat.""" if proto_format == noteflow_pb2.EXPORT_FORMAT_HTML: - return ApplicationExportFormat.HTML + return ExportFormat.HTML if proto_format == noteflow_pb2.EXPORT_FORMAT_PDF: - return ApplicationExportFormat.PDF - return ApplicationExportFormat.MARKDOWN # Default to Markdown + return ExportFormat.PDF + return ExportFormat.MARKDOWN # Default to Markdown -def export_format_to_proto(fmt: DomainExportFormat | ApplicationExportFormat) -> int: - """Convert domain or application ExportFormat to proto enum.""" - # Both enums have the same values, so we can use either - format_value = fmt.value if hasattr(fmt, "value") else str(fmt) +def export_format_to_proto(fmt: ExportFormat) -> int: + """Convert domain ExportFormat to proto enum.""" mapping: dict[str, int] = { "markdown": noteflow_pb2.EXPORT_FORMAT_MARKDOWN, "html": noteflow_pb2.EXPORT_FORMAT_HTML, "pdf": noteflow_pb2.EXPORT_FORMAT_PDF, } - return mapping.get(format_value, noteflow_pb2.EXPORT_FORMAT_UNSPECIFIED) + return mapping.get(fmt.value, noteflow_pb2.EXPORT_FORMAT_UNSPECIFIED) class _Copyable(Protocol): diff --git a/src/noteflow/grpc/_mixins/hf_token.py b/src/noteflow/grpc/_mixins/hf_token.py new file mode 100644 index 0000000..1401a75 --- /dev/null +++ b/src/noteflow/grpc/_mixins/hf_token.py @@ -0,0 +1,134 @@ +"""HuggingFace token management mixin for gRPC service. + +Provides secure storage, validation, and retrieval of HuggingFace +API tokens used for accessing gated models like pyannote. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +from noteflow.infrastructure.logging import get_logger + +from ..proto import noteflow_pb2 +from ._types import GrpcContext + +if TYPE_CHECKING: + from noteflow.application.services.hf_token_service import HfTokenService + +logger = get_logger(__name__) + + +class HfTokenMixin: + """Mixin providing HuggingFace token management functionality. + + Requires host to have: + - hf_token_service: HfTokenService | None + """ + + # Protocol requirements (declared for type checking) + hf_token_service: HfTokenService | None + + async def SetHuggingFaceToken( + self, + request: noteflow_pb2.SetHuggingFaceTokenRequest, + context: GrpcContext, + ) -> noteflow_pb2.SetHuggingFaceTokenResponse: + """Set and optionally validate a HuggingFace API token. + + The token is encrypted before storage. If validation is requested, + the token is verified against the HuggingFace API before saving. + """ + if self.hf_token_service is None: + return noteflow_pb2.SetHuggingFaceTokenResponse( + success=False, + validation_error="HuggingFace token service is not available", + ) + + if not request.token: + return noteflow_pb2.SetHuggingFaceTokenResponse( + success=False, + validation_error="Token cannot be empty", + ) + + success, validation_result = await self.hf_token_service.set_token( + token=request.token, + validate=request.validate, + ) + + response = noteflow_pb2.SetHuggingFaceTokenResponse(success=success) + + if validation_result is not None: + response.valid = validation_result.valid + response.username = validation_result.username + if not validation_result.valid: + response.validation_error = validation_result.error_message + + return response + + async def GetHuggingFaceTokenStatus( + self, + request: noteflow_pb2.GetHuggingFaceTokenStatusRequest, + context: GrpcContext, + ) -> noteflow_pb2.GetHuggingFaceTokenStatusResponse: + """Get the current status of the HuggingFace token. + + Returns whether a token is configured and validated, along with + the associated username and validation timestamp. + """ + if self.hf_token_service is None: + return noteflow_pb2.GetHuggingFaceTokenStatusResponse( + is_configured=False, + is_validated=False, + username="", + validated_at=0.0, + ) + + status = await self.hf_token_service.get_status() + + return noteflow_pb2.GetHuggingFaceTokenStatusResponse( + is_configured=status.is_configured, + is_validated=status.is_validated, + username=status.username, + validated_at=status.validated_at or 0.0, + ) + + async def DeleteHuggingFaceToken( + self, + request: noteflow_pb2.DeleteHuggingFaceTokenRequest, + context: GrpcContext, + ) -> noteflow_pb2.DeleteHuggingFaceTokenResponse: + """Delete the stored HuggingFace token. + + Removes both the encrypted token and its metadata from storage. + """ + if self.hf_token_service is None: + return noteflow_pb2.DeleteHuggingFaceTokenResponse(success=False) + + success = await self.hf_token_service.delete_token() + return noteflow_pb2.DeleteHuggingFaceTokenResponse(success=success) + + async def ValidateHuggingFaceToken( + self, + request: noteflow_pb2.ValidateHuggingFaceTokenRequest, + context: GrpcContext, + ) -> noteflow_pb2.ValidateHuggingFaceTokenResponse: + """Validate the currently stored HuggingFace token. + + Tests the stored token against the HuggingFace API and updates + the validation status in storage. + """ + if self.hf_token_service is None: + return noteflow_pb2.ValidateHuggingFaceTokenResponse( + valid=False, + username="", + error_message="HuggingFace token service is not available", + ) + + result = await self.hf_token_service.validate_stored_token() + + return noteflow_pb2.ValidateHuggingFaceTokenResponse( + valid=result.valid, + username=result.username, + error_message=result.error_message, + ) diff --git a/src/noteflow/grpc/proto/noteflow.proto b/src/noteflow/grpc/proto/noteflow.proto index a10ca3e..0f4e258 100644 --- a/src/noteflow/grpc/proto/noteflow.proto +++ b/src/noteflow/grpc/proto/noteflow.proto @@ -52,6 +52,11 @@ service NoteFlowService { // Server health and capabilities rpc GetServerInfo(ServerInfoRequest) returns (ServerInfo); + // ASR Configuration Management (Sprint 19) + rpc GetAsrConfiguration(GetAsrConfigurationRequest) returns (GetAsrConfigurationResponse); + rpc UpdateAsrConfiguration(UpdateAsrConfigurationRequest) returns (UpdateAsrConfigurationResponse); + rpc GetAsrConfigurationJobStatus(GetAsrConfigurationJobStatusRequest) returns (AsrConfigurationJobStatus); + // Named entity extraction (Sprint 4) + mutations (Sprint 8) rpc ExtractEntities(ExtractEntitiesRequest) returns (ExtractEntitiesResponse); rpc UpdateEntity(UpdateEntityRequest) returns (UpdateEntityResponse); @@ -79,6 +84,12 @@ service NoteFlowService { rpc RevokeCloudConsent(RevokeCloudConsentRequest) returns (RevokeCloudConsentResponse); rpc GetCloudConsentStatus(GetCloudConsentStatusRequest) returns (GetCloudConsentStatusResponse); + // HuggingFace Token Management (Sprint 19) + rpc SetHuggingFaceToken(SetHuggingFaceTokenRequest) returns (SetHuggingFaceTokenResponse); + rpc GetHuggingFaceTokenStatus(GetHuggingFaceTokenStatusRequest) returns (GetHuggingFaceTokenStatusResponse); + rpc DeleteHuggingFaceToken(DeleteHuggingFaceTokenRequest) returns (DeleteHuggingFaceTokenResponse); + rpc ValidateHuggingFaceToken(ValidateHuggingFaceTokenRequest) returns (ValidateHuggingFaceTokenResponse); + // User preferences sync (Sprint 14) rpc GetPreferences(GetPreferencesRequest) returns (GetPreferencesResponse); rpc SetPreferences(SetPreferencesRequest) returns (SetPreferencesResponse); @@ -613,6 +624,103 @@ message ServerInfo { int64 state_version = 10; } +// ============================================================================= +// ASR Configuration Messages (Sprint 19) +// ============================================================================= + +// Valid ASR devices +enum AsrDevice { + ASR_DEVICE_UNSPECIFIED = 0; + ASR_DEVICE_CPU = 1; + ASR_DEVICE_CUDA = 2; +} + +// Valid ASR compute types +enum AsrComputeType { + ASR_COMPUTE_TYPE_UNSPECIFIED = 0; + ASR_COMPUTE_TYPE_INT8 = 1; + ASR_COMPUTE_TYPE_FLOAT16 = 2; + ASR_COMPUTE_TYPE_FLOAT32 = 3; +} + +// Current ASR configuration and capabilities +message AsrConfiguration { + // Currently loaded model size (e.g., "base", "small", "medium") + string model_size = 1; + + // Current device in use + AsrDevice device = 2; + + // Current compute type + AsrComputeType compute_type = 3; + + // Whether ASR engine is ready for transcription + bool is_ready = 4; + + // Whether CUDA is available on this server + bool cuda_available = 5; + + // Available model sizes that can be loaded + repeated string available_model_sizes = 6; + + // Available compute types for current device + repeated AsrComputeType available_compute_types = 7; +} + +message GetAsrConfigurationRequest {} + +message GetAsrConfigurationResponse { + AsrConfiguration configuration = 1; +} + +message UpdateAsrConfigurationRequest { + // New model size to load (optional, keeps current if empty) + optional string model_size = 1; + + // New device (optional, keeps current if unspecified) + optional AsrDevice device = 2; + + // New compute type (optional, keeps current if unspecified) + optional AsrComputeType compute_type = 3; +} + +message UpdateAsrConfigurationResponse { + // Background job identifier for tracking reload progress + string job_id = 1; + + // Initial status (always QUEUED or RUNNING) + JobStatus status = 2; + + // Error message if validation failed before job creation + string error_message = 3; + + // Whether the request was accepted (false if active recording) + bool accepted = 4; +} + +message GetAsrConfigurationJobStatusRequest { + string job_id = 1; +} + +message AsrConfigurationJobStatus { + string job_id = 1; + + // Current status + JobStatus status = 2; + + // Progress percentage (0.0-100.0), primarily for model download + float progress_percent = 3; + + // Current phase: "validating", "downloading", "loading", "completed" + string phase = 4; + + // Error message if failed + string error_message = 5; + + // New configuration after successful reload + optional AsrConfiguration new_configuration = 6; +} + // ============================================================================= // Annotation Messages // ============================================================================= @@ -1309,6 +1417,62 @@ message GetCloudConsentStatusResponse { bool consent_granted = 1; } +// ============================================================================= +// HuggingFace Token Management Messages (Sprint 19) +// ============================================================================= + +message SetHuggingFaceTokenRequest { + // HuggingFace access token (will be encrypted at rest) + string token = 1; + + // Whether to validate token against HuggingFace API + bool validate = 2; +} + +message SetHuggingFaceTokenResponse { + // Whether the token was saved successfully + bool success = 1; + + // Whether the token passed validation (if validate=true) + optional bool valid = 2; + + // Validation error message if valid=false + string validation_error = 3; + + // HuggingFace username associated with token (if validate=true and valid) + string username = 4; +} + +message GetHuggingFaceTokenStatusRequest {} + +message GetHuggingFaceTokenStatusResponse { + // Whether a token is configured + bool is_configured = 1; + + // Whether the token has been validated + bool is_validated = 2; + + // HuggingFace username (if validated) + string username = 3; + + // Last validation timestamp (Unix epoch seconds) + double validated_at = 4; +} + +message DeleteHuggingFaceTokenRequest {} + +message DeleteHuggingFaceTokenResponse { + bool success = 1; +} + +message ValidateHuggingFaceTokenRequest {} + +message ValidateHuggingFaceTokenResponse { + bool valid = 1; + string username = 2; + string error_message = 3; +} + // ============================================================================= // User Preferences Sync Messages (Sprint 14) // ============================================================================= diff --git a/src/noteflow/grpc/proto/noteflow_pb2.py b/src/noteflow/grpc/proto/noteflow_pb2.py index 5d89871..f15f82b 100644 --- a/src/noteflow/grpc/proto/noteflow_pb2.py +++ b/src/noteflow/grpc/proto/noteflow_pb2.py @@ -24,7 +24,7 @@ _sym_db = _symbol_database.Default() -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0enoteflow.proto\x12\x08noteflow\"\x86\x01\n\nAudioChunk\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x12\n\naudio_data\x18\x02 \x01(\x0c\x12\x11\n\ttimestamp\x18\x03 \x01(\x01\x12\x13\n\x0bsample_rate\x18\x04 \x01(\x05\x12\x10\n\x08\x63hannels\x18\x05 \x01(\x05\x12\x16\n\x0e\x63hunk_sequence\x18\x06 \x01(\x03\"`\n\x0e\x43ongestionInfo\x12\x1b\n\x13processing_delay_ms\x18\x01 \x01(\x05\x12\x13\n\x0bqueue_depth\x18\x02 \x01(\x05\x12\x1c\n\x14throttle_recommended\x18\x03 \x01(\x08\"\x98\x02\n\x10TranscriptUpdate\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12)\n\x0bupdate_type\x18\x02 \x01(\x0e\x32\x14.noteflow.UpdateType\x12\x14\n\x0cpartial_text\x18\x03 \x01(\t\x12\'\n\x07segment\x18\x04 \x01(\x0b\x32\x16.noteflow.FinalSegment\x12\x18\n\x10server_timestamp\x18\x05 \x01(\x01\x12\x19\n\x0c\x61\x63k_sequence\x18\x06 \x01(\x03H\x00\x88\x01\x01\x12\x31\n\ncongestion\x18\n \x01(\x0b\x32\x18.noteflow.CongestionInfoH\x01\x88\x01\x01\x42\x0f\n\r_ack_sequenceB\r\n\x0b_congestion\"\x87\x02\n\x0c\x46inalSegment\x12\x12\n\nsegment_id\x18\x01 \x01(\x05\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\x01\x12#\n\x05words\x18\x05 \x03(\x0b\x32\x14.noteflow.WordTiming\x12\x10\n\x08language\x18\x06 \x01(\t\x12\x1b\n\x13language_confidence\x18\x07 \x01(\x02\x12\x13\n\x0b\x61vg_logprob\x18\x08 \x01(\x02\x12\x16\n\x0eno_speech_prob\x18\t \x01(\x02\x12\x12\n\nspeaker_id\x18\n \x01(\t\x12\x1a\n\x12speaker_confidence\x18\x0b \x01(\x02\"U\n\nWordTiming\x12\x0c\n\x04word\x18\x01 \x01(\t\x12\x12\n\nstart_time\x18\x02 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x03 \x01(\x01\x12\x13\n\x0bprobability\x18\x04 \x01(\x02\"\xb0\x03\n\x07Meeting\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12%\n\x05state\x18\x03 \x01(\x0e\x32\x16.noteflow.MeetingState\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\x12\n\nstarted_at\x18\x05 \x01(\x01\x12\x10\n\x08\x65nded_at\x18\x06 \x01(\x01\x12\x18\n\x10\x64uration_seconds\x18\x07 \x01(\x01\x12(\n\x08segments\x18\x08 \x03(\x0b\x32\x16.noteflow.FinalSegment\x12\"\n\x07summary\x18\t \x01(\x0b\x32\x11.noteflow.Summary\x12\x31\n\x08metadata\x18\n \x03(\x0b\x32\x1f.noteflow.Meeting.MetadataEntry\x12\x17\n\nproject_id\x18\x0b \x01(\tH\x00\x88\x01\x01\x12\x35\n\x11processing_status\x18\x0c \x01(\x0b\x32\x1a.noteflow.ProcessingStatus\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\r\n\x0b_project_id\"\xbe\x01\n\x14\x43reateMeetingRequest\x12\r\n\x05title\x18\x01 \x01(\t\x12>\n\x08metadata\x18\x02 \x03(\x0b\x32,.noteflow.CreateMeetingRequest.MetadataEntry\x12\x17\n\nproject_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\r\n\x0b_project_id\"(\n\x12StopMeetingRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\"\xc2\x01\n\x13ListMeetingsRequest\x12&\n\x06states\x18\x01 \x03(\x0e\x32\x16.noteflow.MeetingState\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\'\n\nsort_order\x18\x04 \x01(\x0e\x32\x13.noteflow.SortOrder\x12\x17\n\nproject_id\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x0bproject_ids\x18\x06 \x03(\tB\r\n\x0b_project_id\"P\n\x14ListMeetingsResponse\x12#\n\x08meetings\x18\x01 \x03(\x0b\x32\x11.noteflow.Meeting\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"Z\n\x11GetMeetingRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x18\n\x10include_segments\x18\x02 \x01(\x08\x12\x17\n\x0finclude_summary\x18\x03 \x01(\x08\"*\n\x14\x44\x65leteMeetingRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\"(\n\x15\x44\x65leteMeetingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xb9\x01\n\x07Summary\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x19\n\x11\x65xecutive_summary\x18\x02 \x01(\t\x12&\n\nkey_points\x18\x03 \x03(\x0b\x32\x12.noteflow.KeyPoint\x12*\n\x0c\x61\x63tion_items\x18\x04 \x03(\x0b\x32\x14.noteflow.ActionItem\x12\x14\n\x0cgenerated_at\x18\x05 \x01(\x01\x12\x15\n\rmodel_version\x18\x06 \x01(\t\"S\n\x08KeyPoint\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x13\n\x0bsegment_ids\x18\x02 \x03(\x05\x12\x12\n\nstart_time\x18\x03 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\x01\"y\n\nActionItem\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x10\n\x08\x61ssignee\x18\x02 \x01(\t\x12\x10\n\x08\x64ue_date\x18\x03 \x01(\x01\x12$\n\x08priority\x18\x04 \x01(\x0e\x32\x12.noteflow.Priority\x12\x13\n\x0bsegment_ids\x18\x05 \x03(\x05\"\\\n\x14SummarizationOptions\x12\x0c\n\x04tone\x18\x01 \x01(\t\x12\x0e\n\x06\x66ormat\x18\x02 \x01(\t\x12\x11\n\tverbosity\x18\x03 \x01(\t\x12\x13\n\x0btemplate_id\x18\x04 \x01(\t\"w\n\x16GenerateSummaryRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x18\n\x10\x66orce_regenerate\x18\x02 \x01(\x08\x12/\n\x07options\x18\x03 \x01(\x0b\x32\x1e.noteflow.SummarizationOptions\"\xe4\x02\n\x1aSummarizationTemplateProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x19\n\x0cworkspace_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x11\n\tis_system\x18\x05 \x01(\x08\x12\x13\n\x0bis_archived\x18\x06 \x01(\x08\x12\x1f\n\x12\x63urrent_version_id\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x08 \x01(\x03\x12\x12\n\nupdated_at\x18\t \x01(\x03\x12\x17\n\ncreated_by\x18\n \x01(\tH\x03\x88\x01\x01\x12\x17\n\nupdated_by\x18\x0b \x01(\tH\x04\x88\x01\x01\x42\x0f\n\r_workspace_idB\x0e\n\x0c_descriptionB\x15\n\x13_current_version_idB\r\n\x0b_created_byB\r\n\x0b_updated_by\"\xd3\x01\n!SummarizationTemplateVersionProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0btemplate_id\x18\x02 \x01(\t\x12\x16\n\x0eversion_number\x18\x03 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x04 \x01(\t\x12\x18\n\x0b\x63hange_note\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x03\x12\x17\n\ncreated_by\x18\x07 \x01(\tH\x01\x88\x01\x01\x42\x0e\n\x0c_change_noteB\r\n\x0b_created_by\"\x8a\x01\n!ListSummarizationTemplatesRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x16\n\x0einclude_system\x18\x02 \x01(\x08\x12\x18\n\x10include_archived\x18\x03 \x01(\x08\x12\r\n\x05limit\x18\x04 \x01(\x05\x12\x0e\n\x06offset\x18\x05 \x01(\x05\"r\n\"ListSummarizationTemplatesResponse\x12\x37\n\ttemplates\x18\x01 \x03(\x0b\x32$.noteflow.SummarizationTemplateProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"W\n\x1fGetSummarizationTemplateRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\x1f\n\x17include_current_version\x18\x02 \x01(\x08\"\xb9\x01\n GetSummarizationTemplateResponse\x12\x36\n\x08template\x18\x01 \x01(\x0b\x32$.noteflow.SummarizationTemplateProto\x12I\n\x0f\x63urrent_version\x18\x02 \x01(\x0b\x32+.noteflow.SummarizationTemplateVersionProtoH\x00\x88\x01\x01\x42\x12\n\x10_current_version\"\xae\x01\n%SummarizationTemplateMutationResponse\x12\x36\n\x08template\x18\x01 \x01(\x0b\x32$.noteflow.SummarizationTemplateProto\x12\x41\n\x07version\x18\x02 \x01(\x0b\x32+.noteflow.SummarizationTemplateVersionProtoH\x00\x88\x01\x01\x42\n\n\x08_version\"\xad\x01\n\"CreateSummarizationTemplateRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x63ontent\x18\x04 \x01(\t\x12\x18\n\x0b\x63hange_note\x18\x05 \x01(\tH\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_change_note\"\xcb\x01\n\"UpdateSummarizationTemplateRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07\x63ontent\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63hange_note\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_descriptionB\n\n\x08_contentB\x0e\n\x0c_change_note\":\n#ArchiveSummarizationTemplateRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\"^\n(ListSummarizationTemplateVersionsRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\"\x7f\n)ListSummarizationTemplateVersionsResponse\x12=\n\x08versions\x18\x01 \x03(\x0b\x32+.noteflow.SummarizationTemplateVersionProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"U\n*RestoreSummarizationTemplateVersionRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\x12\n\nversion_id\x18\x02 \x01(\t\"\x13\n\x11ServerInfoRequest\"\xfb\x01\n\nServerInfo\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tasr_model\x18\x02 \x01(\t\x12\x11\n\tasr_ready\x18\x03 \x01(\x08\x12\x1e\n\x16supported_sample_rates\x18\x04 \x03(\x05\x12\x16\n\x0emax_chunk_size\x18\x05 \x01(\x05\x12\x16\n\x0euptime_seconds\x18\x06 \x01(\x01\x12\x17\n\x0f\x61\x63tive_meetings\x18\x07 \x01(\x05\x12\x1b\n\x13\x64iarization_enabled\x18\x08 \x01(\x08\x12\x19\n\x11\x64iarization_ready\x18\t \x01(\x08\x12\x15\n\rstate_version\x18\n \x01(\x03\"\xbc\x01\n\nAnnotation\x12\n\n\x02id\x18\x01 \x01(\t\x12\x12\n\nmeeting_id\x18\x02 \x01(\t\x12\x31\n\x0f\x61nnotation_type\x18\x03 \x01(\x0e\x32\x18.noteflow.AnnotationType\x12\x0c\n\x04text\x18\x04 \x01(\t\x12\x12\n\nstart_time\x18\x05 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x06 \x01(\x01\x12\x13\n\x0bsegment_ids\x18\x07 \x03(\x05\x12\x12\n\ncreated_at\x18\x08 \x01(\x01\"\xa6\x01\n\x14\x41\x64\x64\x41nnotationRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x31\n\x0f\x61nnotation_type\x18\x02 \x01(\x0e\x32\x18.noteflow.AnnotationType\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x12\n\nstart_time\x18\x04 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x05 \x01(\x01\x12\x13\n\x0bsegment_ids\x18\x06 \x03(\x05\"-\n\x14GetAnnotationRequest\x12\x15\n\rannotation_id\x18\x01 \x01(\t\"R\n\x16ListAnnotationsRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x12\n\nstart_time\x18\x02 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x03 \x01(\x01\"D\n\x17ListAnnotationsResponse\x12)\n\x0b\x61nnotations\x18\x01 \x03(\x0b\x32\x14.noteflow.Annotation\"\xac\x01\n\x17UpdateAnnotationRequest\x12\x15\n\rannotation_id\x18\x01 \x01(\t\x12\x31\n\x0f\x61nnotation_type\x18\x02 \x01(\x0e\x32\x18.noteflow.AnnotationType\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x12\n\nstart_time\x18\x04 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x05 \x01(\x01\x12\x13\n\x0bsegment_ids\x18\x06 \x03(\x05\"0\n\x17\x44\x65leteAnnotationRequest\x12\x15\n\rannotation_id\x18\x01 \x01(\t\"+\n\x18\x44\x65leteAnnotationResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\x86\x01\n\x13ProcessingStepState\x12.\n\x06status\x18\x01 \x01(\x0e\x32\x1e.noteflow.ProcessingStepStatus\x12\x15\n\rerror_message\x18\x02 \x01(\t\x12\x12\n\nstarted_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x63ompleted_at\x18\x04 \x01(\x01\"\xa7\x01\n\x10ProcessingStatus\x12.\n\x07summary\x18\x01 \x01(\x0b\x32\x1d.noteflow.ProcessingStepState\x12/\n\x08\x65ntities\x18\x02 \x01(\x0b\x32\x1d.noteflow.ProcessingStepState\x12\x32\n\x0b\x64iarization\x18\x03 \x01(\x0b\x32\x1d.noteflow.ProcessingStepState\"U\n\x17\x45xportTranscriptRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12&\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x16.noteflow.ExportFormat\"X\n\x18\x45xportTranscriptResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66ormat_name\x18\x02 \x01(\t\x12\x16\n\x0e\x66ile_extension\x18\x03 \x01(\t\"K\n\x1fRefineSpeakerDiarizationRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x14\n\x0cnum_speakers\x18\x02 \x01(\x05\"\x9d\x01\n RefineSpeakerDiarizationResponse\x12\x18\n\x10segments_updated\x18\x01 \x01(\x05\x12\x13\n\x0bspeaker_ids\x18\x02 \x03(\t\x12\x15\n\rerror_message\x18\x03 \x01(\t\x12\x0e\n\x06job_id\x18\x04 \x01(\t\x12#\n\x06status\x18\x05 \x01(\x0e\x32\x13.noteflow.JobStatus\"\\\n\x14RenameSpeakerRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x16\n\x0eold_speaker_id\x18\x02 \x01(\t\x12\x18\n\x10new_speaker_name\x18\x03 \x01(\t\"B\n\x15RenameSpeakerResponse\x12\x18\n\x10segments_updated\x18\x01 \x01(\x05\x12\x0f\n\x07success\x18\x02 \x01(\x08\"0\n\x1eGetDiarizationJobStatusRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\t\"\xab\x01\n\x14\x44iarizationJobStatus\x12\x0e\n\x06job_id\x18\x01 \x01(\t\x12#\n\x06status\x18\x02 \x01(\x0e\x32\x13.noteflow.JobStatus\x12\x18\n\x10segments_updated\x18\x03 \x01(\x05\x12\x13\n\x0bspeaker_ids\x18\x04 \x03(\t\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x18\n\x10progress_percent\x18\x06 \x01(\x02\"-\n\x1b\x43\x61ncelDiarizationJobRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\t\"k\n\x1c\x43\x61ncelDiarizationJobResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\x12#\n\x06status\x18\x03 \x01(\x0e\x32\x13.noteflow.JobStatus\"!\n\x1fGetActiveDiarizationJobsRequest\"P\n GetActiveDiarizationJobsResponse\x12,\n\x04jobs\x18\x01 \x03(\x0b\x32\x1e.noteflow.DiarizationJobStatus\"C\n\x16\x45xtractEntitiesRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x15\n\rforce_refresh\x18\x02 \x01(\x08\"y\n\x0f\x45xtractedEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x13\n\x0bsegment_ids\x18\x04 \x03(\x05\x12\x12\n\nconfidence\x18\x05 \x01(\x02\x12\x11\n\tis_pinned\x18\x06 \x01(\x08\"k\n\x17\x45xtractEntitiesResponse\x12+\n\x08\x65ntities\x18\x01 \x03(\x0b\x32\x19.noteflow.ExtractedEntity\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\x12\x0e\n\x06\x63\x61\x63hed\x18\x03 \x01(\x08\"\\\n\x13UpdateEntityRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x11\n\tentity_id\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x04 \x01(\t\"A\n\x14UpdateEntityResponse\x12)\n\x06\x65ntity\x18\x01 \x01(\x0b\x32\x19.noteflow.ExtractedEntity\"<\n\x13\x44\x65leteEntityRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x11\n\tentity_id\x18\x02 \x01(\t\"\'\n\x14\x44\x65leteEntityResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xc7\x01\n\rCalendarEvent\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x03\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\x03\x12\x11\n\tattendees\x18\x05 \x03(\t\x12\x10\n\x08location\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x13\n\x0bmeeting_url\x18\x08 \x01(\t\x12\x14\n\x0cis_recurring\x18\t \x01(\x08\x12\x10\n\x08provider\x18\n \x01(\t\"Q\n\x19ListCalendarEventsRequest\x12\x13\n\x0bhours_ahead\x18\x01 \x01(\x05\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x10\n\x08provider\x18\x03 \x01(\t\"Z\n\x1aListCalendarEventsResponse\x12\'\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x17.noteflow.CalendarEvent\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x1d\n\x1bGetCalendarProvidersRequest\"P\n\x10\x43\x61lendarProvider\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10is_authenticated\x18\x02 \x01(\x08\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\"M\n\x1cGetCalendarProvidersResponse\x12-\n\tproviders\x18\x01 \x03(\x0b\x32\x1a.noteflow.CalendarProvider\"X\n\x14InitiateOAuthRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x14\n\x0credirect_uri\x18\x02 \x01(\t\x12\x18\n\x10integration_type\x18\x03 \x01(\t\"8\n\x15InitiateOAuthResponse\x12\x10\n\x08\x61uth_url\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\t\"E\n\x14\x43ompleteOAuthRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\t\"o\n\x15\x43ompleteOAuthResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\x12\x16\n\x0eprovider_email\x18\x03 \x01(\t\x12\x16\n\x0eintegration_id\x18\x04 \x01(\t\"\x87\x01\n\x0fOAuthConnection\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\r\n\x05\x65mail\x18\x03 \x01(\t\x12\x12\n\nexpires_at\x18\x04 \x01(\x03\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x18\n\x10integration_type\x18\x06 \x01(\t\"M\n\x1fGetOAuthConnectionStatusRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x18\n\x10integration_type\x18\x02 \x01(\t\"Q\n GetOAuthConnectionStatusResponse\x12-\n\nconnection\x18\x01 \x01(\x0b\x32\x19.noteflow.OAuthConnection\"D\n\x16\x44isconnectOAuthRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x18\n\x10integration_type\x18\x02 \x01(\t\"A\n\x17\x44isconnectOAuthResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\"\x92\x01\n\x16RegisterWebhookRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06secret\x18\x05 \x01(\t\x12\x12\n\ntimeout_ms\x18\x06 \x01(\x05\x12\x13\n\x0bmax_retries\x18\x07 \x01(\x05\"\xc3\x01\n\x12WebhookConfigProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\x0e\n\x06\x65vents\x18\x05 \x03(\t\x12\x0f\n\x07\x65nabled\x18\x06 \x01(\x08\x12\x12\n\ntimeout_ms\x18\x07 \x01(\x05\x12\x13\n\x0bmax_retries\x18\x08 \x01(\x05\x12\x12\n\ncreated_at\x18\t \x01(\x03\x12\x12\n\nupdated_at\x18\n \x01(\x03\"+\n\x13ListWebhooksRequest\x12\x14\n\x0c\x65nabled_only\x18\x01 \x01(\x08\"[\n\x14ListWebhooksResponse\x12.\n\x08webhooks\x18\x01 \x03(\x0b\x32\x1c.noteflow.WebhookConfigProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x84\x02\n\x14UpdateWebhookRequest\x12\x12\n\nwebhook_id\x18\x01 \x01(\t\x12\x10\n\x03url\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x11\n\x04name\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06secret\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07\x65nabled\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x17\n\ntimeout_ms\x18\x07 \x01(\x05H\x04\x88\x01\x01\x12\x18\n\x0bmax_retries\x18\x08 \x01(\x05H\x05\x88\x01\x01\x42\x06\n\x04_urlB\x07\n\x05_nameB\t\n\x07_secretB\n\n\x08_enabledB\r\n\x0b_timeout_msB\x0e\n\x0c_max_retries\"*\n\x14\x44\x65leteWebhookRequest\x12\x12\n\nwebhook_id\x18\x01 \x01(\t\"(\n\x15\x44\x65leteWebhookResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xcb\x01\n\x14WebhookDeliveryProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x12\n\nwebhook_id\x18\x02 \x01(\t\x12\x12\n\nevent_type\x18\x03 \x01(\t\x12\x13\n\x0bstatus_code\x18\x04 \x01(\x05\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x15\n\rattempt_count\x18\x06 \x01(\x05\x12\x13\n\x0b\x64uration_ms\x18\x07 \x01(\x05\x12\x14\n\x0c\x64\x65livered_at\x18\x08 \x01(\x03\x12\x11\n\tsucceeded\x18\t \x01(\x08\"@\n\x1bGetWebhookDeliveriesRequest\x12\x12\n\nwebhook_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\"g\n\x1cGetWebhookDeliveriesResponse\x12\x32\n\ndeliveries\x18\x01 \x03(\x0b\x32\x1e.noteflow.WebhookDeliveryProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x1a\n\x18GrantCloudConsentRequest\"\x1b\n\x19GrantCloudConsentResponse\"\x1b\n\x19RevokeCloudConsentRequest\"\x1c\n\x1aRevokeCloudConsentResponse\"\x1e\n\x1cGetCloudConsentStatusRequest\"8\n\x1dGetCloudConsentStatusResponse\x12\x17\n\x0f\x63onsent_granted\x18\x01 \x01(\x08\"%\n\x15GetPreferencesRequest\x12\x0c\n\x04keys\x18\x01 \x03(\t\"\xb6\x01\n\x16GetPreferencesResponse\x12\x46\n\x0bpreferences\x18\x01 \x03(\x0b\x32\x31.noteflow.GetPreferencesResponse.PreferencesEntry\x12\x12\n\nupdated_at\x18\x02 \x01(\x01\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x1a\x32\n\x10PreferencesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xce\x01\n\x15SetPreferencesRequest\x12\x45\n\x0bpreferences\x18\x01 \x03(\x0b\x32\x30.noteflow.SetPreferencesRequest.PreferencesEntry\x12\x10\n\x08if_match\x18\x02 \x01(\t\x12\x19\n\x11\x63lient_updated_at\x18\x03 \x01(\x01\x12\r\n\x05merge\x18\x04 \x01(\x08\x1a\x32\n\x10PreferencesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x8d\x02\n\x16SetPreferencesResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x10\n\x08\x63onflict\x18\x02 \x01(\x08\x12S\n\x12server_preferences\x18\x03 \x03(\x0b\x32\x37.noteflow.SetPreferencesResponse.ServerPreferencesEntry\x12\x19\n\x11server_updated_at\x18\x04 \x01(\x01\x12\x0c\n\x04\x65tag\x18\x05 \x01(\t\x12\x18\n\x10\x63onflict_message\x18\x06 \x01(\t\x1a\x38\n\x16ServerPreferencesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"5\n\x1bStartIntegrationSyncRequest\x12\x16\n\x0eintegration_id\x18\x01 \x01(\t\"C\n\x1cStartIntegrationSyncResponse\x12\x13\n\x0bsync_run_id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\"+\n\x14GetSyncStatusRequest\x12\x13\n\x0bsync_run_id\x18\x01 \x01(\t\"\xda\x01\n\x15GetSyncStatusResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x14\n\x0citems_synced\x18\x02 \x01(\x05\x12\x13\n\x0bitems_total\x18\x03 \x01(\x05\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x13\n\x0b\x64uration_ms\x18\x05 \x01(\x03\x12\x17\n\nexpires_at\x18\n \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10not_found_reason\x18\x0b \x01(\tH\x01\x88\x01\x01\x42\r\n\x0b_expires_atB\x13\n\x11_not_found_reason\"O\n\x16ListSyncHistoryRequest\x12\x16\n\x0eintegration_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\"T\n\x17ListSyncHistoryResponse\x12$\n\x04runs\x18\x01 \x03(\x0b\x32\x16.noteflow.SyncRunProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\xae\x01\n\x0cSyncRunProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0eintegration_id\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x14\n\x0citems_synced\x18\x04 \x01(\x05\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x13\n\x0b\x64uration_ms\x18\x06 \x01(\x03\x12\x12\n\nstarted_at\x18\x07 \x01(\t\x12\x14\n\x0c\x63ompleted_at\x18\x08 \x01(\t\"\x1c\n\x1aGetUserIntegrationsRequest\"_\n\x0fIntegrationInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x05 \x01(\t\"N\n\x1bGetUserIntegrationsResponse\x12/\n\x0cintegrations\x18\x01 \x03(\x0b\x32\x19.noteflow.IntegrationInfo\"D\n\x14GetRecentLogsRequest\x12\r\n\x05limit\x18\x01 \x01(\x05\x12\r\n\x05level\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\">\n\x15GetRecentLogsResponse\x12%\n\x04logs\x18\x01 \x03(\x0b\x32\x17.noteflow.LogEntryProto\"\x99\x02\n\rLogEntryProto\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\r\n\x05level\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x35\n\x07\x64\x65tails\x18\x05 \x03(\x0b\x32$.noteflow.LogEntryProto.DetailsEntry\x12\x10\n\x08trace_id\x18\x06 \x01(\t\x12\x0f\n\x07span_id\x18\x07 \x01(\t\x12\x12\n\nevent_type\x18\x08 \x01(\t\x12\x14\n\x0coperation_id\x18\t \x01(\t\x12\x11\n\tentity_id\x18\n \x01(\t\x1a.\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"5\n\x1cGetPerformanceMetricsRequest\x12\x15\n\rhistory_limit\x18\x01 \x01(\x05\"\x87\x01\n\x1dGetPerformanceMetricsResponse\x12\x32\n\x07\x63urrent\x18\x01 \x01(\x0b\x32!.noteflow.PerformanceMetricsPoint\x12\x32\n\x07history\x18\x02 \x03(\x0b\x32!.noteflow.PerformanceMetricsPoint\"\xf1\x01\n\x17PerformanceMetricsPoint\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\x12\x13\n\x0b\x63pu_percent\x18\x02 \x01(\x01\x12\x16\n\x0ememory_percent\x18\x03 \x01(\x01\x12\x11\n\tmemory_mb\x18\x04 \x01(\x01\x12\x14\n\x0c\x64isk_percent\x18\x05 \x01(\x01\x12\x1a\n\x12network_bytes_sent\x18\x06 \x01(\x03\x12\x1a\n\x12network_bytes_recv\x18\x07 \x01(\x03\x12\x19\n\x11process_memory_mb\x18\x08 \x01(\x01\x12\x1a\n\x12\x61\x63tive_connections\x18\t \x01(\x05\"\xd0\x02\n\x11\x43laimMappingProto\x12\x15\n\rsubject_claim\x18\x01 \x01(\t\x12\x13\n\x0b\x65mail_claim\x18\x02 \x01(\t\x12\x1c\n\x14\x65mail_verified_claim\x18\x03 \x01(\t\x12\x12\n\nname_claim\x18\x04 \x01(\t\x12 \n\x18preferred_username_claim\x18\x05 \x01(\t\x12\x14\n\x0cgroups_claim\x18\x06 \x01(\t\x12\x15\n\rpicture_claim\x18\x07 \x01(\t\x12\x1d\n\x10\x66irst_name_claim\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0flast_name_claim\x18\t \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bphone_claim\x18\n \x01(\tH\x02\x88\x01\x01\x42\x13\n\x11_first_name_claimB\x12\n\x10_last_name_claimB\x0e\n\x0c_phone_claim\"\xf7\x02\n\x12OidcDiscoveryProto\x12\x0e\n\x06issuer\x18\x01 \x01(\t\x12\x1e\n\x16\x61uthorization_endpoint\x18\x02 \x01(\t\x12\x16\n\x0etoken_endpoint\x18\x03 \x01(\t\x12\x1e\n\x11userinfo_endpoint\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08jwks_uri\x18\x05 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x65nd_session_endpoint\x18\x06 \x01(\tH\x02\x88\x01\x01\x12 \n\x13revocation_endpoint\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x10scopes_supported\x18\x08 \x03(\t\x12\x18\n\x10\x63laims_supported\x18\t \x03(\t\x12\x15\n\rsupports_pkce\x18\n \x01(\x08\x42\x14\n\x12_userinfo_endpointB\x0b\n\t_jwks_uriB\x17\n\x15_end_session_endpointB\x16\n\x14_revocation_endpoint\"\xc5\x03\n\x11OidcProviderProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06preset\x18\x04 \x01(\t\x12\x12\n\nissuer_url\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x0f\n\x07\x65nabled\x18\x07 \x01(\x08\x12\x34\n\tdiscovery\x18\x08 \x01(\x0b\x32\x1c.noteflow.OidcDiscoveryProtoH\x00\x88\x01\x01\x12\x32\n\rclaim_mapping\x18\t \x01(\x0b\x32\x1b.noteflow.ClaimMappingProto\x12\x0e\n\x06scopes\x18\n \x03(\t\x12\x1e\n\x16require_email_verified\x18\x0b \x01(\x08\x12\x16\n\x0e\x61llowed_groups\x18\x0c \x03(\t\x12\x12\n\ncreated_at\x18\r \x01(\x03\x12\x12\n\nupdated_at\x18\x0e \x01(\x03\x12#\n\x16\x64iscovery_refreshed_at\x18\x0f \x01(\x03H\x01\x88\x01\x01\x12\x10\n\x08warnings\x18\x10 \x03(\tB\x0c\n\n_discoveryB\x19\n\x17_discovery_refreshed_at\"\xf0\x02\n\x1bRegisterOidcProviderRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nissuer_url\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x1a\n\rclient_secret\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06preset\x18\x06 \x01(\t\x12\x0e\n\x06scopes\x18\x07 \x03(\t\x12\x37\n\rclaim_mapping\x18\x08 \x01(\x0b\x32\x1b.noteflow.ClaimMappingProtoH\x01\x88\x01\x01\x12\x16\n\x0e\x61llowed_groups\x18\t \x03(\t\x12#\n\x16require_email_verified\x18\n \x01(\x08H\x02\x88\x01\x01\x12\x15\n\rauto_discover\x18\x0b \x01(\x08\x42\x10\n\x0e_client_secretB\x10\n\x0e_claim_mappingB\x19\n\x17_require_email_verified\"\\\n\x18ListOidcProvidersRequest\x12\x19\n\x0cworkspace_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0c\x65nabled_only\x18\x02 \x01(\x08\x42\x0f\n\r_workspace_id\"`\n\x19ListOidcProvidersResponse\x12.\n\tproviders\x18\x01 \x03(\x0b\x32\x1b.noteflow.OidcProviderProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"-\n\x16GetOidcProviderRequest\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\"\xa1\x02\n\x19UpdateOidcProviderRequest\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06scopes\x18\x03 \x03(\t\x12\x37\n\rclaim_mapping\x18\x04 \x01(\x0b\x32\x1b.noteflow.ClaimMappingProtoH\x01\x88\x01\x01\x12\x16\n\x0e\x61llowed_groups\x18\x05 \x03(\t\x12#\n\x16require_email_verified\x18\x06 \x01(\x08H\x02\x88\x01\x01\x12\x14\n\x07\x65nabled\x18\x07 \x01(\x08H\x03\x88\x01\x01\x42\x07\n\x05_nameB\x10\n\x0e_claim_mappingB\x19\n\x17_require_email_verifiedB\n\n\x08_enabled\"0\n\x19\x44\x65leteOidcProviderRequest\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\"-\n\x1a\x44\x65leteOidcProviderResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"s\n\x1bRefreshOidcDiscoveryRequest\x12\x18\n\x0bprovider_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cworkspace_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x0e\n\x0c_provider_idB\x0f\n\r_workspace_id\"\xc2\x01\n\x1cRefreshOidcDiscoveryResponse\x12\x44\n\x07results\x18\x01 \x03(\x0b\x32\x33.noteflow.RefreshOidcDiscoveryResponse.ResultsEntry\x12\x15\n\rsuccess_count\x18\x02 \x01(\x05\x12\x15\n\rfailure_count\x18\x03 \x01(\x05\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x18\n\x16ListOidcPresetsRequest\"\xb8\x01\n\x0fOidcPresetProto\x12\x0e\n\x06preset\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x16\n\x0e\x64\x65\x66\x61ult_scopes\x18\x04 \x03(\t\x12\x1e\n\x11\x64ocumentation_url\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05notes\x18\x06 \x01(\tH\x01\x88\x01\x01\x42\x14\n\x12_documentation_urlB\x08\n\x06_notes\"E\n\x17ListOidcPresetsResponse\x12*\n\x07presets\x18\x01 \x03(\x0b\x32\x19.noteflow.OidcPresetProto\"\xea\x01\n\x10\x45xportRulesProto\x12\x33\n\x0e\x64\x65\x66\x61ult_format\x18\x01 \x01(\x0e\x32\x16.noteflow.ExportFormatH\x00\x88\x01\x01\x12\x1a\n\rinclude_audio\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12include_timestamps\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x18\n\x0btemplate_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x11\n\x0f_default_formatB\x10\n\x0e_include_audioB\x15\n\x13_include_timestampsB\x0e\n\x0c_template_id\"\x88\x01\n\x11TriggerRulesProto\x12\x1f\n\x12\x61uto_start_enabled\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1f\n\x17\x63\x61lendar_match_patterns\x18\x02 \x03(\t\x12\x1a\n\x12\x61pp_match_patterns\x18\x03 \x03(\tB\x15\n\x13_auto_start_enabled\"\xa5\x02\n\x16WorkspaceSettingsProto\x12\x35\n\x0c\x65xport_rules\x18\x01 \x01(\x0b\x32\x1a.noteflow.ExportRulesProtoH\x00\x88\x01\x01\x12\x37\n\rtrigger_rules\x18\x02 \x01(\x0b\x32\x1b.noteflow.TriggerRulesProtoH\x01\x88\x01\x01\x12\x18\n\x0brag_enabled\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12+\n\x1e\x64\x65\x66\x61ult_summarization_template\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0f\n\r_export_rulesB\x10\n\x0e_trigger_rulesB\x0e\n\x0c_rag_enabledB!\n\x1f_default_summarization_template\"\xa3\x02\n\x14ProjectSettingsProto\x12\x35\n\x0c\x65xport_rules\x18\x01 \x01(\x0b\x32\x1a.noteflow.ExportRulesProtoH\x00\x88\x01\x01\x12\x37\n\rtrigger_rules\x18\x02 \x01(\x0b\x32\x1b.noteflow.TriggerRulesProtoH\x01\x88\x01\x01\x12\x18\n\x0brag_enabled\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12+\n\x1e\x64\x65\x66\x61ult_summarization_template\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0f\n\r_export_rulesB\x10\n\x0e_trigger_rulesB\x0e\n\x0c_rag_enabledB!\n\x1f_default_summarization_template\"\xc3\x02\n\x0cProjectProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\x04slug\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x12\n\nis_default\x18\x06 \x01(\x08\x12\x13\n\x0bis_archived\x18\x07 \x01(\x08\x12\x35\n\x08settings\x18\x08 \x01(\x0b\x32\x1e.noteflow.ProjectSettingsProtoH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x03\x12\x12\n\nupdated_at\x18\n \x01(\x03\x12\x18\n\x0b\x61rchived_at\x18\x0b \x01(\x03H\x03\x88\x01\x01\x42\x07\n\x05_slugB\x0e\n\x0c_descriptionB\x0b\n\t_settingsB\x0e\n\x0c_archived_at\"z\n\x16ProjectMembershipProto\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12(\n\x04role\x18\x03 \x01(\x0e\x32\x1a.noteflow.ProjectRoleProto\x12\x11\n\tjoined_at\x18\x04 \x01(\x03\"\xc4\x01\n\x14\x43reateProjectRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\x04slug\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x35\n\x08settings\x18\x05 \x01(\x0b\x32\x1e.noteflow.ProjectSettingsProtoH\x02\x88\x01\x01\x42\x07\n\x05_slugB\x0e\n\x0c_descriptionB\x0b\n\t_settings\"\'\n\x11GetProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"=\n\x17GetProjectBySlugRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04slug\x18\x02 \x01(\t\"d\n\x13ListProjectsRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x18\n\x10include_archived\x18\x02 \x01(\x08\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\"U\n\x14ListProjectsResponse\x12(\n\x08projects\x18\x01 \x03(\x0b\x32\x16.noteflow.ProjectProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\xd0\x01\n\x14UpdateProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04slug\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x35\n\x08settings\x18\x05 \x01(\x0b\x32\x1e.noteflow.ProjectSettingsProtoH\x03\x88\x01\x01\x42\x07\n\x05_nameB\x07\n\x05_slugB\x0e\n\x0c_descriptionB\x0b\n\t_settings\"+\n\x15\x41rchiveProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"+\n\x15RestoreProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"*\n\x14\x44\x65leteProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"(\n\x15\x44\x65leteProjectResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"C\n\x17SetActiveProjectRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x12\n\nproject_id\x18\x02 \x01(\t\"\x1a\n\x18SetActiveProjectResponse\"/\n\x17GetActiveProjectRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\"k\n\x18GetActiveProjectResponse\x12\x17\n\nproject_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\'\n\x07project\x18\x02 \x01(\x0b\x32\x16.noteflow.ProjectProtoB\r\n\x0b_project_id\"h\n\x17\x41\x64\x64ProjectMemberRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12(\n\x04role\x18\x03 \x01(\x0e\x32\x1a.noteflow.ProjectRoleProto\"o\n\x1eUpdateProjectMemberRoleRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12(\n\x04role\x18\x03 \x01(\x0e\x32\x1a.noteflow.ProjectRoleProto\"A\n\x1aRemoveProjectMemberRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\".\n\x1bRemoveProjectMemberResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"N\n\x19ListProjectMembersRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\"d\n\x1aListProjectMembersResponse\x12\x31\n\x07members\x18\x01 \x03(\x0b\x32 .noteflow.ProjectMembershipProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x17\n\x15GetCurrentUserRequest\"\xbb\x01\n\x16GetCurrentUserResponse\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\x18\n\x10is_authenticated\x18\x05 \x01(\x08\x12\x15\n\rauth_provider\x18\x06 \x01(\t\x12\x16\n\x0eworkspace_name\x18\x07 \x01(\t\x12\x0c\n\x04role\x18\x08 \x01(\t\"Z\n\x0eWorkspaceProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04slug\x18\x03 \x01(\t\x12\x12\n\nis_default\x18\x04 \x01(\x08\x12\x0c\n\x04role\x18\x05 \x01(\t\"6\n\x15ListWorkspacesRequest\x12\r\n\x05limit\x18\x01 \x01(\x05\x12\x0e\n\x06offset\x18\x02 \x01(\x05\"[\n\x16ListWorkspacesResponse\x12,\n\nworkspaces\x18\x01 \x03(\x0b\x32\x18.noteflow.WorkspaceProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\".\n\x16SwitchWorkspaceRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\"n\n\x17SwitchWorkspaceResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12+\n\tworkspace\x18\x02 \x01(\x0b\x32\x18.noteflow.WorkspaceProto\x12\x15\n\rerror_message\x18\x03 \x01(\t\"3\n\x1bGetWorkspaceSettingsRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\"j\n\x1eUpdateWorkspaceSettingsRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x32\n\x08settings\x18\x02 \x01(\x0b\x32 .noteflow.WorkspaceSettingsProto*\x8d\x01\n\nUpdateType\x12\x1b\n\x17UPDATE_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13UPDATE_TYPE_PARTIAL\x10\x01\x12\x15\n\x11UPDATE_TYPE_FINAL\x10\x02\x12\x19\n\x15UPDATE_TYPE_VAD_START\x10\x03\x12\x17\n\x13UPDATE_TYPE_VAD_END\x10\x04*\xb6\x01\n\x0cMeetingState\x12\x1d\n\x19MEETING_STATE_UNSPECIFIED\x10\x00\x12\x19\n\x15MEETING_STATE_CREATED\x10\x01\x12\x1b\n\x17MEETING_STATE_RECORDING\x10\x02\x12\x19\n\x15MEETING_STATE_STOPPED\x10\x03\x12\x1b\n\x17MEETING_STATE_COMPLETED\x10\x04\x12\x17\n\x13MEETING_STATE_ERROR\x10\x05*`\n\tSortOrder\x12\x1a\n\x16SORT_ORDER_UNSPECIFIED\x10\x00\x12\x1b\n\x17SORT_ORDER_CREATED_DESC\x10\x01\x12\x1a\n\x16SORT_ORDER_CREATED_ASC\x10\x02*^\n\x08Priority\x12\x18\n\x14PRIORITY_UNSPECIFIED\x10\x00\x12\x10\n\x0cPRIORITY_LOW\x10\x01\x12\x13\n\x0fPRIORITY_MEDIUM\x10\x02\x12\x11\n\rPRIORITY_HIGH\x10\x03*\xa4\x01\n\x0e\x41nnotationType\x12\x1f\n\x1b\x41NNOTATION_TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x41NNOTATION_TYPE_ACTION_ITEM\x10\x01\x12\x1c\n\x18\x41NNOTATION_TYPE_DECISION\x10\x02\x12\x18\n\x14\x41NNOTATION_TYPE_NOTE\x10\x03\x12\x18\n\x14\x41NNOTATION_TYPE_RISK\x10\x04*x\n\x0c\x45xportFormat\x12\x1d\n\x19\x45XPORT_FORMAT_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x45XPORT_FORMAT_MARKDOWN\x10\x01\x12\x16\n\x12\x45XPORT_FORMAT_HTML\x10\x02\x12\x15\n\x11\x45XPORT_FORMAT_PDF\x10\x03*\xa1\x01\n\tJobStatus\x12\x1a\n\x16JOB_STATUS_UNSPECIFIED\x10\x00\x12\x15\n\x11JOB_STATUS_QUEUED\x10\x01\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x02\x12\x18\n\x14JOB_STATUS_COMPLETED\x10\x03\x12\x15\n\x11JOB_STATUS_FAILED\x10\x04\x12\x18\n\x14JOB_STATUS_CANCELLED\x10\x05*\xc9\x01\n\x14ProcessingStepStatus\x12\x1f\n\x1bPROCESSING_STEP_UNSPECIFIED\x10\x00\x12\x1b\n\x17PROCESSING_STEP_PENDING\x10\x01\x12\x1b\n\x17PROCESSING_STEP_RUNNING\x10\x02\x12\x1d\n\x19PROCESSING_STEP_COMPLETED\x10\x03\x12\x1a\n\x16PROCESSING_STEP_FAILED\x10\x04\x12\x1b\n\x17PROCESSING_STEP_SKIPPED\x10\x05*z\n\x10ProjectRoleProto\x12\x1c\n\x18PROJECT_ROLE_UNSPECIFIED\x10\x00\x12\x17\n\x13PROJECT_ROLE_VIEWER\x10\x01\x12\x17\n\x13PROJECT_ROLE_EDITOR\x10\x02\x12\x16\n\x12PROJECT_ROLE_ADMIN\x10\x03\x32\xe9\x36\n\x0fNoteFlowService\x12K\n\x13StreamTranscription\x12\x14.noteflow.AudioChunk\x1a\x1a.noteflow.TranscriptUpdate(\x01\x30\x01\x12\x42\n\rCreateMeeting\x12\x1e.noteflow.CreateMeetingRequest\x1a\x11.noteflow.Meeting\x12>\n\x0bStopMeeting\x12\x1c.noteflow.StopMeetingRequest\x1a\x11.noteflow.Meeting\x12M\n\x0cListMeetings\x12\x1d.noteflow.ListMeetingsRequest\x1a\x1e.noteflow.ListMeetingsResponse\x12<\n\nGetMeeting\x12\x1b.noteflow.GetMeetingRequest\x1a\x11.noteflow.Meeting\x12P\n\rDeleteMeeting\x12\x1e.noteflow.DeleteMeetingRequest\x1a\x1f.noteflow.DeleteMeetingResponse\x12\x46\n\x0fGenerateSummary\x12 .noteflow.GenerateSummaryRequest\x1a\x11.noteflow.Summary\x12w\n\x1aListSummarizationTemplates\x12+.noteflow.ListSummarizationTemplatesRequest\x1a,.noteflow.ListSummarizationTemplatesResponse\x12q\n\x18GetSummarizationTemplate\x12).noteflow.GetSummarizationTemplateRequest\x1a*.noteflow.GetSummarizationTemplateResponse\x12|\n\x1b\x43reateSummarizationTemplate\x12,.noteflow.CreateSummarizationTemplateRequest\x1a/.noteflow.SummarizationTemplateMutationResponse\x12|\n\x1bUpdateSummarizationTemplate\x12,.noteflow.UpdateSummarizationTemplateRequest\x1a/.noteflow.SummarizationTemplateMutationResponse\x12s\n\x1c\x41rchiveSummarizationTemplate\x12-.noteflow.ArchiveSummarizationTemplateRequest\x1a$.noteflow.SummarizationTemplateProto\x12\x8c\x01\n!ListSummarizationTemplateVersions\x12\x32.noteflow.ListSummarizationTemplateVersionsRequest\x1a\x33.noteflow.ListSummarizationTemplateVersionsResponse\x12\x81\x01\n#RestoreSummarizationTemplateVersion\x12\x34.noteflow.RestoreSummarizationTemplateVersionRequest\x1a$.noteflow.SummarizationTemplateProto\x12\x45\n\rAddAnnotation\x12\x1e.noteflow.AddAnnotationRequest\x1a\x14.noteflow.Annotation\x12\x45\n\rGetAnnotation\x12\x1e.noteflow.GetAnnotationRequest\x1a\x14.noteflow.Annotation\x12V\n\x0fListAnnotations\x12 .noteflow.ListAnnotationsRequest\x1a!.noteflow.ListAnnotationsResponse\x12K\n\x10UpdateAnnotation\x12!.noteflow.UpdateAnnotationRequest\x1a\x14.noteflow.Annotation\x12Y\n\x10\x44\x65leteAnnotation\x12!.noteflow.DeleteAnnotationRequest\x1a\".noteflow.DeleteAnnotationResponse\x12Y\n\x10\x45xportTranscript\x12!.noteflow.ExportTranscriptRequest\x1a\".noteflow.ExportTranscriptResponse\x12q\n\x18RefineSpeakerDiarization\x12).noteflow.RefineSpeakerDiarizationRequest\x1a*.noteflow.RefineSpeakerDiarizationResponse\x12P\n\rRenameSpeaker\x12\x1e.noteflow.RenameSpeakerRequest\x1a\x1f.noteflow.RenameSpeakerResponse\x12\x63\n\x17GetDiarizationJobStatus\x12(.noteflow.GetDiarizationJobStatusRequest\x1a\x1e.noteflow.DiarizationJobStatus\x12\x65\n\x14\x43\x61ncelDiarizationJob\x12%.noteflow.CancelDiarizationJobRequest\x1a&.noteflow.CancelDiarizationJobResponse\x12q\n\x18GetActiveDiarizationJobs\x12).noteflow.GetActiveDiarizationJobsRequest\x1a*.noteflow.GetActiveDiarizationJobsResponse\x12\x42\n\rGetServerInfo\x12\x1b.noteflow.ServerInfoRequest\x1a\x14.noteflow.ServerInfo\x12V\n\x0f\x45xtractEntities\x12 .noteflow.ExtractEntitiesRequest\x1a!.noteflow.ExtractEntitiesResponse\x12M\n\x0cUpdateEntity\x12\x1d.noteflow.UpdateEntityRequest\x1a\x1e.noteflow.UpdateEntityResponse\x12M\n\x0c\x44\x65leteEntity\x12\x1d.noteflow.DeleteEntityRequest\x1a\x1e.noteflow.DeleteEntityResponse\x12_\n\x12ListCalendarEvents\x12#.noteflow.ListCalendarEventsRequest\x1a$.noteflow.ListCalendarEventsResponse\x12\x65\n\x14GetCalendarProviders\x12%.noteflow.GetCalendarProvidersRequest\x1a&.noteflow.GetCalendarProvidersResponse\x12P\n\rInitiateOAuth\x12\x1e.noteflow.InitiateOAuthRequest\x1a\x1f.noteflow.InitiateOAuthResponse\x12P\n\rCompleteOAuth\x12\x1e.noteflow.CompleteOAuthRequest\x1a\x1f.noteflow.CompleteOAuthResponse\x12q\n\x18GetOAuthConnectionStatus\x12).noteflow.GetOAuthConnectionStatusRequest\x1a*.noteflow.GetOAuthConnectionStatusResponse\x12V\n\x0f\x44isconnectOAuth\x12 .noteflow.DisconnectOAuthRequest\x1a!.noteflow.DisconnectOAuthResponse\x12Q\n\x0fRegisterWebhook\x12 .noteflow.RegisterWebhookRequest\x1a\x1c.noteflow.WebhookConfigProto\x12M\n\x0cListWebhooks\x12\x1d.noteflow.ListWebhooksRequest\x1a\x1e.noteflow.ListWebhooksResponse\x12M\n\rUpdateWebhook\x12\x1e.noteflow.UpdateWebhookRequest\x1a\x1c.noteflow.WebhookConfigProto\x12P\n\rDeleteWebhook\x12\x1e.noteflow.DeleteWebhookRequest\x1a\x1f.noteflow.DeleteWebhookResponse\x12\x65\n\x14GetWebhookDeliveries\x12%.noteflow.GetWebhookDeliveriesRequest\x1a&.noteflow.GetWebhookDeliveriesResponse\x12\\\n\x11GrantCloudConsent\x12\".noteflow.GrantCloudConsentRequest\x1a#.noteflow.GrantCloudConsentResponse\x12_\n\x12RevokeCloudConsent\x12#.noteflow.RevokeCloudConsentRequest\x1a$.noteflow.RevokeCloudConsentResponse\x12h\n\x15GetCloudConsentStatus\x12&.noteflow.GetCloudConsentStatusRequest\x1a\'.noteflow.GetCloudConsentStatusResponse\x12S\n\x0eGetPreferences\x12\x1f.noteflow.GetPreferencesRequest\x1a .noteflow.GetPreferencesResponse\x12S\n\x0eSetPreferences\x12\x1f.noteflow.SetPreferencesRequest\x1a .noteflow.SetPreferencesResponse\x12\x65\n\x14StartIntegrationSync\x12%.noteflow.StartIntegrationSyncRequest\x1a&.noteflow.StartIntegrationSyncResponse\x12P\n\rGetSyncStatus\x12\x1e.noteflow.GetSyncStatusRequest\x1a\x1f.noteflow.GetSyncStatusResponse\x12V\n\x0fListSyncHistory\x12 .noteflow.ListSyncHistoryRequest\x1a!.noteflow.ListSyncHistoryResponse\x12\x62\n\x13GetUserIntegrations\x12$.noteflow.GetUserIntegrationsRequest\x1a%.noteflow.GetUserIntegrationsResponse\x12P\n\rGetRecentLogs\x12\x1e.noteflow.GetRecentLogsRequest\x1a\x1f.noteflow.GetRecentLogsResponse\x12h\n\x15GetPerformanceMetrics\x12&.noteflow.GetPerformanceMetricsRequest\x1a\'.noteflow.GetPerformanceMetricsResponse\x12Z\n\x14RegisterOidcProvider\x12%.noteflow.RegisterOidcProviderRequest\x1a\x1b.noteflow.OidcProviderProto\x12\\\n\x11ListOidcProviders\x12\".noteflow.ListOidcProvidersRequest\x1a#.noteflow.ListOidcProvidersResponse\x12P\n\x0fGetOidcProvider\x12 .noteflow.GetOidcProviderRequest\x1a\x1b.noteflow.OidcProviderProto\x12V\n\x12UpdateOidcProvider\x12#.noteflow.UpdateOidcProviderRequest\x1a\x1b.noteflow.OidcProviderProto\x12_\n\x12\x44\x65leteOidcProvider\x12#.noteflow.DeleteOidcProviderRequest\x1a$.noteflow.DeleteOidcProviderResponse\x12\x65\n\x14RefreshOidcDiscovery\x12%.noteflow.RefreshOidcDiscoveryRequest\x1a&.noteflow.RefreshOidcDiscoveryResponse\x12V\n\x0fListOidcPresets\x12 .noteflow.ListOidcPresetsRequest\x1a!.noteflow.ListOidcPresetsResponse\x12G\n\rCreateProject\x12\x1e.noteflow.CreateProjectRequest\x1a\x16.noteflow.ProjectProto\x12\x41\n\nGetProject\x12\x1b.noteflow.GetProjectRequest\x1a\x16.noteflow.ProjectProto\x12M\n\x10GetProjectBySlug\x12!.noteflow.GetProjectBySlugRequest\x1a\x16.noteflow.ProjectProto\x12M\n\x0cListProjects\x12\x1d.noteflow.ListProjectsRequest\x1a\x1e.noteflow.ListProjectsResponse\x12G\n\rUpdateProject\x12\x1e.noteflow.UpdateProjectRequest\x1a\x16.noteflow.ProjectProto\x12I\n\x0e\x41rchiveProject\x12\x1f.noteflow.ArchiveProjectRequest\x1a\x16.noteflow.ProjectProto\x12I\n\x0eRestoreProject\x12\x1f.noteflow.RestoreProjectRequest\x1a\x16.noteflow.ProjectProto\x12P\n\rDeleteProject\x12\x1e.noteflow.DeleteProjectRequest\x1a\x1f.noteflow.DeleteProjectResponse\x12Y\n\x10SetActiveProject\x12!.noteflow.SetActiveProjectRequest\x1a\".noteflow.SetActiveProjectResponse\x12Y\n\x10GetActiveProject\x12!.noteflow.GetActiveProjectRequest\x1a\".noteflow.GetActiveProjectResponse\x12W\n\x10\x41\x64\x64ProjectMember\x12!.noteflow.AddProjectMemberRequest\x1a .noteflow.ProjectMembershipProto\x12\x65\n\x17UpdateProjectMemberRole\x12(.noteflow.UpdateProjectMemberRoleRequest\x1a .noteflow.ProjectMembershipProto\x12\x62\n\x13RemoveProjectMember\x12$.noteflow.RemoveProjectMemberRequest\x1a%.noteflow.RemoveProjectMemberResponse\x12_\n\x12ListProjectMembers\x12#.noteflow.ListProjectMembersRequest\x1a$.noteflow.ListProjectMembersResponse\x12S\n\x0eGetCurrentUser\x12\x1f.noteflow.GetCurrentUserRequest\x1a .noteflow.GetCurrentUserResponse\x12S\n\x0eListWorkspaces\x12\x1f.noteflow.ListWorkspacesRequest\x1a .noteflow.ListWorkspacesResponse\x12V\n\x0fSwitchWorkspace\x12 .noteflow.SwitchWorkspaceRequest\x1a!.noteflow.SwitchWorkspaceResponse\x12_\n\x14GetWorkspaceSettings\x12%.noteflow.GetWorkspaceSettingsRequest\x1a .noteflow.WorkspaceSettingsProto\x12\x65\n\x17UpdateWorkspaceSettings\x12(.noteflow.UpdateWorkspaceSettingsRequest\x1a .noteflow.WorkspaceSettingsProtob\x06proto3') +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x0enoteflow.proto\x12\x08noteflow\"\x86\x01\n\nAudioChunk\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x12\n\naudio_data\x18\x02 \x01(\x0c\x12\x11\n\ttimestamp\x18\x03 \x01(\x01\x12\x13\n\x0bsample_rate\x18\x04 \x01(\x05\x12\x10\n\x08\x63hannels\x18\x05 \x01(\x05\x12\x16\n\x0e\x63hunk_sequence\x18\x06 \x01(\x03\"`\n\x0e\x43ongestionInfo\x12\x1b\n\x13processing_delay_ms\x18\x01 \x01(\x05\x12\x13\n\x0bqueue_depth\x18\x02 \x01(\x05\x12\x1c\n\x14throttle_recommended\x18\x03 \x01(\x08\"\x98\x02\n\x10TranscriptUpdate\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12)\n\x0bupdate_type\x18\x02 \x01(\x0e\x32\x14.noteflow.UpdateType\x12\x14\n\x0cpartial_text\x18\x03 \x01(\t\x12\'\n\x07segment\x18\x04 \x01(\x0b\x32\x16.noteflow.FinalSegment\x12\x18\n\x10server_timestamp\x18\x05 \x01(\x01\x12\x19\n\x0c\x61\x63k_sequence\x18\x06 \x01(\x03H\x00\x88\x01\x01\x12\x31\n\ncongestion\x18\n \x01(\x0b\x32\x18.noteflow.CongestionInfoH\x01\x88\x01\x01\x42\x0f\n\r_ack_sequenceB\r\n\x0b_congestion\"\x87\x02\n\x0c\x46inalSegment\x12\x12\n\nsegment_id\x18\x01 \x01(\x05\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\x01\x12#\n\x05words\x18\x05 \x03(\x0b\x32\x14.noteflow.WordTiming\x12\x10\n\x08language\x18\x06 \x01(\t\x12\x1b\n\x13language_confidence\x18\x07 \x01(\x02\x12\x13\n\x0b\x61vg_logprob\x18\x08 \x01(\x02\x12\x16\n\x0eno_speech_prob\x18\t \x01(\x02\x12\x12\n\nspeaker_id\x18\n \x01(\t\x12\x1a\n\x12speaker_confidence\x18\x0b \x01(\x02\"U\n\nWordTiming\x12\x0c\n\x04word\x18\x01 \x01(\t\x12\x12\n\nstart_time\x18\x02 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x03 \x01(\x01\x12\x13\n\x0bprobability\x18\x04 \x01(\x02\"\xb0\x03\n\x07Meeting\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12%\n\x05state\x18\x03 \x01(\x0e\x32\x16.noteflow.MeetingState\x12\x12\n\ncreated_at\x18\x04 \x01(\x01\x12\x12\n\nstarted_at\x18\x05 \x01(\x01\x12\x10\n\x08\x65nded_at\x18\x06 \x01(\x01\x12\x18\n\x10\x64uration_seconds\x18\x07 \x01(\x01\x12(\n\x08segments\x18\x08 \x03(\x0b\x32\x16.noteflow.FinalSegment\x12\"\n\x07summary\x18\t \x01(\x0b\x32\x11.noteflow.Summary\x12\x31\n\x08metadata\x18\n \x03(\x0b\x32\x1f.noteflow.Meeting.MetadataEntry\x12\x17\n\nproject_id\x18\x0b \x01(\tH\x00\x88\x01\x01\x12\x35\n\x11processing_status\x18\x0c \x01(\x0b\x32\x1a.noteflow.ProcessingStatus\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\r\n\x0b_project_id\"\xbe\x01\n\x14\x43reateMeetingRequest\x12\r\n\x05title\x18\x01 \x01(\t\x12>\n\x08metadata\x18\x02 \x03(\x0b\x32,.noteflow.CreateMeetingRequest.MetadataEntry\x12\x17\n\nproject_id\x18\x03 \x01(\tH\x00\x88\x01\x01\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\r\n\x0b_project_id\"(\n\x12StopMeetingRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\"\xc2\x01\n\x13ListMeetingsRequest\x12&\n\x06states\x18\x01 \x03(\x0e\x32\x16.noteflow.MeetingState\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\x12\'\n\nsort_order\x18\x04 \x01(\x0e\x32\x13.noteflow.SortOrder\x12\x17\n\nproject_id\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x13\n\x0bproject_ids\x18\x06 \x03(\tB\r\n\x0b_project_id\"P\n\x14ListMeetingsResponse\x12#\n\x08meetings\x18\x01 \x03(\x0b\x32\x11.noteflow.Meeting\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"Z\n\x11GetMeetingRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x18\n\x10include_segments\x18\x02 \x01(\x08\x12\x17\n\x0finclude_summary\x18\x03 \x01(\x08\"*\n\x14\x44\x65leteMeetingRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\"(\n\x15\x44\x65leteMeetingResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xb9\x01\n\x07Summary\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x19\n\x11\x65xecutive_summary\x18\x02 \x01(\t\x12&\n\nkey_points\x18\x03 \x03(\x0b\x32\x12.noteflow.KeyPoint\x12*\n\x0c\x61\x63tion_items\x18\x04 \x03(\x0b\x32\x14.noteflow.ActionItem\x12\x14\n\x0cgenerated_at\x18\x05 \x01(\x01\x12\x15\n\rmodel_version\x18\x06 \x01(\t\"S\n\x08KeyPoint\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x13\n\x0bsegment_ids\x18\x02 \x03(\x05\x12\x12\n\nstart_time\x18\x03 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\x01\"y\n\nActionItem\x12\x0c\n\x04text\x18\x01 \x01(\t\x12\x10\n\x08\x61ssignee\x18\x02 \x01(\t\x12\x10\n\x08\x64ue_date\x18\x03 \x01(\x01\x12$\n\x08priority\x18\x04 \x01(\x0e\x32\x12.noteflow.Priority\x12\x13\n\x0bsegment_ids\x18\x05 \x03(\x05\"\\\n\x14SummarizationOptions\x12\x0c\n\x04tone\x18\x01 \x01(\t\x12\x0e\n\x06\x66ormat\x18\x02 \x01(\t\x12\x11\n\tverbosity\x18\x03 \x01(\t\x12\x13\n\x0btemplate_id\x18\x04 \x01(\t\"w\n\x16GenerateSummaryRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x18\n\x10\x66orce_regenerate\x18\x02 \x01(\x08\x12/\n\x07options\x18\x03 \x01(\x0b\x32\x1e.noteflow.SummarizationOptions\"\xe4\x02\n\x1aSummarizationTemplateProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x19\n\x0cworkspace_id\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x11\n\tis_system\x18\x05 \x01(\x08\x12\x13\n\x0bis_archived\x18\x06 \x01(\x08\x12\x1f\n\x12\x63urrent_version_id\x18\x07 \x01(\tH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\x08 \x01(\x03\x12\x12\n\nupdated_at\x18\t \x01(\x03\x12\x17\n\ncreated_by\x18\n \x01(\tH\x03\x88\x01\x01\x12\x17\n\nupdated_by\x18\x0b \x01(\tH\x04\x88\x01\x01\x42\x0f\n\r_workspace_idB\x0e\n\x0c_descriptionB\x15\n\x13_current_version_idB\r\n\x0b_created_byB\r\n\x0b_updated_by\"\xd3\x01\n!SummarizationTemplateVersionProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0btemplate_id\x18\x02 \x01(\t\x12\x16\n\x0eversion_number\x18\x03 \x01(\x05\x12\x0f\n\x07\x63ontent\x18\x04 \x01(\t\x12\x18\n\x0b\x63hange_note\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x12\n\ncreated_at\x18\x06 \x01(\x03\x12\x17\n\ncreated_by\x18\x07 \x01(\tH\x01\x88\x01\x01\x42\x0e\n\x0c_change_noteB\r\n\x0b_created_by\"\x8a\x01\n!ListSummarizationTemplatesRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x16\n\x0einclude_system\x18\x02 \x01(\x08\x12\x18\n\x10include_archived\x18\x03 \x01(\x08\x12\r\n\x05limit\x18\x04 \x01(\x05\x12\x0e\n\x06offset\x18\x05 \x01(\x05\"r\n\"ListSummarizationTemplatesResponse\x12\x37\n\ttemplates\x18\x01 \x03(\x0b\x32$.noteflow.SummarizationTemplateProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"W\n\x1fGetSummarizationTemplateRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\x1f\n\x17include_current_version\x18\x02 \x01(\x08\"\xb9\x01\n GetSummarizationTemplateResponse\x12\x36\n\x08template\x18\x01 \x01(\x0b\x32$.noteflow.SummarizationTemplateProto\x12I\n\x0f\x63urrent_version\x18\x02 \x01(\x0b\x32+.noteflow.SummarizationTemplateVersionProtoH\x00\x88\x01\x01\x42\x12\n\x10_current_version\"\xae\x01\n%SummarizationTemplateMutationResponse\x12\x36\n\x08template\x18\x01 \x01(\x0b\x32$.noteflow.SummarizationTemplateProto\x12\x41\n\x07version\x18\x02 \x01(\x0b\x32+.noteflow.SummarizationTemplateVersionProtoH\x00\x88\x01\x01\x42\n\n\x08_version\"\xad\x01\n\"CreateSummarizationTemplateRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x0f\n\x07\x63ontent\x18\x04 \x01(\t\x12\x18\n\x0b\x63hange_note\x18\x05 \x01(\tH\x01\x88\x01\x01\x42\x0e\n\x0c_descriptionB\x0e\n\x0c_change_note\"\xcb\x01\n\"UpdateSummarizationTemplateRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x14\n\x07\x63ontent\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x18\n\x0b\x63hange_note\x18\x05 \x01(\tH\x03\x88\x01\x01\x42\x07\n\x05_nameB\x0e\n\x0c_descriptionB\n\n\x08_contentB\x0e\n\x0c_change_note\":\n#ArchiveSummarizationTemplateRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\"^\n(ListSummarizationTemplateVersionsRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\"\x7f\n)ListSummarizationTemplateVersionsResponse\x12=\n\x08versions\x18\x01 \x03(\x0b\x32+.noteflow.SummarizationTemplateVersionProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"U\n*RestoreSummarizationTemplateVersionRequest\x12\x13\n\x0btemplate_id\x18\x01 \x01(\t\x12\x12\n\nversion_id\x18\x02 \x01(\t\"\x13\n\x11ServerInfoRequest\"\xfb\x01\n\nServerInfo\x12\x0f\n\x07version\x18\x01 \x01(\t\x12\x11\n\tasr_model\x18\x02 \x01(\t\x12\x11\n\tasr_ready\x18\x03 \x01(\x08\x12\x1e\n\x16supported_sample_rates\x18\x04 \x03(\x05\x12\x16\n\x0emax_chunk_size\x18\x05 \x01(\x05\x12\x16\n\x0euptime_seconds\x18\x06 \x01(\x01\x12\x17\n\x0f\x61\x63tive_meetings\x18\x07 \x01(\x05\x12\x1b\n\x13\x64iarization_enabled\x18\x08 \x01(\x08\x12\x19\n\x11\x64iarization_ready\x18\t \x01(\x08\x12\x15\n\rstate_version\x18\n \x01(\x03\"\xff\x01\n\x10\x41srConfiguration\x12\x12\n\nmodel_size\x18\x01 \x01(\t\x12#\n\x06\x64\x65vice\x18\x02 \x01(\x0e\x32\x13.noteflow.AsrDevice\x12.\n\x0c\x63ompute_type\x18\x03 \x01(\x0e\x32\x18.noteflow.AsrComputeType\x12\x10\n\x08is_ready\x18\x04 \x01(\x08\x12\x16\n\x0e\x63uda_available\x18\x05 \x01(\x08\x12\x1d\n\x15\x61vailable_model_sizes\x18\x06 \x03(\t\x12\x39\n\x17\x61vailable_compute_types\x18\x07 \x03(\x0e\x32\x18.noteflow.AsrComputeType\"\x1c\n\x1aGetAsrConfigurationRequest\"P\n\x1bGetAsrConfigurationResponse\x12\x31\n\rconfiguration\x18\x01 \x01(\x0b\x32\x1a.noteflow.AsrConfiguration\"\xc2\x01\n\x1dUpdateAsrConfigurationRequest\x12\x17\n\nmodel_size\x18\x01 \x01(\tH\x00\x88\x01\x01\x12(\n\x06\x64\x65vice\x18\x02 \x01(\x0e\x32\x13.noteflow.AsrDeviceH\x01\x88\x01\x01\x12\x33\n\x0c\x63ompute_type\x18\x03 \x01(\x0e\x32\x18.noteflow.AsrComputeTypeH\x02\x88\x01\x01\x42\r\n\x0b_model_sizeB\t\n\x07_deviceB\x0f\n\r_compute_type\"~\n\x1eUpdateAsrConfigurationResponse\x12\x0e\n\x06job_id\x18\x01 \x01(\t\x12#\n\x06status\x18\x02 \x01(\x0e\x32\x13.noteflow.JobStatus\x12\x15\n\rerror_message\x18\x03 \x01(\t\x12\x10\n\x08\x61\x63\x63\x65pted\x18\x04 \x01(\x08\"5\n#GetAsrConfigurationJobStatusRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\t\"\xe2\x01\n\x19\x41srConfigurationJobStatus\x12\x0e\n\x06job_id\x18\x01 \x01(\t\x12#\n\x06status\x18\x02 \x01(\x0e\x32\x13.noteflow.JobStatus\x12\x18\n\x10progress_percent\x18\x03 \x01(\x02\x12\r\n\x05phase\x18\x04 \x01(\t\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12:\n\x11new_configuration\x18\x06 \x01(\x0b\x32\x1a.noteflow.AsrConfigurationH\x00\x88\x01\x01\x42\x14\n\x12_new_configuration\"\xbc\x01\n\nAnnotation\x12\n\n\x02id\x18\x01 \x01(\t\x12\x12\n\nmeeting_id\x18\x02 \x01(\t\x12\x31\n\x0f\x61nnotation_type\x18\x03 \x01(\x0e\x32\x18.noteflow.AnnotationType\x12\x0c\n\x04text\x18\x04 \x01(\t\x12\x12\n\nstart_time\x18\x05 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x06 \x01(\x01\x12\x13\n\x0bsegment_ids\x18\x07 \x03(\x05\x12\x12\n\ncreated_at\x18\x08 \x01(\x01\"\xa6\x01\n\x14\x41\x64\x64\x41nnotationRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x31\n\x0f\x61nnotation_type\x18\x02 \x01(\x0e\x32\x18.noteflow.AnnotationType\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x12\n\nstart_time\x18\x04 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x05 \x01(\x01\x12\x13\n\x0bsegment_ids\x18\x06 \x03(\x05\"-\n\x14GetAnnotationRequest\x12\x15\n\rannotation_id\x18\x01 \x01(\t\"R\n\x16ListAnnotationsRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x12\n\nstart_time\x18\x02 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x03 \x01(\x01\"D\n\x17ListAnnotationsResponse\x12)\n\x0b\x61nnotations\x18\x01 \x03(\x0b\x32\x14.noteflow.Annotation\"\xac\x01\n\x17UpdateAnnotationRequest\x12\x15\n\rannotation_id\x18\x01 \x01(\t\x12\x31\n\x0f\x61nnotation_type\x18\x02 \x01(\x0e\x32\x18.noteflow.AnnotationType\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x12\n\nstart_time\x18\x04 \x01(\x01\x12\x10\n\x08\x65nd_time\x18\x05 \x01(\x01\x12\x13\n\x0bsegment_ids\x18\x06 \x03(\x05\"0\n\x17\x44\x65leteAnnotationRequest\x12\x15\n\rannotation_id\x18\x01 \x01(\t\"+\n\x18\x44\x65leteAnnotationResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\x86\x01\n\x13ProcessingStepState\x12.\n\x06status\x18\x01 \x01(\x0e\x32\x1e.noteflow.ProcessingStepStatus\x12\x15\n\rerror_message\x18\x02 \x01(\t\x12\x12\n\nstarted_at\x18\x03 \x01(\x01\x12\x14\n\x0c\x63ompleted_at\x18\x04 \x01(\x01\"\xa7\x01\n\x10ProcessingStatus\x12.\n\x07summary\x18\x01 \x01(\x0b\x32\x1d.noteflow.ProcessingStepState\x12/\n\x08\x65ntities\x18\x02 \x01(\x0b\x32\x1d.noteflow.ProcessingStepState\x12\x32\n\x0b\x64iarization\x18\x03 \x01(\x0b\x32\x1d.noteflow.ProcessingStepState\"U\n\x17\x45xportTranscriptRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12&\n\x06\x66ormat\x18\x02 \x01(\x0e\x32\x16.noteflow.ExportFormat\"X\n\x18\x45xportTranscriptResponse\x12\x0f\n\x07\x63ontent\x18\x01 \x01(\t\x12\x13\n\x0b\x66ormat_name\x18\x02 \x01(\t\x12\x16\n\x0e\x66ile_extension\x18\x03 \x01(\t\"K\n\x1fRefineSpeakerDiarizationRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x14\n\x0cnum_speakers\x18\x02 \x01(\x05\"\x9d\x01\n RefineSpeakerDiarizationResponse\x12\x18\n\x10segments_updated\x18\x01 \x01(\x05\x12\x13\n\x0bspeaker_ids\x18\x02 \x03(\t\x12\x15\n\rerror_message\x18\x03 \x01(\t\x12\x0e\n\x06job_id\x18\x04 \x01(\t\x12#\n\x06status\x18\x05 \x01(\x0e\x32\x13.noteflow.JobStatus\"\\\n\x14RenameSpeakerRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x16\n\x0eold_speaker_id\x18\x02 \x01(\t\x12\x18\n\x10new_speaker_name\x18\x03 \x01(\t\"B\n\x15RenameSpeakerResponse\x12\x18\n\x10segments_updated\x18\x01 \x01(\x05\x12\x0f\n\x07success\x18\x02 \x01(\x08\"0\n\x1eGetDiarizationJobStatusRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\t\"\xab\x01\n\x14\x44iarizationJobStatus\x12\x0e\n\x06job_id\x18\x01 \x01(\t\x12#\n\x06status\x18\x02 \x01(\x0e\x32\x13.noteflow.JobStatus\x12\x18\n\x10segments_updated\x18\x03 \x01(\x05\x12\x13\n\x0bspeaker_ids\x18\x04 \x03(\t\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x18\n\x10progress_percent\x18\x06 \x01(\x02\"-\n\x1b\x43\x61ncelDiarizationJobRequest\x12\x0e\n\x06job_id\x18\x01 \x01(\t\"k\n\x1c\x43\x61ncelDiarizationJobResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\x12#\n\x06status\x18\x03 \x01(\x0e\x32\x13.noteflow.JobStatus\"!\n\x1fGetActiveDiarizationJobsRequest\"P\n GetActiveDiarizationJobsResponse\x12,\n\x04jobs\x18\x01 \x03(\x0b\x32\x1e.noteflow.DiarizationJobStatus\"C\n\x16\x45xtractEntitiesRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x15\n\rforce_refresh\x18\x02 \x01(\x08\"y\n\x0f\x45xtractedEntity\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04text\x18\x02 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x03 \x01(\t\x12\x13\n\x0bsegment_ids\x18\x04 \x03(\x05\x12\x12\n\nconfidence\x18\x05 \x01(\x02\x12\x11\n\tis_pinned\x18\x06 \x01(\x08\"k\n\x17\x45xtractEntitiesResponse\x12+\n\x08\x65ntities\x18\x01 \x03(\x0b\x32\x19.noteflow.ExtractedEntity\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\x12\x0e\n\x06\x63\x61\x63hed\x18\x03 \x01(\x08\"\\\n\x13UpdateEntityRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x11\n\tentity_id\x18\x02 \x01(\t\x12\x0c\n\x04text\x18\x03 \x01(\t\x12\x10\n\x08\x63\x61tegory\x18\x04 \x01(\t\"A\n\x14UpdateEntityResponse\x12)\n\x06\x65ntity\x18\x01 \x01(\x0b\x32\x19.noteflow.ExtractedEntity\"<\n\x13\x44\x65leteEntityRequest\x12\x12\n\nmeeting_id\x18\x01 \x01(\t\x12\x11\n\tentity_id\x18\x02 \x01(\t\"\'\n\x14\x44\x65leteEntityResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xc7\x01\n\rCalendarEvent\x12\n\n\x02id\x18\x01 \x01(\t\x12\r\n\x05title\x18\x02 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x03\x12\x10\n\x08\x65nd_time\x18\x04 \x01(\x03\x12\x11\n\tattendees\x18\x05 \x03(\t\x12\x10\n\x08location\x18\x06 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x07 \x01(\t\x12\x13\n\x0bmeeting_url\x18\x08 \x01(\t\x12\x14\n\x0cis_recurring\x18\t \x01(\x08\x12\x10\n\x08provider\x18\n \x01(\t\"Q\n\x19ListCalendarEventsRequest\x12\x13\n\x0bhours_ahead\x18\x01 \x01(\x05\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x10\n\x08provider\x18\x03 \x01(\t\"Z\n\x1aListCalendarEventsResponse\x12\'\n\x06\x65vents\x18\x01 \x03(\x0b\x32\x17.noteflow.CalendarEvent\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x1d\n\x1bGetCalendarProvidersRequest\"P\n\x10\x43\x61lendarProvider\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x18\n\x10is_authenticated\x18\x02 \x01(\x08\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\"M\n\x1cGetCalendarProvidersResponse\x12-\n\tproviders\x18\x01 \x03(\x0b\x32\x1a.noteflow.CalendarProvider\"X\n\x14InitiateOAuthRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x14\n\x0credirect_uri\x18\x02 \x01(\t\x12\x18\n\x10integration_type\x18\x03 \x01(\t\"8\n\x15InitiateOAuthResponse\x12\x10\n\x08\x61uth_url\x18\x01 \x01(\t\x12\r\n\x05state\x18\x02 \x01(\t\"E\n\x14\x43ompleteOAuthRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x0c\n\x04\x63ode\x18\x02 \x01(\t\x12\r\n\x05state\x18\x03 \x01(\t\"o\n\x15\x43ompleteOAuthResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\x12\x16\n\x0eprovider_email\x18\x03 \x01(\t\x12\x16\n\x0eintegration_id\x18\x04 \x01(\t\"\x87\x01\n\x0fOAuthConnection\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\x12\r\n\x05\x65mail\x18\x03 \x01(\t\x12\x12\n\nexpires_at\x18\x04 \x01(\x03\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x18\n\x10integration_type\x18\x06 \x01(\t\"M\n\x1fGetOAuthConnectionStatusRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x18\n\x10integration_type\x18\x02 \x01(\t\"Q\n GetOAuthConnectionStatusResponse\x12-\n\nconnection\x18\x01 \x01(\x0b\x32\x19.noteflow.OAuthConnection\"D\n\x16\x44isconnectOAuthRequest\x12\x10\n\x08provider\x18\x01 \x01(\t\x12\x18\n\x10integration_type\x18\x02 \x01(\t\"A\n\x17\x44isconnectOAuthResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\"\x92\x01\n\x16RegisterWebhookRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x0c\n\x04name\x18\x04 \x01(\t\x12\x0e\n\x06secret\x18\x05 \x01(\t\x12\x12\n\ntimeout_ms\x18\x06 \x01(\x05\x12\x13\n\x0bmax_retries\x18\x07 \x01(\x05\"\xc3\x01\n\x12WebhookConfigProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0b\n\x03url\x18\x04 \x01(\t\x12\x0e\n\x06\x65vents\x18\x05 \x03(\t\x12\x0f\n\x07\x65nabled\x18\x06 \x01(\x08\x12\x12\n\ntimeout_ms\x18\x07 \x01(\x05\x12\x13\n\x0bmax_retries\x18\x08 \x01(\x05\x12\x12\n\ncreated_at\x18\t \x01(\x03\x12\x12\n\nupdated_at\x18\n \x01(\x03\"+\n\x13ListWebhooksRequest\x12\x14\n\x0c\x65nabled_only\x18\x01 \x01(\x08\"[\n\x14ListWebhooksResponse\x12.\n\x08webhooks\x18\x01 \x03(\x0b\x32\x1c.noteflow.WebhookConfigProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x84\x02\n\x14UpdateWebhookRequest\x12\x12\n\nwebhook_id\x18\x01 \x01(\t\x12\x10\n\x03url\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06\x65vents\x18\x03 \x03(\t\x12\x11\n\x04name\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x13\n\x06secret\x18\x05 \x01(\tH\x02\x88\x01\x01\x12\x14\n\x07\x65nabled\x18\x06 \x01(\x08H\x03\x88\x01\x01\x12\x17\n\ntimeout_ms\x18\x07 \x01(\x05H\x04\x88\x01\x01\x12\x18\n\x0bmax_retries\x18\x08 \x01(\x05H\x05\x88\x01\x01\x42\x06\n\x04_urlB\x07\n\x05_nameB\t\n\x07_secretB\n\n\x08_enabledB\r\n\x0b_timeout_msB\x0e\n\x0c_max_retries\"*\n\x14\x44\x65leteWebhookRequest\x12\x12\n\nwebhook_id\x18\x01 \x01(\t\"(\n\x15\x44\x65leteWebhookResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"\xcb\x01\n\x14WebhookDeliveryProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x12\n\nwebhook_id\x18\x02 \x01(\t\x12\x12\n\nevent_type\x18\x03 \x01(\t\x12\x13\n\x0bstatus_code\x18\x04 \x01(\x05\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x15\n\rattempt_count\x18\x06 \x01(\x05\x12\x13\n\x0b\x64uration_ms\x18\x07 \x01(\x05\x12\x14\n\x0c\x64\x65livered_at\x18\x08 \x01(\x03\x12\x11\n\tsucceeded\x18\t \x01(\x08\"@\n\x1bGetWebhookDeliveriesRequest\x12\x12\n\nwebhook_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\"g\n\x1cGetWebhookDeliveriesResponse\x12\x32\n\ndeliveries\x18\x01 \x03(\x0b\x32\x1e.noteflow.WebhookDeliveryProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x1a\n\x18GrantCloudConsentRequest\"\x1b\n\x19GrantCloudConsentResponse\"\x1b\n\x19RevokeCloudConsentRequest\"\x1c\n\x1aRevokeCloudConsentResponse\"\x1e\n\x1cGetCloudConsentStatusRequest\"8\n\x1dGetCloudConsentStatusResponse\x12\x17\n\x0f\x63onsent_granted\x18\x01 \x01(\x08\"=\n\x1aSetHuggingFaceTokenRequest\x12\r\n\x05token\x18\x01 \x01(\t\x12\x10\n\x08validate\x18\x02 \x01(\x08\"x\n\x1bSetHuggingFaceTokenResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x12\n\x05valid\x18\x02 \x01(\x08H\x00\x88\x01\x01\x12\x18\n\x10validation_error\x18\x03 \x01(\t\x12\x10\n\x08username\x18\x04 \x01(\tB\x08\n\x06_valid\"\"\n GetHuggingFaceTokenStatusRequest\"x\n!GetHuggingFaceTokenStatusResponse\x12\x15\n\ris_configured\x18\x01 \x01(\x08\x12\x14\n\x0cis_validated\x18\x02 \x01(\x08\x12\x10\n\x08username\x18\x03 \x01(\t\x12\x14\n\x0cvalidated_at\x18\x04 \x01(\x01\"\x1f\n\x1d\x44\x65leteHuggingFaceTokenRequest\"1\n\x1e\x44\x65leteHuggingFaceTokenResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"!\n\x1fValidateHuggingFaceTokenRequest\"Z\n ValidateHuggingFaceTokenResponse\x12\r\n\x05valid\x18\x01 \x01(\x08\x12\x10\n\x08username\x18\x02 \x01(\t\x12\x15\n\rerror_message\x18\x03 \x01(\t\"%\n\x15GetPreferencesRequest\x12\x0c\n\x04keys\x18\x01 \x03(\t\"\xb6\x01\n\x16GetPreferencesResponse\x12\x46\n\x0bpreferences\x18\x01 \x03(\x0b\x32\x31.noteflow.GetPreferencesResponse.PreferencesEntry\x12\x12\n\nupdated_at\x18\x02 \x01(\x01\x12\x0c\n\x04\x65tag\x18\x03 \x01(\t\x1a\x32\n\x10PreferencesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xce\x01\n\x15SetPreferencesRequest\x12\x45\n\x0bpreferences\x18\x01 \x03(\x0b\x32\x30.noteflow.SetPreferencesRequest.PreferencesEntry\x12\x10\n\x08if_match\x18\x02 \x01(\t\x12\x19\n\x11\x63lient_updated_at\x18\x03 \x01(\x01\x12\r\n\x05merge\x18\x04 \x01(\x08\x1a\x32\n\x10PreferencesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x8d\x02\n\x16SetPreferencesResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12\x10\n\x08\x63onflict\x18\x02 \x01(\x08\x12S\n\x12server_preferences\x18\x03 \x03(\x0b\x32\x37.noteflow.SetPreferencesResponse.ServerPreferencesEntry\x12\x19\n\x11server_updated_at\x18\x04 \x01(\x01\x12\x0c\n\x04\x65tag\x18\x05 \x01(\t\x12\x18\n\x10\x63onflict_message\x18\x06 \x01(\t\x1a\x38\n\x16ServerPreferencesEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"5\n\x1bStartIntegrationSyncRequest\x12\x16\n\x0eintegration_id\x18\x01 \x01(\t\"C\n\x1cStartIntegrationSyncResponse\x12\x13\n\x0bsync_run_id\x18\x01 \x01(\t\x12\x0e\n\x06status\x18\x02 \x01(\t\"+\n\x14GetSyncStatusRequest\x12\x13\n\x0bsync_run_id\x18\x01 \x01(\t\"\xda\x01\n\x15GetSyncStatusResponse\x12\x0e\n\x06status\x18\x01 \x01(\t\x12\x14\n\x0citems_synced\x18\x02 \x01(\x05\x12\x13\n\x0bitems_total\x18\x03 \x01(\x05\x12\x15\n\rerror_message\x18\x04 \x01(\t\x12\x13\n\x0b\x64uration_ms\x18\x05 \x01(\x03\x12\x17\n\nexpires_at\x18\n \x01(\tH\x00\x88\x01\x01\x12\x1d\n\x10not_found_reason\x18\x0b \x01(\tH\x01\x88\x01\x01\x42\r\n\x0b_expires_atB\x13\n\x11_not_found_reason\"O\n\x16ListSyncHistoryRequest\x12\x16\n\x0eintegration_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\"T\n\x17ListSyncHistoryResponse\x12$\n\x04runs\x18\x01 \x03(\x0b\x32\x16.noteflow.SyncRunProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\xae\x01\n\x0cSyncRunProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x16\n\x0eintegration_id\x18\x02 \x01(\t\x12\x0e\n\x06status\x18\x03 \x01(\t\x12\x14\n\x0citems_synced\x18\x04 \x01(\x05\x12\x15\n\rerror_message\x18\x05 \x01(\t\x12\x13\n\x0b\x64uration_ms\x18\x06 \x01(\x03\x12\x12\n\nstarted_at\x18\x07 \x01(\t\x12\x14\n\x0c\x63ompleted_at\x18\x08 \x01(\t\"\x1c\n\x1aGetUserIntegrationsRequest\"_\n\x0fIntegrationInfo\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04type\x18\x03 \x01(\t\x12\x0e\n\x06status\x18\x04 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x05 \x01(\t\"N\n\x1bGetUserIntegrationsResponse\x12/\n\x0cintegrations\x18\x01 \x03(\x0b\x32\x19.noteflow.IntegrationInfo\"D\n\x14GetRecentLogsRequest\x12\r\n\x05limit\x18\x01 \x01(\x05\x12\r\n\x05level\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\">\n\x15GetRecentLogsResponse\x12%\n\x04logs\x18\x01 \x03(\x0b\x32\x17.noteflow.LogEntryProto\"\x99\x02\n\rLogEntryProto\x12\x11\n\ttimestamp\x18\x01 \x01(\t\x12\r\n\x05level\x18\x02 \x01(\t\x12\x0e\n\x06source\x18\x03 \x01(\t\x12\x0f\n\x07message\x18\x04 \x01(\t\x12\x35\n\x07\x64\x65tails\x18\x05 \x03(\x0b\x32$.noteflow.LogEntryProto.DetailsEntry\x12\x10\n\x08trace_id\x18\x06 \x01(\t\x12\x0f\n\x07span_id\x18\x07 \x01(\t\x12\x12\n\nevent_type\x18\x08 \x01(\t\x12\x14\n\x0coperation_id\x18\t \x01(\t\x12\x11\n\tentity_id\x18\n \x01(\t\x1a.\n\x0c\x44\x65tailsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"5\n\x1cGetPerformanceMetricsRequest\x12\x15\n\rhistory_limit\x18\x01 \x01(\x05\"\x87\x01\n\x1dGetPerformanceMetricsResponse\x12\x32\n\x07\x63urrent\x18\x01 \x01(\x0b\x32!.noteflow.PerformanceMetricsPoint\x12\x32\n\x07history\x18\x02 \x03(\x0b\x32!.noteflow.PerformanceMetricsPoint\"\xf1\x01\n\x17PerformanceMetricsPoint\x12\x11\n\ttimestamp\x18\x01 \x01(\x01\x12\x13\n\x0b\x63pu_percent\x18\x02 \x01(\x01\x12\x16\n\x0ememory_percent\x18\x03 \x01(\x01\x12\x11\n\tmemory_mb\x18\x04 \x01(\x01\x12\x14\n\x0c\x64isk_percent\x18\x05 \x01(\x01\x12\x1a\n\x12network_bytes_sent\x18\x06 \x01(\x03\x12\x1a\n\x12network_bytes_recv\x18\x07 \x01(\x03\x12\x19\n\x11process_memory_mb\x18\x08 \x01(\x01\x12\x1a\n\x12\x61\x63tive_connections\x18\t \x01(\x05\"\xd0\x02\n\x11\x43laimMappingProto\x12\x15\n\rsubject_claim\x18\x01 \x01(\t\x12\x13\n\x0b\x65mail_claim\x18\x02 \x01(\t\x12\x1c\n\x14\x65mail_verified_claim\x18\x03 \x01(\t\x12\x12\n\nname_claim\x18\x04 \x01(\t\x12 \n\x18preferred_username_claim\x18\x05 \x01(\t\x12\x14\n\x0cgroups_claim\x18\x06 \x01(\t\x12\x15\n\rpicture_claim\x18\x07 \x01(\t\x12\x1d\n\x10\x66irst_name_claim\x18\x08 \x01(\tH\x00\x88\x01\x01\x12\x1c\n\x0flast_name_claim\x18\t \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0bphone_claim\x18\n \x01(\tH\x02\x88\x01\x01\x42\x13\n\x11_first_name_claimB\x12\n\x10_last_name_claimB\x0e\n\x0c_phone_claim\"\xf7\x02\n\x12OidcDiscoveryProto\x12\x0e\n\x06issuer\x18\x01 \x01(\t\x12\x1e\n\x16\x61uthorization_endpoint\x18\x02 \x01(\t\x12\x16\n\x0etoken_endpoint\x18\x03 \x01(\t\x12\x1e\n\x11userinfo_endpoint\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x15\n\x08jwks_uri\x18\x05 \x01(\tH\x01\x88\x01\x01\x12!\n\x14\x65nd_session_endpoint\x18\x06 \x01(\tH\x02\x88\x01\x01\x12 \n\x13revocation_endpoint\x18\x07 \x01(\tH\x03\x88\x01\x01\x12\x18\n\x10scopes_supported\x18\x08 \x03(\t\x12\x18\n\x10\x63laims_supported\x18\t \x03(\t\x12\x15\n\rsupports_pkce\x18\n \x01(\x08\x42\x14\n\x12_userinfo_endpointB\x0b\n\t_jwks_uriB\x17\n\x15_end_session_endpointB\x16\n\x14_revocation_endpoint\"\xc5\x03\n\x11OidcProviderProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x0e\n\x06preset\x18\x04 \x01(\t\x12\x12\n\nissuer_url\x18\x05 \x01(\t\x12\x11\n\tclient_id\x18\x06 \x01(\t\x12\x0f\n\x07\x65nabled\x18\x07 \x01(\x08\x12\x34\n\tdiscovery\x18\x08 \x01(\x0b\x32\x1c.noteflow.OidcDiscoveryProtoH\x00\x88\x01\x01\x12\x32\n\rclaim_mapping\x18\t \x01(\x0b\x32\x1b.noteflow.ClaimMappingProto\x12\x0e\n\x06scopes\x18\n \x03(\t\x12\x1e\n\x16require_email_verified\x18\x0b \x01(\x08\x12\x16\n\x0e\x61llowed_groups\x18\x0c \x03(\t\x12\x12\n\ncreated_at\x18\r \x01(\x03\x12\x12\n\nupdated_at\x18\x0e \x01(\x03\x12#\n\x16\x64iscovery_refreshed_at\x18\x0f \x01(\x03H\x01\x88\x01\x01\x12\x10\n\x08warnings\x18\x10 \x03(\tB\x0c\n\n_discoveryB\x19\n\x17_discovery_refreshed_at\"\xf0\x02\n\x1bRegisterOidcProviderRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\nissuer_url\x18\x03 \x01(\t\x12\x11\n\tclient_id\x18\x04 \x01(\t\x12\x1a\n\rclient_secret\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06preset\x18\x06 \x01(\t\x12\x0e\n\x06scopes\x18\x07 \x03(\t\x12\x37\n\rclaim_mapping\x18\x08 \x01(\x0b\x32\x1b.noteflow.ClaimMappingProtoH\x01\x88\x01\x01\x12\x16\n\x0e\x61llowed_groups\x18\t \x03(\t\x12#\n\x16require_email_verified\x18\n \x01(\x08H\x02\x88\x01\x01\x12\x15\n\rauto_discover\x18\x0b \x01(\x08\x42\x10\n\x0e_client_secretB\x10\n\x0e_claim_mappingB\x19\n\x17_require_email_verified\"\\\n\x18ListOidcProvidersRequest\x12\x19\n\x0cworkspace_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x14\n\x0c\x65nabled_only\x18\x02 \x01(\x08\x42\x0f\n\r_workspace_id\"`\n\x19ListOidcProvidersResponse\x12.\n\tproviders\x18\x01 \x03(\x0b\x32\x1b.noteflow.OidcProviderProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"-\n\x16GetOidcProviderRequest\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\"\xa1\x02\n\x19UpdateOidcProviderRequest\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x0e\n\x06scopes\x18\x03 \x03(\t\x12\x37\n\rclaim_mapping\x18\x04 \x01(\x0b\x32\x1b.noteflow.ClaimMappingProtoH\x01\x88\x01\x01\x12\x16\n\x0e\x61llowed_groups\x18\x05 \x03(\t\x12#\n\x16require_email_verified\x18\x06 \x01(\x08H\x02\x88\x01\x01\x12\x14\n\x07\x65nabled\x18\x07 \x01(\x08H\x03\x88\x01\x01\x42\x07\n\x05_nameB\x10\n\x0e_claim_mappingB\x19\n\x17_require_email_verifiedB\n\n\x08_enabled\"0\n\x19\x44\x65leteOidcProviderRequest\x12\x13\n\x0bprovider_id\x18\x01 \x01(\t\"-\n\x1a\x44\x65leteOidcProviderResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"s\n\x1bRefreshOidcDiscoveryRequest\x12\x18\n\x0bprovider_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\x19\n\x0cworkspace_id\x18\x02 \x01(\tH\x01\x88\x01\x01\x42\x0e\n\x0c_provider_idB\x0f\n\r_workspace_id\"\xc2\x01\n\x1cRefreshOidcDiscoveryResponse\x12\x44\n\x07results\x18\x01 \x03(\x0b\x32\x33.noteflow.RefreshOidcDiscoveryResponse.ResultsEntry\x12\x15\n\rsuccess_count\x18\x02 \x01(\x05\x12\x15\n\rfailure_count\x18\x03 \x01(\x05\x1a.\n\x0cResultsEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\x18\n\x16ListOidcPresetsRequest\"\xb8\x01\n\x0fOidcPresetProto\x12\x0e\n\x06preset\x18\x01 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x03 \x01(\t\x12\x16\n\x0e\x64\x65\x66\x61ult_scopes\x18\x04 \x03(\t\x12\x1e\n\x11\x64ocumentation_url\x18\x05 \x01(\tH\x00\x88\x01\x01\x12\x12\n\x05notes\x18\x06 \x01(\tH\x01\x88\x01\x01\x42\x14\n\x12_documentation_urlB\x08\n\x06_notes\"E\n\x17ListOidcPresetsResponse\x12*\n\x07presets\x18\x01 \x03(\x0b\x32\x19.noteflow.OidcPresetProto\"\xea\x01\n\x10\x45xportRulesProto\x12\x33\n\x0e\x64\x65\x66\x61ult_format\x18\x01 \x01(\x0e\x32\x16.noteflow.ExportFormatH\x00\x88\x01\x01\x12\x1a\n\rinclude_audio\x18\x02 \x01(\x08H\x01\x88\x01\x01\x12\x1f\n\x12include_timestamps\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12\x18\n\x0btemplate_id\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x11\n\x0f_default_formatB\x10\n\x0e_include_audioB\x15\n\x13_include_timestampsB\x0e\n\x0c_template_id\"\x88\x01\n\x11TriggerRulesProto\x12\x1f\n\x12\x61uto_start_enabled\x18\x01 \x01(\x08H\x00\x88\x01\x01\x12\x1f\n\x17\x63\x61lendar_match_patterns\x18\x02 \x03(\t\x12\x1a\n\x12\x61pp_match_patterns\x18\x03 \x03(\tB\x15\n\x13_auto_start_enabled\"\xa5\x02\n\x16WorkspaceSettingsProto\x12\x35\n\x0c\x65xport_rules\x18\x01 \x01(\x0b\x32\x1a.noteflow.ExportRulesProtoH\x00\x88\x01\x01\x12\x37\n\rtrigger_rules\x18\x02 \x01(\x0b\x32\x1b.noteflow.TriggerRulesProtoH\x01\x88\x01\x01\x12\x18\n\x0brag_enabled\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12+\n\x1e\x64\x65\x66\x61ult_summarization_template\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0f\n\r_export_rulesB\x10\n\x0e_trigger_rulesB\x0e\n\x0c_rag_enabledB!\n\x1f_default_summarization_template\"\xa3\x02\n\x14ProjectSettingsProto\x12\x35\n\x0c\x65xport_rules\x18\x01 \x01(\x0b\x32\x1a.noteflow.ExportRulesProtoH\x00\x88\x01\x01\x12\x37\n\rtrigger_rules\x18\x02 \x01(\x0b\x32\x1b.noteflow.TriggerRulesProtoH\x01\x88\x01\x01\x12\x18\n\x0brag_enabled\x18\x03 \x01(\x08H\x02\x88\x01\x01\x12+\n\x1e\x64\x65\x66\x61ult_summarization_template\x18\x04 \x01(\tH\x03\x88\x01\x01\x42\x0f\n\r_export_rulesB\x10\n\x0e_trigger_rulesB\x0e\n\x0c_rag_enabledB!\n\x1f_default_summarization_template\"\xc3\x02\n\x0cProjectProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x11\n\x04slug\x18\x04 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x05 \x01(\tH\x01\x88\x01\x01\x12\x12\n\nis_default\x18\x06 \x01(\x08\x12\x13\n\x0bis_archived\x18\x07 \x01(\x08\x12\x35\n\x08settings\x18\x08 \x01(\x0b\x32\x1e.noteflow.ProjectSettingsProtoH\x02\x88\x01\x01\x12\x12\n\ncreated_at\x18\t \x01(\x03\x12\x12\n\nupdated_at\x18\n \x01(\x03\x12\x18\n\x0b\x61rchived_at\x18\x0b \x01(\x03H\x03\x88\x01\x01\x42\x07\n\x05_slugB\x0e\n\x0c_descriptionB\x0b\n\t_settingsB\x0e\n\x0c_archived_at\"z\n\x16ProjectMembershipProto\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12(\n\x04role\x18\x03 \x01(\x0e\x32\x1a.noteflow.ProjectRoleProto\x12\x11\n\tjoined_at\x18\x04 \x01(\x03\"\xc4\x01\n\x14\x43reateProjectRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x11\n\x04slug\x18\x03 \x01(\tH\x00\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x01\x88\x01\x01\x12\x35\n\x08settings\x18\x05 \x01(\x0b\x32\x1e.noteflow.ProjectSettingsProtoH\x02\x88\x01\x01\x42\x07\n\x05_slugB\x0e\n\x0c_descriptionB\x0b\n\t_settings\"\'\n\x11GetProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"=\n\x17GetProjectBySlugRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x0c\n\x04slug\x18\x02 \x01(\t\"d\n\x13ListProjectsRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x18\n\x10include_archived\x18\x02 \x01(\x08\x12\r\n\x05limit\x18\x03 \x01(\x05\x12\x0e\n\x06offset\x18\x04 \x01(\x05\"U\n\x14ListProjectsResponse\x12(\n\x08projects\x18\x01 \x03(\x0b\x32\x16.noteflow.ProjectProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\xd0\x01\n\x14UpdateProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x11\n\x04name\x18\x02 \x01(\tH\x00\x88\x01\x01\x12\x11\n\x04slug\x18\x03 \x01(\tH\x01\x88\x01\x01\x12\x18\n\x0b\x64\x65scription\x18\x04 \x01(\tH\x02\x88\x01\x01\x12\x35\n\x08settings\x18\x05 \x01(\x0b\x32\x1e.noteflow.ProjectSettingsProtoH\x03\x88\x01\x01\x42\x07\n\x05_nameB\x07\n\x05_slugB\x0e\n\x0c_descriptionB\x0b\n\t_settings\"+\n\x15\x41rchiveProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"+\n\x15RestoreProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"*\n\x14\x44\x65leteProjectRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\"(\n\x15\x44\x65leteProjectResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"C\n\x17SetActiveProjectRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x12\n\nproject_id\x18\x02 \x01(\t\"\x1a\n\x18SetActiveProjectResponse\"/\n\x17GetActiveProjectRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\"k\n\x18GetActiveProjectResponse\x12\x17\n\nproject_id\x18\x01 \x01(\tH\x00\x88\x01\x01\x12\'\n\x07project\x18\x02 \x01(\x0b\x32\x16.noteflow.ProjectProtoB\r\n\x0b_project_id\"h\n\x17\x41\x64\x64ProjectMemberRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12(\n\x04role\x18\x03 \x01(\x0e\x32\x1a.noteflow.ProjectRoleProto\"o\n\x1eUpdateProjectMemberRoleRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\x12(\n\x04role\x18\x03 \x01(\x0e\x32\x1a.noteflow.ProjectRoleProto\"A\n\x1aRemoveProjectMemberRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\x0f\n\x07user_id\x18\x02 \x01(\t\".\n\x1bRemoveProjectMemberResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\"N\n\x19ListProjectMembersRequest\x12\x12\n\nproject_id\x18\x01 \x01(\t\x12\r\n\x05limit\x18\x02 \x01(\x05\x12\x0e\n\x06offset\x18\x03 \x01(\x05\"d\n\x1aListProjectMembersResponse\x12\x31\n\x07members\x18\x01 \x03(\x0b\x32 .noteflow.ProjectMembershipProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\"\x17\n\x15GetCurrentUserRequest\"\xbb\x01\n\x16GetCurrentUserResponse\x12\x0f\n\x07user_id\x18\x01 \x01(\t\x12\x14\n\x0cworkspace_id\x18\x02 \x01(\t\x12\x14\n\x0c\x64isplay_name\x18\x03 \x01(\t\x12\r\n\x05\x65mail\x18\x04 \x01(\t\x12\x18\n\x10is_authenticated\x18\x05 \x01(\x08\x12\x15\n\rauth_provider\x18\x06 \x01(\t\x12\x16\n\x0eworkspace_name\x18\x07 \x01(\t\x12\x0c\n\x04role\x18\x08 \x01(\t\"Z\n\x0eWorkspaceProto\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0c\n\x04slug\x18\x03 \x01(\t\x12\x12\n\nis_default\x18\x04 \x01(\x08\x12\x0c\n\x04role\x18\x05 \x01(\t\"6\n\x15ListWorkspacesRequest\x12\r\n\x05limit\x18\x01 \x01(\x05\x12\x0e\n\x06offset\x18\x02 \x01(\x05\"[\n\x16ListWorkspacesResponse\x12,\n\nworkspaces\x18\x01 \x03(\x0b\x32\x18.noteflow.WorkspaceProto\x12\x13\n\x0btotal_count\x18\x02 \x01(\x05\".\n\x16SwitchWorkspaceRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\"n\n\x17SwitchWorkspaceResponse\x12\x0f\n\x07success\x18\x01 \x01(\x08\x12+\n\tworkspace\x18\x02 \x01(\x0b\x32\x18.noteflow.WorkspaceProto\x12\x15\n\rerror_message\x18\x03 \x01(\t\"3\n\x1bGetWorkspaceSettingsRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\"j\n\x1eUpdateWorkspaceSettingsRequest\x12\x14\n\x0cworkspace_id\x18\x01 \x01(\t\x12\x32\n\x08settings\x18\x02 \x01(\x0b\x32 .noteflow.WorkspaceSettingsProto*\x8d\x01\n\nUpdateType\x12\x1b\n\x17UPDATE_TYPE_UNSPECIFIED\x10\x00\x12\x17\n\x13UPDATE_TYPE_PARTIAL\x10\x01\x12\x15\n\x11UPDATE_TYPE_FINAL\x10\x02\x12\x19\n\x15UPDATE_TYPE_VAD_START\x10\x03\x12\x17\n\x13UPDATE_TYPE_VAD_END\x10\x04*\xb6\x01\n\x0cMeetingState\x12\x1d\n\x19MEETING_STATE_UNSPECIFIED\x10\x00\x12\x19\n\x15MEETING_STATE_CREATED\x10\x01\x12\x1b\n\x17MEETING_STATE_RECORDING\x10\x02\x12\x19\n\x15MEETING_STATE_STOPPED\x10\x03\x12\x1b\n\x17MEETING_STATE_COMPLETED\x10\x04\x12\x17\n\x13MEETING_STATE_ERROR\x10\x05*`\n\tSortOrder\x12\x1a\n\x16SORT_ORDER_UNSPECIFIED\x10\x00\x12\x1b\n\x17SORT_ORDER_CREATED_DESC\x10\x01\x12\x1a\n\x16SORT_ORDER_CREATED_ASC\x10\x02*^\n\x08Priority\x12\x18\n\x14PRIORITY_UNSPECIFIED\x10\x00\x12\x10\n\x0cPRIORITY_LOW\x10\x01\x12\x13\n\x0fPRIORITY_MEDIUM\x10\x02\x12\x11\n\rPRIORITY_HIGH\x10\x03*P\n\tAsrDevice\x12\x1a\n\x16\x41SR_DEVICE_UNSPECIFIED\x10\x00\x12\x12\n\x0e\x41SR_DEVICE_CPU\x10\x01\x12\x13\n\x0f\x41SR_DEVICE_CUDA\x10\x02*\x89\x01\n\x0e\x41srComputeType\x12 \n\x1c\x41SR_COMPUTE_TYPE_UNSPECIFIED\x10\x00\x12\x19\n\x15\x41SR_COMPUTE_TYPE_INT8\x10\x01\x12\x1c\n\x18\x41SR_COMPUTE_TYPE_FLOAT16\x10\x02\x12\x1c\n\x18\x41SR_COMPUTE_TYPE_FLOAT32\x10\x03*\xa4\x01\n\x0e\x41nnotationType\x12\x1f\n\x1b\x41NNOTATION_TYPE_UNSPECIFIED\x10\x00\x12\x1f\n\x1b\x41NNOTATION_TYPE_ACTION_ITEM\x10\x01\x12\x1c\n\x18\x41NNOTATION_TYPE_DECISION\x10\x02\x12\x18\n\x14\x41NNOTATION_TYPE_NOTE\x10\x03\x12\x18\n\x14\x41NNOTATION_TYPE_RISK\x10\x04*x\n\x0c\x45xportFormat\x12\x1d\n\x19\x45XPORT_FORMAT_UNSPECIFIED\x10\x00\x12\x1a\n\x16\x45XPORT_FORMAT_MARKDOWN\x10\x01\x12\x16\n\x12\x45XPORT_FORMAT_HTML\x10\x02\x12\x15\n\x11\x45XPORT_FORMAT_PDF\x10\x03*\xa1\x01\n\tJobStatus\x12\x1a\n\x16JOB_STATUS_UNSPECIFIED\x10\x00\x12\x15\n\x11JOB_STATUS_QUEUED\x10\x01\x12\x16\n\x12JOB_STATUS_RUNNING\x10\x02\x12\x18\n\x14JOB_STATUS_COMPLETED\x10\x03\x12\x15\n\x11JOB_STATUS_FAILED\x10\x04\x12\x18\n\x14JOB_STATUS_CANCELLED\x10\x05*\xc9\x01\n\x14ProcessingStepStatus\x12\x1f\n\x1bPROCESSING_STEP_UNSPECIFIED\x10\x00\x12\x1b\n\x17PROCESSING_STEP_PENDING\x10\x01\x12\x1b\n\x17PROCESSING_STEP_RUNNING\x10\x02\x12\x1d\n\x19PROCESSING_STEP_COMPLETED\x10\x03\x12\x1a\n\x16PROCESSING_STEP_FAILED\x10\x04\x12\x1b\n\x17PROCESSING_STEP_SKIPPED\x10\x05*z\n\x10ProjectRoleProto\x12\x1c\n\x18PROJECT_ROLE_UNSPECIFIED\x10\x00\x12\x17\n\x13PROJECT_ROLE_VIEWER\x10\x01\x12\x17\n\x13PROJECT_ROLE_EDITOR\x10\x02\x12\x16\n\x12PROJECT_ROLE_ADMIN\x10\x03\x32\xe8<\n\x0fNoteFlowService\x12K\n\x13StreamTranscription\x12\x14.noteflow.AudioChunk\x1a\x1a.noteflow.TranscriptUpdate(\x01\x30\x01\x12\x42\n\rCreateMeeting\x12\x1e.noteflow.CreateMeetingRequest\x1a\x11.noteflow.Meeting\x12>\n\x0bStopMeeting\x12\x1c.noteflow.StopMeetingRequest\x1a\x11.noteflow.Meeting\x12M\n\x0cListMeetings\x12\x1d.noteflow.ListMeetingsRequest\x1a\x1e.noteflow.ListMeetingsResponse\x12<\n\nGetMeeting\x12\x1b.noteflow.GetMeetingRequest\x1a\x11.noteflow.Meeting\x12P\n\rDeleteMeeting\x12\x1e.noteflow.DeleteMeetingRequest\x1a\x1f.noteflow.DeleteMeetingResponse\x12\x46\n\x0fGenerateSummary\x12 .noteflow.GenerateSummaryRequest\x1a\x11.noteflow.Summary\x12w\n\x1aListSummarizationTemplates\x12+.noteflow.ListSummarizationTemplatesRequest\x1a,.noteflow.ListSummarizationTemplatesResponse\x12q\n\x18GetSummarizationTemplate\x12).noteflow.GetSummarizationTemplateRequest\x1a*.noteflow.GetSummarizationTemplateResponse\x12|\n\x1b\x43reateSummarizationTemplate\x12,.noteflow.CreateSummarizationTemplateRequest\x1a/.noteflow.SummarizationTemplateMutationResponse\x12|\n\x1bUpdateSummarizationTemplate\x12,.noteflow.UpdateSummarizationTemplateRequest\x1a/.noteflow.SummarizationTemplateMutationResponse\x12s\n\x1c\x41rchiveSummarizationTemplate\x12-.noteflow.ArchiveSummarizationTemplateRequest\x1a$.noteflow.SummarizationTemplateProto\x12\x8c\x01\n!ListSummarizationTemplateVersions\x12\x32.noteflow.ListSummarizationTemplateVersionsRequest\x1a\x33.noteflow.ListSummarizationTemplateVersionsResponse\x12\x81\x01\n#RestoreSummarizationTemplateVersion\x12\x34.noteflow.RestoreSummarizationTemplateVersionRequest\x1a$.noteflow.SummarizationTemplateProto\x12\x45\n\rAddAnnotation\x12\x1e.noteflow.AddAnnotationRequest\x1a\x14.noteflow.Annotation\x12\x45\n\rGetAnnotation\x12\x1e.noteflow.GetAnnotationRequest\x1a\x14.noteflow.Annotation\x12V\n\x0fListAnnotations\x12 .noteflow.ListAnnotationsRequest\x1a!.noteflow.ListAnnotationsResponse\x12K\n\x10UpdateAnnotation\x12!.noteflow.UpdateAnnotationRequest\x1a\x14.noteflow.Annotation\x12Y\n\x10\x44\x65leteAnnotation\x12!.noteflow.DeleteAnnotationRequest\x1a\".noteflow.DeleteAnnotationResponse\x12Y\n\x10\x45xportTranscript\x12!.noteflow.ExportTranscriptRequest\x1a\".noteflow.ExportTranscriptResponse\x12q\n\x18RefineSpeakerDiarization\x12).noteflow.RefineSpeakerDiarizationRequest\x1a*.noteflow.RefineSpeakerDiarizationResponse\x12P\n\rRenameSpeaker\x12\x1e.noteflow.RenameSpeakerRequest\x1a\x1f.noteflow.RenameSpeakerResponse\x12\x63\n\x17GetDiarizationJobStatus\x12(.noteflow.GetDiarizationJobStatusRequest\x1a\x1e.noteflow.DiarizationJobStatus\x12\x65\n\x14\x43\x61ncelDiarizationJob\x12%.noteflow.CancelDiarizationJobRequest\x1a&.noteflow.CancelDiarizationJobResponse\x12q\n\x18GetActiveDiarizationJobs\x12).noteflow.GetActiveDiarizationJobsRequest\x1a*.noteflow.GetActiveDiarizationJobsResponse\x12\x42\n\rGetServerInfo\x12\x1b.noteflow.ServerInfoRequest\x1a\x14.noteflow.ServerInfo\x12\x62\n\x13GetAsrConfiguration\x12$.noteflow.GetAsrConfigurationRequest\x1a%.noteflow.GetAsrConfigurationResponse\x12k\n\x16UpdateAsrConfiguration\x12\'.noteflow.UpdateAsrConfigurationRequest\x1a(.noteflow.UpdateAsrConfigurationResponse\x12r\n\x1cGetAsrConfigurationJobStatus\x12-.noteflow.GetAsrConfigurationJobStatusRequest\x1a#.noteflow.AsrConfigurationJobStatus\x12V\n\x0f\x45xtractEntities\x12 .noteflow.ExtractEntitiesRequest\x1a!.noteflow.ExtractEntitiesResponse\x12M\n\x0cUpdateEntity\x12\x1d.noteflow.UpdateEntityRequest\x1a\x1e.noteflow.UpdateEntityResponse\x12M\n\x0c\x44\x65leteEntity\x12\x1d.noteflow.DeleteEntityRequest\x1a\x1e.noteflow.DeleteEntityResponse\x12_\n\x12ListCalendarEvents\x12#.noteflow.ListCalendarEventsRequest\x1a$.noteflow.ListCalendarEventsResponse\x12\x65\n\x14GetCalendarProviders\x12%.noteflow.GetCalendarProvidersRequest\x1a&.noteflow.GetCalendarProvidersResponse\x12P\n\rInitiateOAuth\x12\x1e.noteflow.InitiateOAuthRequest\x1a\x1f.noteflow.InitiateOAuthResponse\x12P\n\rCompleteOAuth\x12\x1e.noteflow.CompleteOAuthRequest\x1a\x1f.noteflow.CompleteOAuthResponse\x12q\n\x18GetOAuthConnectionStatus\x12).noteflow.GetOAuthConnectionStatusRequest\x1a*.noteflow.GetOAuthConnectionStatusResponse\x12V\n\x0f\x44isconnectOAuth\x12 .noteflow.DisconnectOAuthRequest\x1a!.noteflow.DisconnectOAuthResponse\x12Q\n\x0fRegisterWebhook\x12 .noteflow.RegisterWebhookRequest\x1a\x1c.noteflow.WebhookConfigProto\x12M\n\x0cListWebhooks\x12\x1d.noteflow.ListWebhooksRequest\x1a\x1e.noteflow.ListWebhooksResponse\x12M\n\rUpdateWebhook\x12\x1e.noteflow.UpdateWebhookRequest\x1a\x1c.noteflow.WebhookConfigProto\x12P\n\rDeleteWebhook\x12\x1e.noteflow.DeleteWebhookRequest\x1a\x1f.noteflow.DeleteWebhookResponse\x12\x65\n\x14GetWebhookDeliveries\x12%.noteflow.GetWebhookDeliveriesRequest\x1a&.noteflow.GetWebhookDeliveriesResponse\x12\\\n\x11GrantCloudConsent\x12\".noteflow.GrantCloudConsentRequest\x1a#.noteflow.GrantCloudConsentResponse\x12_\n\x12RevokeCloudConsent\x12#.noteflow.RevokeCloudConsentRequest\x1a$.noteflow.RevokeCloudConsentResponse\x12h\n\x15GetCloudConsentStatus\x12&.noteflow.GetCloudConsentStatusRequest\x1a\'.noteflow.GetCloudConsentStatusResponse\x12\x62\n\x13SetHuggingFaceToken\x12$.noteflow.SetHuggingFaceTokenRequest\x1a%.noteflow.SetHuggingFaceTokenResponse\x12t\n\x19GetHuggingFaceTokenStatus\x12*.noteflow.GetHuggingFaceTokenStatusRequest\x1a+.noteflow.GetHuggingFaceTokenStatusResponse\x12k\n\x16\x44\x65leteHuggingFaceToken\x12\'.noteflow.DeleteHuggingFaceTokenRequest\x1a(.noteflow.DeleteHuggingFaceTokenResponse\x12q\n\x18ValidateHuggingFaceToken\x12).noteflow.ValidateHuggingFaceTokenRequest\x1a*.noteflow.ValidateHuggingFaceTokenResponse\x12S\n\x0eGetPreferences\x12\x1f.noteflow.GetPreferencesRequest\x1a .noteflow.GetPreferencesResponse\x12S\n\x0eSetPreferences\x12\x1f.noteflow.SetPreferencesRequest\x1a .noteflow.SetPreferencesResponse\x12\x65\n\x14StartIntegrationSync\x12%.noteflow.StartIntegrationSyncRequest\x1a&.noteflow.StartIntegrationSyncResponse\x12P\n\rGetSyncStatus\x12\x1e.noteflow.GetSyncStatusRequest\x1a\x1f.noteflow.GetSyncStatusResponse\x12V\n\x0fListSyncHistory\x12 .noteflow.ListSyncHistoryRequest\x1a!.noteflow.ListSyncHistoryResponse\x12\x62\n\x13GetUserIntegrations\x12$.noteflow.GetUserIntegrationsRequest\x1a%.noteflow.GetUserIntegrationsResponse\x12P\n\rGetRecentLogs\x12\x1e.noteflow.GetRecentLogsRequest\x1a\x1f.noteflow.GetRecentLogsResponse\x12h\n\x15GetPerformanceMetrics\x12&.noteflow.GetPerformanceMetricsRequest\x1a\'.noteflow.GetPerformanceMetricsResponse\x12Z\n\x14RegisterOidcProvider\x12%.noteflow.RegisterOidcProviderRequest\x1a\x1b.noteflow.OidcProviderProto\x12\\\n\x11ListOidcProviders\x12\".noteflow.ListOidcProvidersRequest\x1a#.noteflow.ListOidcProvidersResponse\x12P\n\x0fGetOidcProvider\x12 .noteflow.GetOidcProviderRequest\x1a\x1b.noteflow.OidcProviderProto\x12V\n\x12UpdateOidcProvider\x12#.noteflow.UpdateOidcProviderRequest\x1a\x1b.noteflow.OidcProviderProto\x12_\n\x12\x44\x65leteOidcProvider\x12#.noteflow.DeleteOidcProviderRequest\x1a$.noteflow.DeleteOidcProviderResponse\x12\x65\n\x14RefreshOidcDiscovery\x12%.noteflow.RefreshOidcDiscoveryRequest\x1a&.noteflow.RefreshOidcDiscoveryResponse\x12V\n\x0fListOidcPresets\x12 .noteflow.ListOidcPresetsRequest\x1a!.noteflow.ListOidcPresetsResponse\x12G\n\rCreateProject\x12\x1e.noteflow.CreateProjectRequest\x1a\x16.noteflow.ProjectProto\x12\x41\n\nGetProject\x12\x1b.noteflow.GetProjectRequest\x1a\x16.noteflow.ProjectProto\x12M\n\x10GetProjectBySlug\x12!.noteflow.GetProjectBySlugRequest\x1a\x16.noteflow.ProjectProto\x12M\n\x0cListProjects\x12\x1d.noteflow.ListProjectsRequest\x1a\x1e.noteflow.ListProjectsResponse\x12G\n\rUpdateProject\x12\x1e.noteflow.UpdateProjectRequest\x1a\x16.noteflow.ProjectProto\x12I\n\x0e\x41rchiveProject\x12\x1f.noteflow.ArchiveProjectRequest\x1a\x16.noteflow.ProjectProto\x12I\n\x0eRestoreProject\x12\x1f.noteflow.RestoreProjectRequest\x1a\x16.noteflow.ProjectProto\x12P\n\rDeleteProject\x12\x1e.noteflow.DeleteProjectRequest\x1a\x1f.noteflow.DeleteProjectResponse\x12Y\n\x10SetActiveProject\x12!.noteflow.SetActiveProjectRequest\x1a\".noteflow.SetActiveProjectResponse\x12Y\n\x10GetActiveProject\x12!.noteflow.GetActiveProjectRequest\x1a\".noteflow.GetActiveProjectResponse\x12W\n\x10\x41\x64\x64ProjectMember\x12!.noteflow.AddProjectMemberRequest\x1a .noteflow.ProjectMembershipProto\x12\x65\n\x17UpdateProjectMemberRole\x12(.noteflow.UpdateProjectMemberRoleRequest\x1a .noteflow.ProjectMembershipProto\x12\x62\n\x13RemoveProjectMember\x12$.noteflow.RemoveProjectMemberRequest\x1a%.noteflow.RemoveProjectMemberResponse\x12_\n\x12ListProjectMembers\x12#.noteflow.ListProjectMembersRequest\x1a$.noteflow.ListProjectMembersResponse\x12S\n\x0eGetCurrentUser\x12\x1f.noteflow.GetCurrentUserRequest\x1a .noteflow.GetCurrentUserResponse\x12S\n\x0eListWorkspaces\x12\x1f.noteflow.ListWorkspacesRequest\x1a .noteflow.ListWorkspacesResponse\x12V\n\x0fSwitchWorkspace\x12 .noteflow.SwitchWorkspaceRequest\x1a!.noteflow.SwitchWorkspaceResponse\x12_\n\x14GetWorkspaceSettings\x12%.noteflow.GetWorkspaceSettingsRequest\x1a .noteflow.WorkspaceSettingsProto\x12\x65\n\x17UpdateWorkspaceSettings\x12(.noteflow.UpdateWorkspaceSettingsRequest\x1a .noteflow.WorkspaceSettingsProtob\x06proto3') _globals = globals() _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals) @@ -45,24 +45,28 @@ if not _descriptor._USE_C_DESCRIPTORS: _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_options = b'8\001' _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._loaded_options = None _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_options = b'8\001' - _globals['_UPDATETYPE']._serialized_start=19596 - _globals['_UPDATETYPE']._serialized_end=19737 - _globals['_MEETINGSTATE']._serialized_start=19740 - _globals['_MEETINGSTATE']._serialized_end=19922 - _globals['_SORTORDER']._serialized_start=19924 - _globals['_SORTORDER']._serialized_end=20020 - _globals['_PRIORITY']._serialized_start=20022 - _globals['_PRIORITY']._serialized_end=20116 - _globals['_ANNOTATIONTYPE']._serialized_start=20119 - _globals['_ANNOTATIONTYPE']._serialized_end=20283 - _globals['_EXPORTFORMAT']._serialized_start=20285 - _globals['_EXPORTFORMAT']._serialized_end=20405 - _globals['_JOBSTATUS']._serialized_start=20408 - _globals['_JOBSTATUS']._serialized_end=20569 - _globals['_PROCESSINGSTEPSTATUS']._serialized_start=20572 - _globals['_PROCESSINGSTEPSTATUS']._serialized_end=20773 - _globals['_PROJECTROLEPROTO']._serialized_start=20775 - _globals['_PROJECTROLEPROTO']._serialized_end=20897 + _globals['_UPDATETYPE']._serialized_start=21129 + _globals['_UPDATETYPE']._serialized_end=21270 + _globals['_MEETINGSTATE']._serialized_start=21273 + _globals['_MEETINGSTATE']._serialized_end=21455 + _globals['_SORTORDER']._serialized_start=21457 + _globals['_SORTORDER']._serialized_end=21553 + _globals['_PRIORITY']._serialized_start=21555 + _globals['_PRIORITY']._serialized_end=21649 + _globals['_ASRDEVICE']._serialized_start=21651 + _globals['_ASRDEVICE']._serialized_end=21731 + _globals['_ASRCOMPUTETYPE']._serialized_start=21734 + _globals['_ASRCOMPUTETYPE']._serialized_end=21871 + _globals['_ANNOTATIONTYPE']._serialized_start=21874 + _globals['_ANNOTATIONTYPE']._serialized_end=22038 + _globals['_EXPORTFORMAT']._serialized_start=22040 + _globals['_EXPORTFORMAT']._serialized_end=22160 + _globals['_JOBSTATUS']._serialized_start=22163 + _globals['_JOBSTATUS']._serialized_end=22324 + _globals['_PROCESSINGSTEPSTATUS']._serialized_start=22327 + _globals['_PROCESSINGSTEPSTATUS']._serialized_end=22528 + _globals['_PROJECTROLEPROTO']._serialized_start=22530 + _globals['_PROJECTROLEPROTO']._serialized_end=22652 _globals['_AUDIOCHUNK']._serialized_start=29 _globals['_AUDIOCHUNK']._serialized_end=163 _globals['_CONGESTIONINFO']._serialized_start=165 @@ -133,276 +137,306 @@ if not _descriptor._USE_C_DESCRIPTORS: _globals['_SERVERINFOREQUEST']._serialized_end=4694 _globals['_SERVERINFO']._serialized_start=4697 _globals['_SERVERINFO']._serialized_end=4948 - _globals['_ANNOTATION']._serialized_start=4951 - _globals['_ANNOTATION']._serialized_end=5139 - _globals['_ADDANNOTATIONREQUEST']._serialized_start=5142 - _globals['_ADDANNOTATIONREQUEST']._serialized_end=5308 - _globals['_GETANNOTATIONREQUEST']._serialized_start=5310 - _globals['_GETANNOTATIONREQUEST']._serialized_end=5355 - _globals['_LISTANNOTATIONSREQUEST']._serialized_start=5357 - _globals['_LISTANNOTATIONSREQUEST']._serialized_end=5439 - _globals['_LISTANNOTATIONSRESPONSE']._serialized_start=5441 - _globals['_LISTANNOTATIONSRESPONSE']._serialized_end=5509 - _globals['_UPDATEANNOTATIONREQUEST']._serialized_start=5512 - _globals['_UPDATEANNOTATIONREQUEST']._serialized_end=5684 - _globals['_DELETEANNOTATIONREQUEST']._serialized_start=5686 - _globals['_DELETEANNOTATIONREQUEST']._serialized_end=5734 - _globals['_DELETEANNOTATIONRESPONSE']._serialized_start=5736 - _globals['_DELETEANNOTATIONRESPONSE']._serialized_end=5779 - _globals['_PROCESSINGSTEPSTATE']._serialized_start=5782 - _globals['_PROCESSINGSTEPSTATE']._serialized_end=5916 - _globals['_PROCESSINGSTATUS']._serialized_start=5919 - _globals['_PROCESSINGSTATUS']._serialized_end=6086 - _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_start=6088 - _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_end=6173 - _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_start=6175 - _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_end=6263 - _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_start=6265 - _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_end=6340 - _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_start=6343 - _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_end=6500 - _globals['_RENAMESPEAKERREQUEST']._serialized_start=6502 - _globals['_RENAMESPEAKERREQUEST']._serialized_end=6594 - _globals['_RENAMESPEAKERRESPONSE']._serialized_start=6596 - _globals['_RENAMESPEAKERRESPONSE']._serialized_end=6662 - _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_start=6664 - _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_end=6712 - _globals['_DIARIZATIONJOBSTATUS']._serialized_start=6715 - _globals['_DIARIZATIONJOBSTATUS']._serialized_end=6886 - _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_start=6888 - _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_end=6933 - _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_start=6935 - _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_end=7042 - _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_start=7044 - _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_end=7077 - _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_start=7079 - _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_end=7159 - _globals['_EXTRACTENTITIESREQUEST']._serialized_start=7161 - _globals['_EXTRACTENTITIESREQUEST']._serialized_end=7228 - _globals['_EXTRACTEDENTITY']._serialized_start=7230 - _globals['_EXTRACTEDENTITY']._serialized_end=7351 - _globals['_EXTRACTENTITIESRESPONSE']._serialized_start=7353 - _globals['_EXTRACTENTITIESRESPONSE']._serialized_end=7460 - _globals['_UPDATEENTITYREQUEST']._serialized_start=7462 - _globals['_UPDATEENTITYREQUEST']._serialized_end=7554 - _globals['_UPDATEENTITYRESPONSE']._serialized_start=7556 - _globals['_UPDATEENTITYRESPONSE']._serialized_end=7621 - _globals['_DELETEENTITYREQUEST']._serialized_start=7623 - _globals['_DELETEENTITYREQUEST']._serialized_end=7683 - _globals['_DELETEENTITYRESPONSE']._serialized_start=7685 - _globals['_DELETEENTITYRESPONSE']._serialized_end=7724 - _globals['_CALENDAREVENT']._serialized_start=7727 - _globals['_CALENDAREVENT']._serialized_end=7926 - _globals['_LISTCALENDAREVENTSREQUEST']._serialized_start=7928 - _globals['_LISTCALENDAREVENTSREQUEST']._serialized_end=8009 - _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_start=8011 - _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_end=8101 - _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_start=8103 - _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_end=8132 - _globals['_CALENDARPROVIDER']._serialized_start=8134 - _globals['_CALENDARPROVIDER']._serialized_end=8214 - _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_start=8216 - _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_end=8293 - _globals['_INITIATEOAUTHREQUEST']._serialized_start=8295 - _globals['_INITIATEOAUTHREQUEST']._serialized_end=8383 - _globals['_INITIATEOAUTHRESPONSE']._serialized_start=8385 - _globals['_INITIATEOAUTHRESPONSE']._serialized_end=8441 - _globals['_COMPLETEOAUTHREQUEST']._serialized_start=8443 - _globals['_COMPLETEOAUTHREQUEST']._serialized_end=8512 - _globals['_COMPLETEOAUTHRESPONSE']._serialized_start=8514 - _globals['_COMPLETEOAUTHRESPONSE']._serialized_end=8625 - _globals['_OAUTHCONNECTION']._serialized_start=8628 - _globals['_OAUTHCONNECTION']._serialized_end=8763 - _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_start=8765 - _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_end=8842 - _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_start=8844 - _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_end=8925 - _globals['_DISCONNECTOAUTHREQUEST']._serialized_start=8927 - _globals['_DISCONNECTOAUTHREQUEST']._serialized_end=8995 - _globals['_DISCONNECTOAUTHRESPONSE']._serialized_start=8997 - _globals['_DISCONNECTOAUTHRESPONSE']._serialized_end=9062 - _globals['_REGISTERWEBHOOKREQUEST']._serialized_start=9065 - _globals['_REGISTERWEBHOOKREQUEST']._serialized_end=9211 - _globals['_WEBHOOKCONFIGPROTO']._serialized_start=9214 - _globals['_WEBHOOKCONFIGPROTO']._serialized_end=9409 - _globals['_LISTWEBHOOKSREQUEST']._serialized_start=9411 - _globals['_LISTWEBHOOKSREQUEST']._serialized_end=9454 - _globals['_LISTWEBHOOKSRESPONSE']._serialized_start=9456 - _globals['_LISTWEBHOOKSRESPONSE']._serialized_end=9547 - _globals['_UPDATEWEBHOOKREQUEST']._serialized_start=9550 - _globals['_UPDATEWEBHOOKREQUEST']._serialized_end=9810 - _globals['_DELETEWEBHOOKREQUEST']._serialized_start=9812 - _globals['_DELETEWEBHOOKREQUEST']._serialized_end=9854 - _globals['_DELETEWEBHOOKRESPONSE']._serialized_start=9856 - _globals['_DELETEWEBHOOKRESPONSE']._serialized_end=9896 - _globals['_WEBHOOKDELIVERYPROTO']._serialized_start=9899 - _globals['_WEBHOOKDELIVERYPROTO']._serialized_end=10102 - _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_start=10104 - _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_end=10168 - _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_start=10170 - _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_end=10273 - _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_start=10275 - _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_end=10301 - _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_start=10303 - _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_end=10330 - _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_start=10332 - _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_end=10359 - _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_start=10361 - _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_end=10389 - _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_start=10391 - _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_end=10421 - _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_start=10423 - _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_end=10479 - _globals['_GETPREFERENCESREQUEST']._serialized_start=10481 - _globals['_GETPREFERENCESREQUEST']._serialized_end=10518 - _globals['_GETPREFERENCESRESPONSE']._serialized_start=10521 - _globals['_GETPREFERENCESRESPONSE']._serialized_end=10703 - _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_start=10653 - _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_end=10703 - _globals['_SETPREFERENCESREQUEST']._serialized_start=10706 - _globals['_SETPREFERENCESREQUEST']._serialized_end=10912 - _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_start=10653 - _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_end=10703 - _globals['_SETPREFERENCESRESPONSE']._serialized_start=10915 - _globals['_SETPREFERENCESRESPONSE']._serialized_end=11184 - _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_start=11128 - _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_end=11184 - _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_start=11186 - _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_end=11239 - _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_start=11241 - _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_end=11308 - _globals['_GETSYNCSTATUSREQUEST']._serialized_start=11310 - _globals['_GETSYNCSTATUSREQUEST']._serialized_end=11353 - _globals['_GETSYNCSTATUSRESPONSE']._serialized_start=11356 - _globals['_GETSYNCSTATUSRESPONSE']._serialized_end=11574 - _globals['_LISTSYNCHISTORYREQUEST']._serialized_start=11576 - _globals['_LISTSYNCHISTORYREQUEST']._serialized_end=11655 - _globals['_LISTSYNCHISTORYRESPONSE']._serialized_start=11657 - _globals['_LISTSYNCHISTORYRESPONSE']._serialized_end=11741 - _globals['_SYNCRUNPROTO']._serialized_start=11744 - _globals['_SYNCRUNPROTO']._serialized_end=11918 - _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_start=11920 - _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_end=11948 - _globals['_INTEGRATIONINFO']._serialized_start=11950 - _globals['_INTEGRATIONINFO']._serialized_end=12045 - _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_start=12047 - _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_end=12125 - _globals['_GETRECENTLOGSREQUEST']._serialized_start=12127 - _globals['_GETRECENTLOGSREQUEST']._serialized_end=12195 - _globals['_GETRECENTLOGSRESPONSE']._serialized_start=12197 - _globals['_GETRECENTLOGSRESPONSE']._serialized_end=12259 - _globals['_LOGENTRYPROTO']._serialized_start=12262 - _globals['_LOGENTRYPROTO']._serialized_end=12543 - _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_start=12497 - _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_end=12543 - _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_start=12545 - _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_end=12598 - _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_start=12601 - _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_end=12736 - _globals['_PERFORMANCEMETRICSPOINT']._serialized_start=12739 - _globals['_PERFORMANCEMETRICSPOINT']._serialized_end=12980 - _globals['_CLAIMMAPPINGPROTO']._serialized_start=12983 - _globals['_CLAIMMAPPINGPROTO']._serialized_end=13319 - _globals['_OIDCDISCOVERYPROTO']._serialized_start=13322 - _globals['_OIDCDISCOVERYPROTO']._serialized_end=13697 - _globals['_OIDCPROVIDERPROTO']._serialized_start=13700 - _globals['_OIDCPROVIDERPROTO']._serialized_end=14153 - _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_start=14156 - _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_end=14524 - _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_start=14526 - _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_end=14618 - _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_start=14620 - _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_end=14716 - _globals['_GETOIDCPROVIDERREQUEST']._serialized_start=14718 - _globals['_GETOIDCPROVIDERREQUEST']._serialized_end=14763 - _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_start=14766 - _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_end=15055 - _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_start=15057 - _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_end=15105 - _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_start=15107 - _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_end=15152 - _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_start=15154 - _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_end=15269 - _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_start=15272 - _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_end=15466 - _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_start=15420 - _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_end=15466 - _globals['_LISTOIDCPRESETSREQUEST']._serialized_start=15468 - _globals['_LISTOIDCPRESETSREQUEST']._serialized_end=15492 - _globals['_OIDCPRESETPROTO']._serialized_start=15495 - _globals['_OIDCPRESETPROTO']._serialized_end=15679 - _globals['_LISTOIDCPRESETSRESPONSE']._serialized_start=15681 - _globals['_LISTOIDCPRESETSRESPONSE']._serialized_end=15750 - _globals['_EXPORTRULESPROTO']._serialized_start=15753 - _globals['_EXPORTRULESPROTO']._serialized_end=15987 - _globals['_TRIGGERRULESPROTO']._serialized_start=15990 - _globals['_TRIGGERRULESPROTO']._serialized_end=16126 - _globals['_WORKSPACESETTINGSPROTO']._serialized_start=16129 - _globals['_WORKSPACESETTINGSPROTO']._serialized_end=16422 - _globals['_PROJECTSETTINGSPROTO']._serialized_start=16425 - _globals['_PROJECTSETTINGSPROTO']._serialized_end=16716 - _globals['_PROJECTPROTO']._serialized_start=16719 - _globals['_PROJECTPROTO']._serialized_end=17042 - _globals['_PROJECTMEMBERSHIPPROTO']._serialized_start=17044 - _globals['_PROJECTMEMBERSHIPPROTO']._serialized_end=17166 - _globals['_CREATEPROJECTREQUEST']._serialized_start=17169 - _globals['_CREATEPROJECTREQUEST']._serialized_end=17365 - _globals['_GETPROJECTREQUEST']._serialized_start=17367 - _globals['_GETPROJECTREQUEST']._serialized_end=17406 - _globals['_GETPROJECTBYSLUGREQUEST']._serialized_start=17408 - _globals['_GETPROJECTBYSLUGREQUEST']._serialized_end=17469 - _globals['_LISTPROJECTSREQUEST']._serialized_start=17471 - _globals['_LISTPROJECTSREQUEST']._serialized_end=17571 - _globals['_LISTPROJECTSRESPONSE']._serialized_start=17573 - _globals['_LISTPROJECTSRESPONSE']._serialized_end=17658 - _globals['_UPDATEPROJECTREQUEST']._serialized_start=17661 - _globals['_UPDATEPROJECTREQUEST']._serialized_end=17869 - _globals['_ARCHIVEPROJECTREQUEST']._serialized_start=17871 - _globals['_ARCHIVEPROJECTREQUEST']._serialized_end=17914 - _globals['_RESTOREPROJECTREQUEST']._serialized_start=17916 - _globals['_RESTOREPROJECTREQUEST']._serialized_end=17959 - _globals['_DELETEPROJECTREQUEST']._serialized_start=17961 - _globals['_DELETEPROJECTREQUEST']._serialized_end=18003 - _globals['_DELETEPROJECTRESPONSE']._serialized_start=18005 - _globals['_DELETEPROJECTRESPONSE']._serialized_end=18045 - _globals['_SETACTIVEPROJECTREQUEST']._serialized_start=18047 - _globals['_SETACTIVEPROJECTREQUEST']._serialized_end=18114 - _globals['_SETACTIVEPROJECTRESPONSE']._serialized_start=18116 - _globals['_SETACTIVEPROJECTRESPONSE']._serialized_end=18142 - _globals['_GETACTIVEPROJECTREQUEST']._serialized_start=18144 - _globals['_GETACTIVEPROJECTREQUEST']._serialized_end=18191 - _globals['_GETACTIVEPROJECTRESPONSE']._serialized_start=18193 - _globals['_GETACTIVEPROJECTRESPONSE']._serialized_end=18300 - _globals['_ADDPROJECTMEMBERREQUEST']._serialized_start=18302 - _globals['_ADDPROJECTMEMBERREQUEST']._serialized_end=18406 - _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_start=18408 - _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_end=18519 - _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_start=18521 - _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_end=18586 - _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_start=18588 - _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_end=18634 - _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_start=18636 - _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_end=18714 - _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_start=18716 - _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_end=18816 - _globals['_GETCURRENTUSERREQUEST']._serialized_start=18818 - _globals['_GETCURRENTUSERREQUEST']._serialized_end=18841 - _globals['_GETCURRENTUSERRESPONSE']._serialized_start=18844 - _globals['_GETCURRENTUSERRESPONSE']._serialized_end=19031 - _globals['_WORKSPACEPROTO']._serialized_start=19033 - _globals['_WORKSPACEPROTO']._serialized_end=19123 - _globals['_LISTWORKSPACESREQUEST']._serialized_start=19125 - _globals['_LISTWORKSPACESREQUEST']._serialized_end=19179 - _globals['_LISTWORKSPACESRESPONSE']._serialized_start=19181 - _globals['_LISTWORKSPACESRESPONSE']._serialized_end=19272 - _globals['_SWITCHWORKSPACEREQUEST']._serialized_start=19274 - _globals['_SWITCHWORKSPACEREQUEST']._serialized_end=19320 - _globals['_SWITCHWORKSPACERESPONSE']._serialized_start=19322 - _globals['_SWITCHWORKSPACERESPONSE']._serialized_end=19432 - _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_start=19434 - _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_end=19485 - _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_start=19487 - _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_end=19593 - _globals['_NOTEFLOWSERVICE']._serialized_start=20900 - _globals['_NOTEFLOWSERVICE']._serialized_end=27917 + _globals['_ASRCONFIGURATION']._serialized_start=4951 + _globals['_ASRCONFIGURATION']._serialized_end=5206 + _globals['_GETASRCONFIGURATIONREQUEST']._serialized_start=5208 + _globals['_GETASRCONFIGURATIONREQUEST']._serialized_end=5236 + _globals['_GETASRCONFIGURATIONRESPONSE']._serialized_start=5238 + _globals['_GETASRCONFIGURATIONRESPONSE']._serialized_end=5318 + _globals['_UPDATEASRCONFIGURATIONREQUEST']._serialized_start=5321 + _globals['_UPDATEASRCONFIGURATIONREQUEST']._serialized_end=5515 + _globals['_UPDATEASRCONFIGURATIONRESPONSE']._serialized_start=5517 + _globals['_UPDATEASRCONFIGURATIONRESPONSE']._serialized_end=5643 + _globals['_GETASRCONFIGURATIONJOBSTATUSREQUEST']._serialized_start=5645 + _globals['_GETASRCONFIGURATIONJOBSTATUSREQUEST']._serialized_end=5698 + _globals['_ASRCONFIGURATIONJOBSTATUS']._serialized_start=5701 + _globals['_ASRCONFIGURATIONJOBSTATUS']._serialized_end=5927 + _globals['_ANNOTATION']._serialized_start=5930 + _globals['_ANNOTATION']._serialized_end=6118 + _globals['_ADDANNOTATIONREQUEST']._serialized_start=6121 + _globals['_ADDANNOTATIONREQUEST']._serialized_end=6287 + _globals['_GETANNOTATIONREQUEST']._serialized_start=6289 + _globals['_GETANNOTATIONREQUEST']._serialized_end=6334 + _globals['_LISTANNOTATIONSREQUEST']._serialized_start=6336 + _globals['_LISTANNOTATIONSREQUEST']._serialized_end=6418 + _globals['_LISTANNOTATIONSRESPONSE']._serialized_start=6420 + _globals['_LISTANNOTATIONSRESPONSE']._serialized_end=6488 + _globals['_UPDATEANNOTATIONREQUEST']._serialized_start=6491 + _globals['_UPDATEANNOTATIONREQUEST']._serialized_end=6663 + _globals['_DELETEANNOTATIONREQUEST']._serialized_start=6665 + _globals['_DELETEANNOTATIONREQUEST']._serialized_end=6713 + _globals['_DELETEANNOTATIONRESPONSE']._serialized_start=6715 + _globals['_DELETEANNOTATIONRESPONSE']._serialized_end=6758 + _globals['_PROCESSINGSTEPSTATE']._serialized_start=6761 + _globals['_PROCESSINGSTEPSTATE']._serialized_end=6895 + _globals['_PROCESSINGSTATUS']._serialized_start=6898 + _globals['_PROCESSINGSTATUS']._serialized_end=7065 + _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_start=7067 + _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_end=7152 + _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_start=7154 + _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_end=7242 + _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_start=7244 + _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_end=7319 + _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_start=7322 + _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_end=7479 + _globals['_RENAMESPEAKERREQUEST']._serialized_start=7481 + _globals['_RENAMESPEAKERREQUEST']._serialized_end=7573 + _globals['_RENAMESPEAKERRESPONSE']._serialized_start=7575 + _globals['_RENAMESPEAKERRESPONSE']._serialized_end=7641 + _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_start=7643 + _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_end=7691 + _globals['_DIARIZATIONJOBSTATUS']._serialized_start=7694 + _globals['_DIARIZATIONJOBSTATUS']._serialized_end=7865 + _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_start=7867 + _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_end=7912 + _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_start=7914 + _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_end=8021 + _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_start=8023 + _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_end=8056 + _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_start=8058 + _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_end=8138 + _globals['_EXTRACTENTITIESREQUEST']._serialized_start=8140 + _globals['_EXTRACTENTITIESREQUEST']._serialized_end=8207 + _globals['_EXTRACTEDENTITY']._serialized_start=8209 + _globals['_EXTRACTEDENTITY']._serialized_end=8330 + _globals['_EXTRACTENTITIESRESPONSE']._serialized_start=8332 + _globals['_EXTRACTENTITIESRESPONSE']._serialized_end=8439 + _globals['_UPDATEENTITYREQUEST']._serialized_start=8441 + _globals['_UPDATEENTITYREQUEST']._serialized_end=8533 + _globals['_UPDATEENTITYRESPONSE']._serialized_start=8535 + _globals['_UPDATEENTITYRESPONSE']._serialized_end=8600 + _globals['_DELETEENTITYREQUEST']._serialized_start=8602 + _globals['_DELETEENTITYREQUEST']._serialized_end=8662 + _globals['_DELETEENTITYRESPONSE']._serialized_start=8664 + _globals['_DELETEENTITYRESPONSE']._serialized_end=8703 + _globals['_CALENDAREVENT']._serialized_start=8706 + _globals['_CALENDAREVENT']._serialized_end=8905 + _globals['_LISTCALENDAREVENTSREQUEST']._serialized_start=8907 + _globals['_LISTCALENDAREVENTSREQUEST']._serialized_end=8988 + _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_start=8990 + _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_end=9080 + _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_start=9082 + _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_end=9111 + _globals['_CALENDARPROVIDER']._serialized_start=9113 + _globals['_CALENDARPROVIDER']._serialized_end=9193 + _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_start=9195 + _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_end=9272 + _globals['_INITIATEOAUTHREQUEST']._serialized_start=9274 + _globals['_INITIATEOAUTHREQUEST']._serialized_end=9362 + _globals['_INITIATEOAUTHRESPONSE']._serialized_start=9364 + _globals['_INITIATEOAUTHRESPONSE']._serialized_end=9420 + _globals['_COMPLETEOAUTHREQUEST']._serialized_start=9422 + _globals['_COMPLETEOAUTHREQUEST']._serialized_end=9491 + _globals['_COMPLETEOAUTHRESPONSE']._serialized_start=9493 + _globals['_COMPLETEOAUTHRESPONSE']._serialized_end=9604 + _globals['_OAUTHCONNECTION']._serialized_start=9607 + _globals['_OAUTHCONNECTION']._serialized_end=9742 + _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_start=9744 + _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_end=9821 + _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_start=9823 + _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_end=9904 + _globals['_DISCONNECTOAUTHREQUEST']._serialized_start=9906 + _globals['_DISCONNECTOAUTHREQUEST']._serialized_end=9974 + _globals['_DISCONNECTOAUTHRESPONSE']._serialized_start=9976 + _globals['_DISCONNECTOAUTHRESPONSE']._serialized_end=10041 + _globals['_REGISTERWEBHOOKREQUEST']._serialized_start=10044 + _globals['_REGISTERWEBHOOKREQUEST']._serialized_end=10190 + _globals['_WEBHOOKCONFIGPROTO']._serialized_start=10193 + _globals['_WEBHOOKCONFIGPROTO']._serialized_end=10388 + _globals['_LISTWEBHOOKSREQUEST']._serialized_start=10390 + _globals['_LISTWEBHOOKSREQUEST']._serialized_end=10433 + _globals['_LISTWEBHOOKSRESPONSE']._serialized_start=10435 + _globals['_LISTWEBHOOKSRESPONSE']._serialized_end=10526 + _globals['_UPDATEWEBHOOKREQUEST']._serialized_start=10529 + _globals['_UPDATEWEBHOOKREQUEST']._serialized_end=10789 + _globals['_DELETEWEBHOOKREQUEST']._serialized_start=10791 + _globals['_DELETEWEBHOOKREQUEST']._serialized_end=10833 + _globals['_DELETEWEBHOOKRESPONSE']._serialized_start=10835 + _globals['_DELETEWEBHOOKRESPONSE']._serialized_end=10875 + _globals['_WEBHOOKDELIVERYPROTO']._serialized_start=10878 + _globals['_WEBHOOKDELIVERYPROTO']._serialized_end=11081 + _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_start=11083 + _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_end=11147 + _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_start=11149 + _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_end=11252 + _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_start=11254 + _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_end=11280 + _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_start=11282 + _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_end=11309 + _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_start=11311 + _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_end=11338 + _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_start=11340 + _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_end=11368 + _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_start=11370 + _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_end=11400 + _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_start=11402 + _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_end=11458 + _globals['_SETHUGGINGFACETOKENREQUEST']._serialized_start=11460 + _globals['_SETHUGGINGFACETOKENREQUEST']._serialized_end=11521 + _globals['_SETHUGGINGFACETOKENRESPONSE']._serialized_start=11523 + _globals['_SETHUGGINGFACETOKENRESPONSE']._serialized_end=11643 + _globals['_GETHUGGINGFACETOKENSTATUSREQUEST']._serialized_start=11645 + _globals['_GETHUGGINGFACETOKENSTATUSREQUEST']._serialized_end=11679 + _globals['_GETHUGGINGFACETOKENSTATUSRESPONSE']._serialized_start=11681 + _globals['_GETHUGGINGFACETOKENSTATUSRESPONSE']._serialized_end=11801 + _globals['_DELETEHUGGINGFACETOKENREQUEST']._serialized_start=11803 + _globals['_DELETEHUGGINGFACETOKENREQUEST']._serialized_end=11834 + _globals['_DELETEHUGGINGFACETOKENRESPONSE']._serialized_start=11836 + _globals['_DELETEHUGGINGFACETOKENRESPONSE']._serialized_end=11885 + _globals['_VALIDATEHUGGINGFACETOKENREQUEST']._serialized_start=11887 + _globals['_VALIDATEHUGGINGFACETOKENREQUEST']._serialized_end=11920 + _globals['_VALIDATEHUGGINGFACETOKENRESPONSE']._serialized_start=11922 + _globals['_VALIDATEHUGGINGFACETOKENRESPONSE']._serialized_end=12012 + _globals['_GETPREFERENCESREQUEST']._serialized_start=12014 + _globals['_GETPREFERENCESREQUEST']._serialized_end=12051 + _globals['_GETPREFERENCESRESPONSE']._serialized_start=12054 + _globals['_GETPREFERENCESRESPONSE']._serialized_end=12236 + _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_start=12186 + _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_end=12236 + _globals['_SETPREFERENCESREQUEST']._serialized_start=12239 + _globals['_SETPREFERENCESREQUEST']._serialized_end=12445 + _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_start=12186 + _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_end=12236 + _globals['_SETPREFERENCESRESPONSE']._serialized_start=12448 + _globals['_SETPREFERENCESRESPONSE']._serialized_end=12717 + _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_start=12661 + _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_end=12717 + _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_start=12719 + _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_end=12772 + _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_start=12774 + _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_end=12841 + _globals['_GETSYNCSTATUSREQUEST']._serialized_start=12843 + _globals['_GETSYNCSTATUSREQUEST']._serialized_end=12886 + _globals['_GETSYNCSTATUSRESPONSE']._serialized_start=12889 + _globals['_GETSYNCSTATUSRESPONSE']._serialized_end=13107 + _globals['_LISTSYNCHISTORYREQUEST']._serialized_start=13109 + _globals['_LISTSYNCHISTORYREQUEST']._serialized_end=13188 + _globals['_LISTSYNCHISTORYRESPONSE']._serialized_start=13190 + _globals['_LISTSYNCHISTORYRESPONSE']._serialized_end=13274 + _globals['_SYNCRUNPROTO']._serialized_start=13277 + _globals['_SYNCRUNPROTO']._serialized_end=13451 + _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_start=13453 + _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_end=13481 + _globals['_INTEGRATIONINFO']._serialized_start=13483 + _globals['_INTEGRATIONINFO']._serialized_end=13578 + _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_start=13580 + _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_end=13658 + _globals['_GETRECENTLOGSREQUEST']._serialized_start=13660 + _globals['_GETRECENTLOGSREQUEST']._serialized_end=13728 + _globals['_GETRECENTLOGSRESPONSE']._serialized_start=13730 + _globals['_GETRECENTLOGSRESPONSE']._serialized_end=13792 + _globals['_LOGENTRYPROTO']._serialized_start=13795 + _globals['_LOGENTRYPROTO']._serialized_end=14076 + _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_start=14030 + _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_end=14076 + _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_start=14078 + _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_end=14131 + _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_start=14134 + _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_end=14269 + _globals['_PERFORMANCEMETRICSPOINT']._serialized_start=14272 + _globals['_PERFORMANCEMETRICSPOINT']._serialized_end=14513 + _globals['_CLAIMMAPPINGPROTO']._serialized_start=14516 + _globals['_CLAIMMAPPINGPROTO']._serialized_end=14852 + _globals['_OIDCDISCOVERYPROTO']._serialized_start=14855 + _globals['_OIDCDISCOVERYPROTO']._serialized_end=15230 + _globals['_OIDCPROVIDERPROTO']._serialized_start=15233 + _globals['_OIDCPROVIDERPROTO']._serialized_end=15686 + _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_start=15689 + _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_end=16057 + _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_start=16059 + _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_end=16151 + _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_start=16153 + _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_end=16249 + _globals['_GETOIDCPROVIDERREQUEST']._serialized_start=16251 + _globals['_GETOIDCPROVIDERREQUEST']._serialized_end=16296 + _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_start=16299 + _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_end=16588 + _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_start=16590 + _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_end=16638 + _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_start=16640 + _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_end=16685 + _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_start=16687 + _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_end=16802 + _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_start=16805 + _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_end=16999 + _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_start=16953 + _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_end=16999 + _globals['_LISTOIDCPRESETSREQUEST']._serialized_start=17001 + _globals['_LISTOIDCPRESETSREQUEST']._serialized_end=17025 + _globals['_OIDCPRESETPROTO']._serialized_start=17028 + _globals['_OIDCPRESETPROTO']._serialized_end=17212 + _globals['_LISTOIDCPRESETSRESPONSE']._serialized_start=17214 + _globals['_LISTOIDCPRESETSRESPONSE']._serialized_end=17283 + _globals['_EXPORTRULESPROTO']._serialized_start=17286 + _globals['_EXPORTRULESPROTO']._serialized_end=17520 + _globals['_TRIGGERRULESPROTO']._serialized_start=17523 + _globals['_TRIGGERRULESPROTO']._serialized_end=17659 + _globals['_WORKSPACESETTINGSPROTO']._serialized_start=17662 + _globals['_WORKSPACESETTINGSPROTO']._serialized_end=17955 + _globals['_PROJECTSETTINGSPROTO']._serialized_start=17958 + _globals['_PROJECTSETTINGSPROTO']._serialized_end=18249 + _globals['_PROJECTPROTO']._serialized_start=18252 + _globals['_PROJECTPROTO']._serialized_end=18575 + _globals['_PROJECTMEMBERSHIPPROTO']._serialized_start=18577 + _globals['_PROJECTMEMBERSHIPPROTO']._serialized_end=18699 + _globals['_CREATEPROJECTREQUEST']._serialized_start=18702 + _globals['_CREATEPROJECTREQUEST']._serialized_end=18898 + _globals['_GETPROJECTREQUEST']._serialized_start=18900 + _globals['_GETPROJECTREQUEST']._serialized_end=18939 + _globals['_GETPROJECTBYSLUGREQUEST']._serialized_start=18941 + _globals['_GETPROJECTBYSLUGREQUEST']._serialized_end=19002 + _globals['_LISTPROJECTSREQUEST']._serialized_start=19004 + _globals['_LISTPROJECTSREQUEST']._serialized_end=19104 + _globals['_LISTPROJECTSRESPONSE']._serialized_start=19106 + _globals['_LISTPROJECTSRESPONSE']._serialized_end=19191 + _globals['_UPDATEPROJECTREQUEST']._serialized_start=19194 + _globals['_UPDATEPROJECTREQUEST']._serialized_end=19402 + _globals['_ARCHIVEPROJECTREQUEST']._serialized_start=19404 + _globals['_ARCHIVEPROJECTREQUEST']._serialized_end=19447 + _globals['_RESTOREPROJECTREQUEST']._serialized_start=19449 + _globals['_RESTOREPROJECTREQUEST']._serialized_end=19492 + _globals['_DELETEPROJECTREQUEST']._serialized_start=19494 + _globals['_DELETEPROJECTREQUEST']._serialized_end=19536 + _globals['_DELETEPROJECTRESPONSE']._serialized_start=19538 + _globals['_DELETEPROJECTRESPONSE']._serialized_end=19578 + _globals['_SETACTIVEPROJECTREQUEST']._serialized_start=19580 + _globals['_SETACTIVEPROJECTREQUEST']._serialized_end=19647 + _globals['_SETACTIVEPROJECTRESPONSE']._serialized_start=19649 + _globals['_SETACTIVEPROJECTRESPONSE']._serialized_end=19675 + _globals['_GETACTIVEPROJECTREQUEST']._serialized_start=19677 + _globals['_GETACTIVEPROJECTREQUEST']._serialized_end=19724 + _globals['_GETACTIVEPROJECTRESPONSE']._serialized_start=19726 + _globals['_GETACTIVEPROJECTRESPONSE']._serialized_end=19833 + _globals['_ADDPROJECTMEMBERREQUEST']._serialized_start=19835 + _globals['_ADDPROJECTMEMBERREQUEST']._serialized_end=19939 + _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_start=19941 + _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_end=20052 + _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_start=20054 + _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_end=20119 + _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_start=20121 + _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_end=20167 + _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_start=20169 + _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_end=20247 + _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_start=20249 + _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_end=20349 + _globals['_GETCURRENTUSERREQUEST']._serialized_start=20351 + _globals['_GETCURRENTUSERREQUEST']._serialized_end=20374 + _globals['_GETCURRENTUSERRESPONSE']._serialized_start=20377 + _globals['_GETCURRENTUSERRESPONSE']._serialized_end=20564 + _globals['_WORKSPACEPROTO']._serialized_start=20566 + _globals['_WORKSPACEPROTO']._serialized_end=20656 + _globals['_LISTWORKSPACESREQUEST']._serialized_start=20658 + _globals['_LISTWORKSPACESREQUEST']._serialized_end=20712 + _globals['_LISTWORKSPACESRESPONSE']._serialized_start=20714 + _globals['_LISTWORKSPACESRESPONSE']._serialized_end=20805 + _globals['_SWITCHWORKSPACEREQUEST']._serialized_start=20807 + _globals['_SWITCHWORKSPACEREQUEST']._serialized_end=20853 + _globals['_SWITCHWORKSPACERESPONSE']._serialized_start=20855 + _globals['_SWITCHWORKSPACERESPONSE']._serialized_end=20965 + _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_start=20967 + _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_end=21018 + _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_start=21020 + _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_end=21126 + _globals['_NOTEFLOWSERVICE']._serialized_start=22655 + _globals['_NOTEFLOWSERVICE']._serialized_end=30439 # @@protoc_insertion_point(module_scope) diff --git a/src/noteflow/grpc/proto/noteflow_pb2.pyi b/src/noteflow/grpc/proto/noteflow_pb2.pyi index f2d0089..41cb6c7 100644 --- a/src/noteflow/grpc/proto/noteflow_pb2.pyi +++ b/src/noteflow/grpc/proto/noteflow_pb2.pyi @@ -1,1922 +1,5662 @@ -from google.protobuf.internal import containers as _containers -from google.protobuf.internal import enum_type_wrapper as _enum_type_wrapper -from google.protobuf import descriptor as _descriptor -from google.protobuf import message as _message -from collections.abc import Iterable as _Iterable, Mapping as _Mapping -from typing import ClassVar as _ClassVar, Optional as _Optional, Union as _Union - -DESCRIPTOR: _descriptor.FileDescriptor - -class UpdateType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - UPDATE_TYPE_UNSPECIFIED: _ClassVar[UpdateType] - UPDATE_TYPE_PARTIAL: _ClassVar[UpdateType] - UPDATE_TYPE_FINAL: _ClassVar[UpdateType] - UPDATE_TYPE_VAD_START: _ClassVar[UpdateType] - UPDATE_TYPE_VAD_END: _ClassVar[UpdateType] - -class MeetingState(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - MEETING_STATE_UNSPECIFIED: _ClassVar[MeetingState] - MEETING_STATE_CREATED: _ClassVar[MeetingState] - MEETING_STATE_RECORDING: _ClassVar[MeetingState] - MEETING_STATE_STOPPED: _ClassVar[MeetingState] - MEETING_STATE_COMPLETED: _ClassVar[MeetingState] - MEETING_STATE_ERROR: _ClassVar[MeetingState] - -class SortOrder(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - SORT_ORDER_UNSPECIFIED: _ClassVar[SortOrder] - SORT_ORDER_CREATED_DESC: _ClassVar[SortOrder] - SORT_ORDER_CREATED_ASC: _ClassVar[SortOrder] - -class Priority(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - PRIORITY_UNSPECIFIED: _ClassVar[Priority] - PRIORITY_LOW: _ClassVar[Priority] - PRIORITY_MEDIUM: _ClassVar[Priority] - PRIORITY_HIGH: _ClassVar[Priority] - -class AnnotationType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - ANNOTATION_TYPE_UNSPECIFIED: _ClassVar[AnnotationType] - ANNOTATION_TYPE_ACTION_ITEM: _ClassVar[AnnotationType] - ANNOTATION_TYPE_DECISION: _ClassVar[AnnotationType] - ANNOTATION_TYPE_NOTE: _ClassVar[AnnotationType] - ANNOTATION_TYPE_RISK: _ClassVar[AnnotationType] - -class ExportFormat(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - EXPORT_FORMAT_UNSPECIFIED: _ClassVar[ExportFormat] - EXPORT_FORMAT_MARKDOWN: _ClassVar[ExportFormat] - EXPORT_FORMAT_HTML: _ClassVar[ExportFormat] - EXPORT_FORMAT_PDF: _ClassVar[ExportFormat] - -class JobStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - JOB_STATUS_UNSPECIFIED: _ClassVar[JobStatus] - JOB_STATUS_QUEUED: _ClassVar[JobStatus] - JOB_STATUS_RUNNING: _ClassVar[JobStatus] - JOB_STATUS_COMPLETED: _ClassVar[JobStatus] - JOB_STATUS_FAILED: _ClassVar[JobStatus] - JOB_STATUS_CANCELLED: _ClassVar[JobStatus] - -class ProcessingStepStatus(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - PROCESSING_STEP_UNSPECIFIED: _ClassVar[ProcessingStepStatus] - PROCESSING_STEP_PENDING: _ClassVar[ProcessingStepStatus] - PROCESSING_STEP_RUNNING: _ClassVar[ProcessingStepStatus] - PROCESSING_STEP_COMPLETED: _ClassVar[ProcessingStepStatus] - PROCESSING_STEP_FAILED: _ClassVar[ProcessingStepStatus] - PROCESSING_STEP_SKIPPED: _ClassVar[ProcessingStepStatus] - -class ProjectRoleProto(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): - __slots__ = () - PROJECT_ROLE_UNSPECIFIED: _ClassVar[ProjectRoleProto] - PROJECT_ROLE_VIEWER: _ClassVar[ProjectRoleProto] - PROJECT_ROLE_EDITOR: _ClassVar[ProjectRoleProto] - PROJECT_ROLE_ADMIN: _ClassVar[ProjectRoleProto] -UPDATE_TYPE_UNSPECIFIED: UpdateType -UPDATE_TYPE_PARTIAL: UpdateType -UPDATE_TYPE_FINAL: UpdateType -UPDATE_TYPE_VAD_START: UpdateType -UPDATE_TYPE_VAD_END: UpdateType -MEETING_STATE_UNSPECIFIED: MeetingState -MEETING_STATE_CREATED: MeetingState -MEETING_STATE_RECORDING: MeetingState -MEETING_STATE_STOPPED: MeetingState -MEETING_STATE_COMPLETED: MeetingState -MEETING_STATE_ERROR: MeetingState -SORT_ORDER_UNSPECIFIED: SortOrder -SORT_ORDER_CREATED_DESC: SortOrder -SORT_ORDER_CREATED_ASC: SortOrder -PRIORITY_UNSPECIFIED: Priority -PRIORITY_LOW: Priority -PRIORITY_MEDIUM: Priority -PRIORITY_HIGH: Priority -ANNOTATION_TYPE_UNSPECIFIED: AnnotationType -ANNOTATION_TYPE_ACTION_ITEM: AnnotationType -ANNOTATION_TYPE_DECISION: AnnotationType -ANNOTATION_TYPE_NOTE: AnnotationType -ANNOTATION_TYPE_RISK: AnnotationType -EXPORT_FORMAT_UNSPECIFIED: ExportFormat -EXPORT_FORMAT_MARKDOWN: ExportFormat -EXPORT_FORMAT_HTML: ExportFormat -EXPORT_FORMAT_PDF: ExportFormat -JOB_STATUS_UNSPECIFIED: JobStatus -JOB_STATUS_QUEUED: JobStatus -JOB_STATUS_RUNNING: JobStatus -JOB_STATUS_COMPLETED: JobStatus -JOB_STATUS_FAILED: JobStatus -JOB_STATUS_CANCELLED: JobStatus -PROCESSING_STEP_UNSPECIFIED: ProcessingStepStatus -PROCESSING_STEP_PENDING: ProcessingStepStatus -PROCESSING_STEP_RUNNING: ProcessingStepStatus -PROCESSING_STEP_COMPLETED: ProcessingStepStatus -PROCESSING_STEP_FAILED: ProcessingStepStatus -PROCESSING_STEP_SKIPPED: ProcessingStepStatus -PROJECT_ROLE_UNSPECIFIED: ProjectRoleProto -PROJECT_ROLE_VIEWER: ProjectRoleProto -PROJECT_ROLE_EDITOR: ProjectRoleProto -PROJECT_ROLE_ADMIN: ProjectRoleProto - -class AudioChunk(_message.Message): - __slots__ = ("meeting_id", "audio_data", "timestamp", "sample_rate", "channels", "chunk_sequence") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - AUDIO_DATA_FIELD_NUMBER: _ClassVar[int] - TIMESTAMP_FIELD_NUMBER: _ClassVar[int] - SAMPLE_RATE_FIELD_NUMBER: _ClassVar[int] - CHANNELS_FIELD_NUMBER: _ClassVar[int] - CHUNK_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - audio_data: bytes - timestamp: float - sample_rate: int - channels: int - chunk_sequence: int - def __init__(self, meeting_id: _Optional[str] = ..., audio_data: _Optional[bytes] = ..., timestamp: _Optional[float] = ..., sample_rate: _Optional[int] = ..., channels: _Optional[int] = ..., chunk_sequence: _Optional[int] = ...) -> None: ... - -class CongestionInfo(_message.Message): - __slots__ = ("processing_delay_ms", "queue_depth", "throttle_recommended") - PROCESSING_DELAY_MS_FIELD_NUMBER: _ClassVar[int] - QUEUE_DEPTH_FIELD_NUMBER: _ClassVar[int] - THROTTLE_RECOMMENDED_FIELD_NUMBER: _ClassVar[int] - processing_delay_ms: int - queue_depth: int - throttle_recommended: bool - def __init__(self, processing_delay_ms: _Optional[int] = ..., queue_depth: _Optional[int] = ..., throttle_recommended: bool = ...) -> None: ... - -class TranscriptUpdate(_message.Message): - __slots__ = ("meeting_id", "update_type", "partial_text", "segment", "server_timestamp", "ack_sequence", "congestion") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - UPDATE_TYPE_FIELD_NUMBER: _ClassVar[int] - PARTIAL_TEXT_FIELD_NUMBER: _ClassVar[int] - SEGMENT_FIELD_NUMBER: _ClassVar[int] - SERVER_TIMESTAMP_FIELD_NUMBER: _ClassVar[int] - ACK_SEQUENCE_FIELD_NUMBER: _ClassVar[int] - CONGESTION_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - update_type: UpdateType - partial_text: str - segment: FinalSegment - server_timestamp: float - ack_sequence: int - congestion: CongestionInfo - def __init__(self, meeting_id: _Optional[str] = ..., update_type: _Optional[_Union[UpdateType, str]] = ..., partial_text: _Optional[str] = ..., segment: _Optional[_Union[FinalSegment, _Mapping]] = ..., server_timestamp: _Optional[float] = ..., ack_sequence: _Optional[int] = ..., congestion: _Optional[_Union[CongestionInfo, _Mapping]] = ...) -> None: ... - -class FinalSegment(_message.Message): - __slots__ = ("segment_id", "text", "start_time", "end_time", "words", "language", "language_confidence", "avg_logprob", "no_speech_prob", "speaker_id", "speaker_confidence") - SEGMENT_ID_FIELD_NUMBER: _ClassVar[int] - TEXT_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - WORDS_FIELD_NUMBER: _ClassVar[int] - LANGUAGE_FIELD_NUMBER: _ClassVar[int] - LANGUAGE_CONFIDENCE_FIELD_NUMBER: _ClassVar[int] - AVG_LOGPROB_FIELD_NUMBER: _ClassVar[int] - NO_SPEECH_PROB_FIELD_NUMBER: _ClassVar[int] - SPEAKER_ID_FIELD_NUMBER: _ClassVar[int] - SPEAKER_CONFIDENCE_FIELD_NUMBER: _ClassVar[int] - segment_id: int - text: str - start_time: float - end_time: float - words: _containers.RepeatedCompositeFieldContainer[WordTiming] - language: str - language_confidence: float - avg_logprob: float - no_speech_prob: float - speaker_id: str - speaker_confidence: float - def __init__(self, segment_id: _Optional[int] = ..., text: _Optional[str] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ..., words: _Optional[_Iterable[_Union[WordTiming, _Mapping]]] = ..., language: _Optional[str] = ..., language_confidence: _Optional[float] = ..., avg_logprob: _Optional[float] = ..., no_speech_prob: _Optional[float] = ..., speaker_id: _Optional[str] = ..., speaker_confidence: _Optional[float] = ...) -> None: ... - -class WordTiming(_message.Message): - __slots__ = ("word", "start_time", "end_time", "probability") - WORD_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - PROBABILITY_FIELD_NUMBER: _ClassVar[int] - word: str - start_time: float - end_time: float - probability: float - def __init__(self, word: _Optional[str] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ..., probability: _Optional[float] = ...) -> None: ... - -class Meeting(_message.Message): - __slots__ = ("id", "title", "state", "created_at", "started_at", "ended_at", "duration_seconds", "segments", "summary", "metadata", "project_id", "processing_status") - class MetadataEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - ID_FIELD_NUMBER: _ClassVar[int] - TITLE_FIELD_NUMBER: _ClassVar[int] - STATE_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - STARTED_AT_FIELD_NUMBER: _ClassVar[int] - ENDED_AT_FIELD_NUMBER: _ClassVar[int] - DURATION_SECONDS_FIELD_NUMBER: _ClassVar[int] - SEGMENTS_FIELD_NUMBER: _ClassVar[int] - SUMMARY_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - PROCESSING_STATUS_FIELD_NUMBER: _ClassVar[int] - id: str - title: str - state: MeetingState - created_at: float - started_at: float - ended_at: float - duration_seconds: float - segments: _containers.RepeatedCompositeFieldContainer[FinalSegment] - summary: Summary - metadata: _containers.ScalarMap[str, str] - project_id: str - processing_status: ProcessingStatus - def __init__(self, id: _Optional[str] = ..., title: _Optional[str] = ..., state: _Optional[_Union[MeetingState, str]] = ..., created_at: _Optional[float] = ..., started_at: _Optional[float] = ..., ended_at: _Optional[float] = ..., duration_seconds: _Optional[float] = ..., segments: _Optional[_Iterable[_Union[FinalSegment, _Mapping]]] = ..., summary: _Optional[_Union[Summary, _Mapping]] = ..., metadata: _Optional[_Mapping[str, str]] = ..., project_id: _Optional[str] = ..., processing_status: _Optional[_Union[ProcessingStatus, _Mapping]] = ...) -> None: ... - -class CreateMeetingRequest(_message.Message): - __slots__ = ("title", "metadata", "project_id") - class MetadataEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - TITLE_FIELD_NUMBER: _ClassVar[int] - METADATA_FIELD_NUMBER: _ClassVar[int] - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - title: str - metadata: _containers.ScalarMap[str, str] - project_id: str - def __init__(self, title: _Optional[str] = ..., metadata: _Optional[_Mapping[str, str]] = ..., project_id: _Optional[str] = ...) -> None: ... - -class StopMeetingRequest(_message.Message): - __slots__ = ("meeting_id",) - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - def __init__(self, meeting_id: _Optional[str] = ...) -> None: ... - -class ListMeetingsRequest(_message.Message): - __slots__ = ("states", "limit", "offset", "sort_order", "project_id", "project_ids") - STATES_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - SORT_ORDER_FIELD_NUMBER: _ClassVar[int] - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - PROJECT_IDS_FIELD_NUMBER: _ClassVar[int] - states: _containers.RepeatedScalarFieldContainer[MeetingState] - limit: int - offset: int - sort_order: SortOrder - project_id: str - project_ids: _containers.RepeatedScalarFieldContainer[str] - def __init__(self, states: _Optional[_Iterable[_Union[MeetingState, str]]] = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ..., sort_order: _Optional[_Union[SortOrder, str]] = ..., project_id: _Optional[str] = ..., project_ids: _Optional[_Iterable[str]] = ...) -> None: ... - -class ListMeetingsResponse(_message.Message): - __slots__ = ("meetings", "total_count") - MEETINGS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - meetings: _containers.RepeatedCompositeFieldContainer[Meeting] - total_count: int - def __init__(self, meetings: _Optional[_Iterable[_Union[Meeting, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class GetMeetingRequest(_message.Message): - __slots__ = ("meeting_id", "include_segments", "include_summary") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - INCLUDE_SEGMENTS_FIELD_NUMBER: _ClassVar[int] - INCLUDE_SUMMARY_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - include_segments: bool - include_summary: bool - def __init__(self, meeting_id: _Optional[str] = ..., include_segments: bool = ..., include_summary: bool = ...) -> None: ... - -class DeleteMeetingRequest(_message.Message): - __slots__ = ("meeting_id",) - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - def __init__(self, meeting_id: _Optional[str] = ...) -> None: ... - -class DeleteMeetingResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class Summary(_message.Message): - __slots__ = ("meeting_id", "executive_summary", "key_points", "action_items", "generated_at", "model_version") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - EXECUTIVE_SUMMARY_FIELD_NUMBER: _ClassVar[int] - KEY_POINTS_FIELD_NUMBER: _ClassVar[int] - ACTION_ITEMS_FIELD_NUMBER: _ClassVar[int] - GENERATED_AT_FIELD_NUMBER: _ClassVar[int] - MODEL_VERSION_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - executive_summary: str - key_points: _containers.RepeatedCompositeFieldContainer[KeyPoint] - action_items: _containers.RepeatedCompositeFieldContainer[ActionItem] - generated_at: float - model_version: str - def __init__(self, meeting_id: _Optional[str] = ..., executive_summary: _Optional[str] = ..., key_points: _Optional[_Iterable[_Union[KeyPoint, _Mapping]]] = ..., action_items: _Optional[_Iterable[_Union[ActionItem, _Mapping]]] = ..., generated_at: _Optional[float] = ..., model_version: _Optional[str] = ...) -> None: ... - -class KeyPoint(_message.Message): - __slots__ = ("text", "segment_ids", "start_time", "end_time") - TEXT_FIELD_NUMBER: _ClassVar[int] - SEGMENT_IDS_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - text: str - segment_ids: _containers.RepeatedScalarFieldContainer[int] - start_time: float - end_time: float - def __init__(self, text: _Optional[str] = ..., segment_ids: _Optional[_Iterable[int]] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ...) -> None: ... - -class ActionItem(_message.Message): - __slots__ = ("text", "assignee", "due_date", "priority", "segment_ids") - TEXT_FIELD_NUMBER: _ClassVar[int] - ASSIGNEE_FIELD_NUMBER: _ClassVar[int] - DUE_DATE_FIELD_NUMBER: _ClassVar[int] - PRIORITY_FIELD_NUMBER: _ClassVar[int] - SEGMENT_IDS_FIELD_NUMBER: _ClassVar[int] - text: str - assignee: str - due_date: float - priority: Priority - segment_ids: _containers.RepeatedScalarFieldContainer[int] - def __init__(self, text: _Optional[str] = ..., assignee: _Optional[str] = ..., due_date: _Optional[float] = ..., priority: _Optional[_Union[Priority, str]] = ..., segment_ids: _Optional[_Iterable[int]] = ...) -> None: ... - -class SummarizationOptions(_message.Message): - __slots__ = ("tone", "format", "verbosity", "template_id") - TONE_FIELD_NUMBER: _ClassVar[int] - FORMAT_FIELD_NUMBER: _ClassVar[int] - VERBOSITY_FIELD_NUMBER: _ClassVar[int] - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - tone: str - format: str - verbosity: str - template_id: str - def __init__(self, tone: _Optional[str] = ..., format: _Optional[str] = ..., verbosity: _Optional[str] = ..., template_id: _Optional[str] = ...) -> None: ... - -class GenerateSummaryRequest(_message.Message): - __slots__ = ("meeting_id", "force_regenerate", "options") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - FORCE_REGENERATE_FIELD_NUMBER: _ClassVar[int] - OPTIONS_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - force_regenerate: bool - options: SummarizationOptions - def __init__(self, meeting_id: _Optional[str] = ..., force_regenerate: bool = ..., options: _Optional[_Union[SummarizationOptions, _Mapping]] = ...) -> None: ... - -class SummarizationTemplateProto(_message.Message): - __slots__ = ("id", "workspace_id", "name", "description", "is_system", "is_archived", "current_version_id", "created_at", "updated_at", "created_by", "updated_by") - ID_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - IS_SYSTEM_FIELD_NUMBER: _ClassVar[int] - IS_ARCHIVED_FIELD_NUMBER: _ClassVar[int] - CURRENT_VERSION_ID_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - CREATED_BY_FIELD_NUMBER: _ClassVar[int] - UPDATED_BY_FIELD_NUMBER: _ClassVar[int] - id: str - workspace_id: str - name: str - description: str - is_system: bool - is_archived: bool - current_version_id: str - created_at: int - updated_at: int - created_by: str - updated_by: str - def __init__(self, id: _Optional[str] = ..., workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., is_system: bool = ..., is_archived: bool = ..., current_version_id: _Optional[str] = ..., created_at: _Optional[int] = ..., updated_at: _Optional[int] = ..., created_by: _Optional[str] = ..., updated_by: _Optional[str] = ...) -> None: ... - -class SummarizationTemplateVersionProto(_message.Message): - __slots__ = ("id", "template_id", "version_number", "content", "change_note", "created_at", "created_by") - ID_FIELD_NUMBER: _ClassVar[int] - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - VERSION_NUMBER_FIELD_NUMBER: _ClassVar[int] - CONTENT_FIELD_NUMBER: _ClassVar[int] - CHANGE_NOTE_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - CREATED_BY_FIELD_NUMBER: _ClassVar[int] - id: str - template_id: str - version_number: int - content: str - change_note: str - created_at: int - created_by: str - def __init__(self, id: _Optional[str] = ..., template_id: _Optional[str] = ..., version_number: _Optional[int] = ..., content: _Optional[str] = ..., change_note: _Optional[str] = ..., created_at: _Optional[int] = ..., created_by: _Optional[str] = ...) -> None: ... - -class ListSummarizationTemplatesRequest(_message.Message): - __slots__ = ("workspace_id", "include_system", "include_archived", "limit", "offset") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - INCLUDE_SYSTEM_FIELD_NUMBER: _ClassVar[int] - INCLUDE_ARCHIVED_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - include_system: bool - include_archived: bool - limit: int - offset: int - def __init__(self, workspace_id: _Optional[str] = ..., include_system: bool = ..., include_archived: bool = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ...) -> None: ... - -class ListSummarizationTemplatesResponse(_message.Message): - __slots__ = ("templates", "total_count") - TEMPLATES_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - templates: _containers.RepeatedCompositeFieldContainer[SummarizationTemplateProto] - total_count: int - def __init__(self, templates: _Optional[_Iterable[_Union[SummarizationTemplateProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class GetSummarizationTemplateRequest(_message.Message): - __slots__ = ("template_id", "include_current_version") - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - INCLUDE_CURRENT_VERSION_FIELD_NUMBER: _ClassVar[int] - template_id: str - include_current_version: bool - def __init__(self, template_id: _Optional[str] = ..., include_current_version: bool = ...) -> None: ... - -class GetSummarizationTemplateResponse(_message.Message): - __slots__ = ("template", "current_version") - TEMPLATE_FIELD_NUMBER: _ClassVar[int] - CURRENT_VERSION_FIELD_NUMBER: _ClassVar[int] - template: SummarizationTemplateProto - current_version: SummarizationTemplateVersionProto - def __init__(self, template: _Optional[_Union[SummarizationTemplateProto, _Mapping]] = ..., current_version: _Optional[_Union[SummarizationTemplateVersionProto, _Mapping]] = ...) -> None: ... - -class SummarizationTemplateMutationResponse(_message.Message): - __slots__ = ("template", "version") - TEMPLATE_FIELD_NUMBER: _ClassVar[int] - VERSION_FIELD_NUMBER: _ClassVar[int] - template: SummarizationTemplateProto - version: SummarizationTemplateVersionProto - def __init__(self, template: _Optional[_Union[SummarizationTemplateProto, _Mapping]] = ..., version: _Optional[_Union[SummarizationTemplateVersionProto, _Mapping]] = ...) -> None: ... - -class CreateSummarizationTemplateRequest(_message.Message): - __slots__ = ("workspace_id", "name", "description", "content", "change_note") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - CONTENT_FIELD_NUMBER: _ClassVar[int] - CHANGE_NOTE_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - name: str - description: str - content: str - change_note: str - def __init__(self, workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., content: _Optional[str] = ..., change_note: _Optional[str] = ...) -> None: ... - -class UpdateSummarizationTemplateRequest(_message.Message): - __slots__ = ("template_id", "name", "description", "content", "change_note") - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - CONTENT_FIELD_NUMBER: _ClassVar[int] - CHANGE_NOTE_FIELD_NUMBER: _ClassVar[int] - template_id: str - name: str - description: str - content: str - change_note: str - def __init__(self, template_id: _Optional[str] = ..., name: _Optional[str] = ..., description: _Optional[str] = ..., content: _Optional[str] = ..., change_note: _Optional[str] = ...) -> None: ... - -class ArchiveSummarizationTemplateRequest(_message.Message): - __slots__ = ("template_id",) - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - template_id: str - def __init__(self, template_id: _Optional[str] = ...) -> None: ... - -class ListSummarizationTemplateVersionsRequest(_message.Message): - __slots__ = ("template_id", "limit", "offset") - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - template_id: str - limit: int - offset: int - def __init__(self, template_id: _Optional[str] = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ...) -> None: ... - -class ListSummarizationTemplateVersionsResponse(_message.Message): - __slots__ = ("versions", "total_count") - VERSIONS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - versions: _containers.RepeatedCompositeFieldContainer[SummarizationTemplateVersionProto] - total_count: int - def __init__(self, versions: _Optional[_Iterable[_Union[SummarizationTemplateVersionProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class RestoreSummarizationTemplateVersionRequest(_message.Message): - __slots__ = ("template_id", "version_id") - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - VERSION_ID_FIELD_NUMBER: _ClassVar[int] - template_id: str - version_id: str - def __init__(self, template_id: _Optional[str] = ..., version_id: _Optional[str] = ...) -> None: ... - -class ServerInfoRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class ServerInfo(_message.Message): - __slots__ = ("version", "asr_model", "asr_ready", "supported_sample_rates", "max_chunk_size", "uptime_seconds", "active_meetings", "diarization_enabled", "diarization_ready", "state_version") - VERSION_FIELD_NUMBER: _ClassVar[int] - ASR_MODEL_FIELD_NUMBER: _ClassVar[int] - ASR_READY_FIELD_NUMBER: _ClassVar[int] - SUPPORTED_SAMPLE_RATES_FIELD_NUMBER: _ClassVar[int] - MAX_CHUNK_SIZE_FIELD_NUMBER: _ClassVar[int] - UPTIME_SECONDS_FIELD_NUMBER: _ClassVar[int] - ACTIVE_MEETINGS_FIELD_NUMBER: _ClassVar[int] - DIARIZATION_ENABLED_FIELD_NUMBER: _ClassVar[int] - DIARIZATION_READY_FIELD_NUMBER: _ClassVar[int] - STATE_VERSION_FIELD_NUMBER: _ClassVar[int] - version: str - asr_model: str - asr_ready: bool - supported_sample_rates: _containers.RepeatedScalarFieldContainer[int] - max_chunk_size: int - uptime_seconds: float - active_meetings: int - diarization_enabled: bool - diarization_ready: bool - state_version: int - def __init__(self, version: _Optional[str] = ..., asr_model: _Optional[str] = ..., asr_ready: bool = ..., supported_sample_rates: _Optional[_Iterable[int]] = ..., max_chunk_size: _Optional[int] = ..., uptime_seconds: _Optional[float] = ..., active_meetings: _Optional[int] = ..., diarization_enabled: bool = ..., diarization_ready: bool = ..., state_version: _Optional[int] = ...) -> None: ... - -class Annotation(_message.Message): - __slots__ = ("id", "meeting_id", "annotation_type", "text", "start_time", "end_time", "segment_ids", "created_at") - ID_FIELD_NUMBER: _ClassVar[int] - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - ANNOTATION_TYPE_FIELD_NUMBER: _ClassVar[int] - TEXT_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - SEGMENT_IDS_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - id: str - meeting_id: str - annotation_type: AnnotationType - text: str - start_time: float - end_time: float - segment_ids: _containers.RepeatedScalarFieldContainer[int] - created_at: float - def __init__(self, id: _Optional[str] = ..., meeting_id: _Optional[str] = ..., annotation_type: _Optional[_Union[AnnotationType, str]] = ..., text: _Optional[str] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ..., segment_ids: _Optional[_Iterable[int]] = ..., created_at: _Optional[float] = ...) -> None: ... - -class AddAnnotationRequest(_message.Message): - __slots__ = ("meeting_id", "annotation_type", "text", "start_time", "end_time", "segment_ids") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - ANNOTATION_TYPE_FIELD_NUMBER: _ClassVar[int] - TEXT_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - SEGMENT_IDS_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - annotation_type: AnnotationType - text: str - start_time: float - end_time: float - segment_ids: _containers.RepeatedScalarFieldContainer[int] - def __init__(self, meeting_id: _Optional[str] = ..., annotation_type: _Optional[_Union[AnnotationType, str]] = ..., text: _Optional[str] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ..., segment_ids: _Optional[_Iterable[int]] = ...) -> None: ... - -class GetAnnotationRequest(_message.Message): - __slots__ = ("annotation_id",) - ANNOTATION_ID_FIELD_NUMBER: _ClassVar[int] - annotation_id: str - def __init__(self, annotation_id: _Optional[str] = ...) -> None: ... - -class ListAnnotationsRequest(_message.Message): - __slots__ = ("meeting_id", "start_time", "end_time") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - start_time: float - end_time: float - def __init__(self, meeting_id: _Optional[str] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ...) -> None: ... - -class ListAnnotationsResponse(_message.Message): - __slots__ = ("annotations",) - ANNOTATIONS_FIELD_NUMBER: _ClassVar[int] - annotations: _containers.RepeatedCompositeFieldContainer[Annotation] - def __init__(self, annotations: _Optional[_Iterable[_Union[Annotation, _Mapping]]] = ...) -> None: ... - -class UpdateAnnotationRequest(_message.Message): - __slots__ = ("annotation_id", "annotation_type", "text", "start_time", "end_time", "segment_ids") - ANNOTATION_ID_FIELD_NUMBER: _ClassVar[int] - ANNOTATION_TYPE_FIELD_NUMBER: _ClassVar[int] - TEXT_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - SEGMENT_IDS_FIELD_NUMBER: _ClassVar[int] - annotation_id: str - annotation_type: AnnotationType - text: str - start_time: float - end_time: float - segment_ids: _containers.RepeatedScalarFieldContainer[int] - def __init__(self, annotation_id: _Optional[str] = ..., annotation_type: _Optional[_Union[AnnotationType, str]] = ..., text: _Optional[str] = ..., start_time: _Optional[float] = ..., end_time: _Optional[float] = ..., segment_ids: _Optional[_Iterable[int]] = ...) -> None: ... - -class DeleteAnnotationRequest(_message.Message): - __slots__ = ("annotation_id",) - ANNOTATION_ID_FIELD_NUMBER: _ClassVar[int] - annotation_id: str - def __init__(self, annotation_id: _Optional[str] = ...) -> None: ... - -class DeleteAnnotationResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class ProcessingStepState(_message.Message): - __slots__ = ("status", "error_message", "started_at", "completed_at") - STATUS_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - STARTED_AT_FIELD_NUMBER: _ClassVar[int] - COMPLETED_AT_FIELD_NUMBER: _ClassVar[int] - status: ProcessingStepStatus - error_message: str - started_at: float - completed_at: float - def __init__(self, status: _Optional[_Union[ProcessingStepStatus, str]] = ..., error_message: _Optional[str] = ..., started_at: _Optional[float] = ..., completed_at: _Optional[float] = ...) -> None: ... - -class ProcessingStatus(_message.Message): - __slots__ = ("summary", "entities", "diarization") - SUMMARY_FIELD_NUMBER: _ClassVar[int] - ENTITIES_FIELD_NUMBER: _ClassVar[int] - DIARIZATION_FIELD_NUMBER: _ClassVar[int] - summary: ProcessingStepState - entities: ProcessingStepState - diarization: ProcessingStepState - def __init__(self, summary: _Optional[_Union[ProcessingStepState, _Mapping]] = ..., entities: _Optional[_Union[ProcessingStepState, _Mapping]] = ..., diarization: _Optional[_Union[ProcessingStepState, _Mapping]] = ...) -> None: ... - -class ExportTranscriptRequest(_message.Message): - __slots__ = ("meeting_id", "format") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - FORMAT_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - format: ExportFormat - def __init__(self, meeting_id: _Optional[str] = ..., format: _Optional[_Union[ExportFormat, str]] = ...) -> None: ... - -class ExportTranscriptResponse(_message.Message): - __slots__ = ("content", "format_name", "file_extension") - CONTENT_FIELD_NUMBER: _ClassVar[int] - FORMAT_NAME_FIELD_NUMBER: _ClassVar[int] - FILE_EXTENSION_FIELD_NUMBER: _ClassVar[int] - content: str - format_name: str - file_extension: str - def __init__(self, content: _Optional[str] = ..., format_name: _Optional[str] = ..., file_extension: _Optional[str] = ...) -> None: ... - -class RefineSpeakerDiarizationRequest(_message.Message): - __slots__ = ("meeting_id", "num_speakers") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - NUM_SPEAKERS_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - num_speakers: int - def __init__(self, meeting_id: _Optional[str] = ..., num_speakers: _Optional[int] = ...) -> None: ... - -class RefineSpeakerDiarizationResponse(_message.Message): - __slots__ = ("segments_updated", "speaker_ids", "error_message", "job_id", "status") - SEGMENTS_UPDATED_FIELD_NUMBER: _ClassVar[int] - SPEAKER_IDS_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - JOB_ID_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - segments_updated: int - speaker_ids: _containers.RepeatedScalarFieldContainer[str] - error_message: str - job_id: str - status: JobStatus - def __init__(self, segments_updated: _Optional[int] = ..., speaker_ids: _Optional[_Iterable[str]] = ..., error_message: _Optional[str] = ..., job_id: _Optional[str] = ..., status: _Optional[_Union[JobStatus, str]] = ...) -> None: ... - -class RenameSpeakerRequest(_message.Message): - __slots__ = ("meeting_id", "old_speaker_id", "new_speaker_name") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - OLD_SPEAKER_ID_FIELD_NUMBER: _ClassVar[int] - NEW_SPEAKER_NAME_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - old_speaker_id: str - new_speaker_name: str - def __init__(self, meeting_id: _Optional[str] = ..., old_speaker_id: _Optional[str] = ..., new_speaker_name: _Optional[str] = ...) -> None: ... - -class RenameSpeakerResponse(_message.Message): - __slots__ = ("segments_updated", "success") - SEGMENTS_UPDATED_FIELD_NUMBER: _ClassVar[int] - SUCCESS_FIELD_NUMBER: _ClassVar[int] - segments_updated: int - success: bool - def __init__(self, segments_updated: _Optional[int] = ..., success: bool = ...) -> None: ... - -class GetDiarizationJobStatusRequest(_message.Message): - __slots__ = ("job_id",) - JOB_ID_FIELD_NUMBER: _ClassVar[int] - job_id: str - def __init__(self, job_id: _Optional[str] = ...) -> None: ... - -class DiarizationJobStatus(_message.Message): - __slots__ = ("job_id", "status", "segments_updated", "speaker_ids", "error_message", "progress_percent") - JOB_ID_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - SEGMENTS_UPDATED_FIELD_NUMBER: _ClassVar[int] - SPEAKER_IDS_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - PROGRESS_PERCENT_FIELD_NUMBER: _ClassVar[int] - job_id: str - status: JobStatus - segments_updated: int - speaker_ids: _containers.RepeatedScalarFieldContainer[str] - error_message: str - progress_percent: float - def __init__(self, job_id: _Optional[str] = ..., status: _Optional[_Union[JobStatus, str]] = ..., segments_updated: _Optional[int] = ..., speaker_ids: _Optional[_Iterable[str]] = ..., error_message: _Optional[str] = ..., progress_percent: _Optional[float] = ...) -> None: ... - -class CancelDiarizationJobRequest(_message.Message): - __slots__ = ("job_id",) - JOB_ID_FIELD_NUMBER: _ClassVar[int] - job_id: str - def __init__(self, job_id: _Optional[str] = ...) -> None: ... - -class CancelDiarizationJobResponse(_message.Message): - __slots__ = ("success", "error_message", "status") - SUCCESS_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - success: bool - error_message: str - status: JobStatus - def __init__(self, success: bool = ..., error_message: _Optional[str] = ..., status: _Optional[_Union[JobStatus, str]] = ...) -> None: ... - -class GetActiveDiarizationJobsRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class GetActiveDiarizationJobsResponse(_message.Message): - __slots__ = ("jobs",) - JOBS_FIELD_NUMBER: _ClassVar[int] - jobs: _containers.RepeatedCompositeFieldContainer[DiarizationJobStatus] - def __init__(self, jobs: _Optional[_Iterable[_Union[DiarizationJobStatus, _Mapping]]] = ...) -> None: ... - -class ExtractEntitiesRequest(_message.Message): - __slots__ = ("meeting_id", "force_refresh") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - FORCE_REFRESH_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - force_refresh: bool - def __init__(self, meeting_id: _Optional[str] = ..., force_refresh: bool = ...) -> None: ... - -class ExtractedEntity(_message.Message): - __slots__ = ("id", "text", "category", "segment_ids", "confidence", "is_pinned") - ID_FIELD_NUMBER: _ClassVar[int] - TEXT_FIELD_NUMBER: _ClassVar[int] - CATEGORY_FIELD_NUMBER: _ClassVar[int] - SEGMENT_IDS_FIELD_NUMBER: _ClassVar[int] - CONFIDENCE_FIELD_NUMBER: _ClassVar[int] - IS_PINNED_FIELD_NUMBER: _ClassVar[int] - id: str - text: str - category: str - segment_ids: _containers.RepeatedScalarFieldContainer[int] - confidence: float - is_pinned: bool - def __init__(self, id: _Optional[str] = ..., text: _Optional[str] = ..., category: _Optional[str] = ..., segment_ids: _Optional[_Iterable[int]] = ..., confidence: _Optional[float] = ..., is_pinned: bool = ...) -> None: ... - -class ExtractEntitiesResponse(_message.Message): - __slots__ = ("entities", "total_count", "cached") - ENTITIES_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - CACHED_FIELD_NUMBER: _ClassVar[int] - entities: _containers.RepeatedCompositeFieldContainer[ExtractedEntity] - total_count: int - cached: bool - def __init__(self, entities: _Optional[_Iterable[_Union[ExtractedEntity, _Mapping]]] = ..., total_count: _Optional[int] = ..., cached: bool = ...) -> None: ... - -class UpdateEntityRequest(_message.Message): - __slots__ = ("meeting_id", "entity_id", "text", "category") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - ENTITY_ID_FIELD_NUMBER: _ClassVar[int] - TEXT_FIELD_NUMBER: _ClassVar[int] - CATEGORY_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - entity_id: str - text: str - category: str - def __init__(self, meeting_id: _Optional[str] = ..., entity_id: _Optional[str] = ..., text: _Optional[str] = ..., category: _Optional[str] = ...) -> None: ... - -class UpdateEntityResponse(_message.Message): - __slots__ = ("entity",) - ENTITY_FIELD_NUMBER: _ClassVar[int] - entity: ExtractedEntity - def __init__(self, entity: _Optional[_Union[ExtractedEntity, _Mapping]] = ...) -> None: ... - -class DeleteEntityRequest(_message.Message): - __slots__ = ("meeting_id", "entity_id") - MEETING_ID_FIELD_NUMBER: _ClassVar[int] - ENTITY_ID_FIELD_NUMBER: _ClassVar[int] - meeting_id: str - entity_id: str - def __init__(self, meeting_id: _Optional[str] = ..., entity_id: _Optional[str] = ...) -> None: ... - -class DeleteEntityResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class CalendarEvent(_message.Message): - __slots__ = ("id", "title", "start_time", "end_time", "attendees", "location", "description", "meeting_url", "is_recurring", "provider") - ID_FIELD_NUMBER: _ClassVar[int] - TITLE_FIELD_NUMBER: _ClassVar[int] - START_TIME_FIELD_NUMBER: _ClassVar[int] - END_TIME_FIELD_NUMBER: _ClassVar[int] - ATTENDEES_FIELD_NUMBER: _ClassVar[int] - LOCATION_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - MEETING_URL_FIELD_NUMBER: _ClassVar[int] - IS_RECURRING_FIELD_NUMBER: _ClassVar[int] - PROVIDER_FIELD_NUMBER: _ClassVar[int] - id: str - title: str - start_time: int - end_time: int - attendees: _containers.RepeatedScalarFieldContainer[str] - location: str - description: str - meeting_url: str - is_recurring: bool - provider: str - def __init__(self, id: _Optional[str] = ..., title: _Optional[str] = ..., start_time: _Optional[int] = ..., end_time: _Optional[int] = ..., attendees: _Optional[_Iterable[str]] = ..., location: _Optional[str] = ..., description: _Optional[str] = ..., meeting_url: _Optional[str] = ..., is_recurring: bool = ..., provider: _Optional[str] = ...) -> None: ... - -class ListCalendarEventsRequest(_message.Message): - __slots__ = ("hours_ahead", "limit", "provider") - HOURS_AHEAD_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - PROVIDER_FIELD_NUMBER: _ClassVar[int] - hours_ahead: int - limit: int - provider: str - def __init__(self, hours_ahead: _Optional[int] = ..., limit: _Optional[int] = ..., provider: _Optional[str] = ...) -> None: ... - -class ListCalendarEventsResponse(_message.Message): - __slots__ = ("events", "total_count") - EVENTS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - events: _containers.RepeatedCompositeFieldContainer[CalendarEvent] - total_count: int - def __init__(self, events: _Optional[_Iterable[_Union[CalendarEvent, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class GetCalendarProvidersRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class CalendarProvider(_message.Message): - __slots__ = ("name", "is_authenticated", "display_name") - NAME_FIELD_NUMBER: _ClassVar[int] - IS_AUTHENTICATED_FIELD_NUMBER: _ClassVar[int] - DISPLAY_NAME_FIELD_NUMBER: _ClassVar[int] - name: str - is_authenticated: bool - display_name: str - def __init__(self, name: _Optional[str] = ..., is_authenticated: bool = ..., display_name: _Optional[str] = ...) -> None: ... - -class GetCalendarProvidersResponse(_message.Message): - __slots__ = ("providers",) - PROVIDERS_FIELD_NUMBER: _ClassVar[int] - providers: _containers.RepeatedCompositeFieldContainer[CalendarProvider] - def __init__(self, providers: _Optional[_Iterable[_Union[CalendarProvider, _Mapping]]] = ...) -> None: ... - -class InitiateOAuthRequest(_message.Message): - __slots__ = ("provider", "redirect_uri", "integration_type") - PROVIDER_FIELD_NUMBER: _ClassVar[int] - REDIRECT_URI_FIELD_NUMBER: _ClassVar[int] - INTEGRATION_TYPE_FIELD_NUMBER: _ClassVar[int] - provider: str - redirect_uri: str - integration_type: str - def __init__(self, provider: _Optional[str] = ..., redirect_uri: _Optional[str] = ..., integration_type: _Optional[str] = ...) -> None: ... - -class InitiateOAuthResponse(_message.Message): - __slots__ = ("auth_url", "state") - AUTH_URL_FIELD_NUMBER: _ClassVar[int] - STATE_FIELD_NUMBER: _ClassVar[int] - auth_url: str - state: str - def __init__(self, auth_url: _Optional[str] = ..., state: _Optional[str] = ...) -> None: ... - -class CompleteOAuthRequest(_message.Message): - __slots__ = ("provider", "code", "state") - PROVIDER_FIELD_NUMBER: _ClassVar[int] - CODE_FIELD_NUMBER: _ClassVar[int] - STATE_FIELD_NUMBER: _ClassVar[int] - provider: str - code: str - state: str - def __init__(self, provider: _Optional[str] = ..., code: _Optional[str] = ..., state: _Optional[str] = ...) -> None: ... - -class CompleteOAuthResponse(_message.Message): - __slots__ = ("success", "error_message", "provider_email", "integration_id") - SUCCESS_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - PROVIDER_EMAIL_FIELD_NUMBER: _ClassVar[int] - INTEGRATION_ID_FIELD_NUMBER: _ClassVar[int] - success: bool - error_message: str - provider_email: str - integration_id: str - def __init__(self, success: bool = ..., error_message: _Optional[str] = ..., provider_email: _Optional[str] = ..., integration_id: _Optional[str] = ...) -> None: ... - -class OAuthConnection(_message.Message): - __slots__ = ("provider", "status", "email", "expires_at", "error_message", "integration_type") - PROVIDER_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - EMAIL_FIELD_NUMBER: _ClassVar[int] - EXPIRES_AT_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - INTEGRATION_TYPE_FIELD_NUMBER: _ClassVar[int] - provider: str - status: str - email: str - expires_at: int - error_message: str - integration_type: str - def __init__(self, provider: _Optional[str] = ..., status: _Optional[str] = ..., email: _Optional[str] = ..., expires_at: _Optional[int] = ..., error_message: _Optional[str] = ..., integration_type: _Optional[str] = ...) -> None: ... - -class GetOAuthConnectionStatusRequest(_message.Message): - __slots__ = ("provider", "integration_type") - PROVIDER_FIELD_NUMBER: _ClassVar[int] - INTEGRATION_TYPE_FIELD_NUMBER: _ClassVar[int] - provider: str - integration_type: str - def __init__(self, provider: _Optional[str] = ..., integration_type: _Optional[str] = ...) -> None: ... - -class GetOAuthConnectionStatusResponse(_message.Message): - __slots__ = ("connection",) - CONNECTION_FIELD_NUMBER: _ClassVar[int] - connection: OAuthConnection - def __init__(self, connection: _Optional[_Union[OAuthConnection, _Mapping]] = ...) -> None: ... - -class DisconnectOAuthRequest(_message.Message): - __slots__ = ("provider", "integration_type") - PROVIDER_FIELD_NUMBER: _ClassVar[int] - INTEGRATION_TYPE_FIELD_NUMBER: _ClassVar[int] - provider: str - integration_type: str - def __init__(self, provider: _Optional[str] = ..., integration_type: _Optional[str] = ...) -> None: ... - -class DisconnectOAuthResponse(_message.Message): - __slots__ = ("success", "error_message") - SUCCESS_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - success: bool - error_message: str - def __init__(self, success: bool = ..., error_message: _Optional[str] = ...) -> None: ... - -class RegisterWebhookRequest(_message.Message): - __slots__ = ("workspace_id", "url", "events", "name", "secret", "timeout_ms", "max_retries") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - URL_FIELD_NUMBER: _ClassVar[int] - EVENTS_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SECRET_FIELD_NUMBER: _ClassVar[int] - TIMEOUT_MS_FIELD_NUMBER: _ClassVar[int] - MAX_RETRIES_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - url: str - events: _containers.RepeatedScalarFieldContainer[str] - name: str - secret: str - timeout_ms: int - max_retries: int - def __init__(self, workspace_id: _Optional[str] = ..., url: _Optional[str] = ..., events: _Optional[_Iterable[str]] = ..., name: _Optional[str] = ..., secret: _Optional[str] = ..., timeout_ms: _Optional[int] = ..., max_retries: _Optional[int] = ...) -> None: ... - -class WebhookConfigProto(_message.Message): - __slots__ = ("id", "workspace_id", "name", "url", "events", "enabled", "timeout_ms", "max_retries", "created_at", "updated_at") - ID_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - URL_FIELD_NUMBER: _ClassVar[int] - EVENTS_FIELD_NUMBER: _ClassVar[int] - ENABLED_FIELD_NUMBER: _ClassVar[int] - TIMEOUT_MS_FIELD_NUMBER: _ClassVar[int] - MAX_RETRIES_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - id: str - workspace_id: str - name: str - url: str - events: _containers.RepeatedScalarFieldContainer[str] - enabled: bool - timeout_ms: int - max_retries: int - created_at: int - updated_at: int - def __init__(self, id: _Optional[str] = ..., workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., url: _Optional[str] = ..., events: _Optional[_Iterable[str]] = ..., enabled: bool = ..., timeout_ms: _Optional[int] = ..., max_retries: _Optional[int] = ..., created_at: _Optional[int] = ..., updated_at: _Optional[int] = ...) -> None: ... - -class ListWebhooksRequest(_message.Message): - __slots__ = ("enabled_only",) - ENABLED_ONLY_FIELD_NUMBER: _ClassVar[int] - enabled_only: bool - def __init__(self, enabled_only: bool = ...) -> None: ... - -class ListWebhooksResponse(_message.Message): - __slots__ = ("webhooks", "total_count") - WEBHOOKS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - webhooks: _containers.RepeatedCompositeFieldContainer[WebhookConfigProto] - total_count: int - def __init__(self, webhooks: _Optional[_Iterable[_Union[WebhookConfigProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class UpdateWebhookRequest(_message.Message): - __slots__ = ("webhook_id", "url", "events", "name", "secret", "enabled", "timeout_ms", "max_retries") - WEBHOOK_ID_FIELD_NUMBER: _ClassVar[int] - URL_FIELD_NUMBER: _ClassVar[int] - EVENTS_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SECRET_FIELD_NUMBER: _ClassVar[int] - ENABLED_FIELD_NUMBER: _ClassVar[int] - TIMEOUT_MS_FIELD_NUMBER: _ClassVar[int] - MAX_RETRIES_FIELD_NUMBER: _ClassVar[int] - webhook_id: str - url: str - events: _containers.RepeatedScalarFieldContainer[str] - name: str - secret: str - enabled: bool - timeout_ms: int - max_retries: int - def __init__(self, webhook_id: _Optional[str] = ..., url: _Optional[str] = ..., events: _Optional[_Iterable[str]] = ..., name: _Optional[str] = ..., secret: _Optional[str] = ..., enabled: bool = ..., timeout_ms: _Optional[int] = ..., max_retries: _Optional[int] = ...) -> None: ... - -class DeleteWebhookRequest(_message.Message): - __slots__ = ("webhook_id",) - WEBHOOK_ID_FIELD_NUMBER: _ClassVar[int] - webhook_id: str - def __init__(self, webhook_id: _Optional[str] = ...) -> None: ... - -class DeleteWebhookResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class WebhookDeliveryProto(_message.Message): - __slots__ = ("id", "webhook_id", "event_type", "status_code", "error_message", "attempt_count", "duration_ms", "delivered_at", "succeeded") - ID_FIELD_NUMBER: _ClassVar[int] - WEBHOOK_ID_FIELD_NUMBER: _ClassVar[int] - EVENT_TYPE_FIELD_NUMBER: _ClassVar[int] - STATUS_CODE_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - ATTEMPT_COUNT_FIELD_NUMBER: _ClassVar[int] - DURATION_MS_FIELD_NUMBER: _ClassVar[int] - DELIVERED_AT_FIELD_NUMBER: _ClassVar[int] - SUCCEEDED_FIELD_NUMBER: _ClassVar[int] - id: str - webhook_id: str - event_type: str - status_code: int - error_message: str - attempt_count: int - duration_ms: int - delivered_at: int - succeeded: bool - def __init__(self, id: _Optional[str] = ..., webhook_id: _Optional[str] = ..., event_type: _Optional[str] = ..., status_code: _Optional[int] = ..., error_message: _Optional[str] = ..., attempt_count: _Optional[int] = ..., duration_ms: _Optional[int] = ..., delivered_at: _Optional[int] = ..., succeeded: bool = ...) -> None: ... - -class GetWebhookDeliveriesRequest(_message.Message): - __slots__ = ("webhook_id", "limit") - WEBHOOK_ID_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - webhook_id: str - limit: int - def __init__(self, webhook_id: _Optional[str] = ..., limit: _Optional[int] = ...) -> None: ... - -class GetWebhookDeliveriesResponse(_message.Message): - __slots__ = ("deliveries", "total_count") - DELIVERIES_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - deliveries: _containers.RepeatedCompositeFieldContainer[WebhookDeliveryProto] - total_count: int - def __init__(self, deliveries: _Optional[_Iterable[_Union[WebhookDeliveryProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class GrantCloudConsentRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class GrantCloudConsentResponse(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class RevokeCloudConsentRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class RevokeCloudConsentResponse(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class GetCloudConsentStatusRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class GetCloudConsentStatusResponse(_message.Message): - __slots__ = ("consent_granted",) - CONSENT_GRANTED_FIELD_NUMBER: _ClassVar[int] - consent_granted: bool - def __init__(self, consent_granted: bool = ...) -> None: ... - -class GetPreferencesRequest(_message.Message): - __slots__ = ("keys",) - KEYS_FIELD_NUMBER: _ClassVar[int] - keys: _containers.RepeatedScalarFieldContainer[str] - def __init__(self, keys: _Optional[_Iterable[str]] = ...) -> None: ... - -class GetPreferencesResponse(_message.Message): - __slots__ = ("preferences", "updated_at", "etag") - class PreferencesEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - PREFERENCES_FIELD_NUMBER: _ClassVar[int] - UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - ETAG_FIELD_NUMBER: _ClassVar[int] - preferences: _containers.ScalarMap[str, str] - updated_at: float - etag: str - def __init__(self, preferences: _Optional[_Mapping[str, str]] = ..., updated_at: _Optional[float] = ..., etag: _Optional[str] = ...) -> None: ... - -class SetPreferencesRequest(_message.Message): - __slots__ = ("preferences", "if_match", "client_updated_at", "merge") - class PreferencesEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - PREFERENCES_FIELD_NUMBER: _ClassVar[int] - IF_MATCH_FIELD_NUMBER: _ClassVar[int] - CLIENT_UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - MERGE_FIELD_NUMBER: _ClassVar[int] - preferences: _containers.ScalarMap[str, str] - if_match: str - client_updated_at: float - merge: bool - def __init__(self, preferences: _Optional[_Mapping[str, str]] = ..., if_match: _Optional[str] = ..., client_updated_at: _Optional[float] = ..., merge: bool = ...) -> None: ... - -class SetPreferencesResponse(_message.Message): - __slots__ = ("success", "conflict", "server_preferences", "server_updated_at", "etag", "conflict_message") - class ServerPreferencesEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - SUCCESS_FIELD_NUMBER: _ClassVar[int] - CONFLICT_FIELD_NUMBER: _ClassVar[int] - SERVER_PREFERENCES_FIELD_NUMBER: _ClassVar[int] - SERVER_UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - ETAG_FIELD_NUMBER: _ClassVar[int] - CONFLICT_MESSAGE_FIELD_NUMBER: _ClassVar[int] - success: bool - conflict: bool - server_preferences: _containers.ScalarMap[str, str] - server_updated_at: float - etag: str - conflict_message: str - def __init__(self, success: bool = ..., conflict: bool = ..., server_preferences: _Optional[_Mapping[str, str]] = ..., server_updated_at: _Optional[float] = ..., etag: _Optional[str] = ..., conflict_message: _Optional[str] = ...) -> None: ... - -class StartIntegrationSyncRequest(_message.Message): - __slots__ = ("integration_id",) - INTEGRATION_ID_FIELD_NUMBER: _ClassVar[int] - integration_id: str - def __init__(self, integration_id: _Optional[str] = ...) -> None: ... - -class StartIntegrationSyncResponse(_message.Message): - __slots__ = ("sync_run_id", "status") - SYNC_RUN_ID_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - sync_run_id: str - status: str - def __init__(self, sync_run_id: _Optional[str] = ..., status: _Optional[str] = ...) -> None: ... - -class GetSyncStatusRequest(_message.Message): - __slots__ = ("sync_run_id",) - SYNC_RUN_ID_FIELD_NUMBER: _ClassVar[int] - sync_run_id: str - def __init__(self, sync_run_id: _Optional[str] = ...) -> None: ... - -class GetSyncStatusResponse(_message.Message): - __slots__ = ("status", "items_synced", "items_total", "error_message", "duration_ms", "expires_at", "not_found_reason") - STATUS_FIELD_NUMBER: _ClassVar[int] - ITEMS_SYNCED_FIELD_NUMBER: _ClassVar[int] - ITEMS_TOTAL_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - DURATION_MS_FIELD_NUMBER: _ClassVar[int] - EXPIRES_AT_FIELD_NUMBER: _ClassVar[int] - NOT_FOUND_REASON_FIELD_NUMBER: _ClassVar[int] - status: str - items_synced: int - items_total: int - error_message: str - duration_ms: int - expires_at: str - not_found_reason: str - def __init__(self, status: _Optional[str] = ..., items_synced: _Optional[int] = ..., items_total: _Optional[int] = ..., error_message: _Optional[str] = ..., duration_ms: _Optional[int] = ..., expires_at: _Optional[str] = ..., not_found_reason: _Optional[str] = ...) -> None: ... - -class ListSyncHistoryRequest(_message.Message): - __slots__ = ("integration_id", "limit", "offset") - INTEGRATION_ID_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - integration_id: str - limit: int - offset: int - def __init__(self, integration_id: _Optional[str] = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ...) -> None: ... - -class ListSyncHistoryResponse(_message.Message): - __slots__ = ("runs", "total_count") - RUNS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - runs: _containers.RepeatedCompositeFieldContainer[SyncRunProto] - total_count: int - def __init__(self, runs: _Optional[_Iterable[_Union[SyncRunProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class SyncRunProto(_message.Message): - __slots__ = ("id", "integration_id", "status", "items_synced", "error_message", "duration_ms", "started_at", "completed_at") - ID_FIELD_NUMBER: _ClassVar[int] - INTEGRATION_ID_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - ITEMS_SYNCED_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - DURATION_MS_FIELD_NUMBER: _ClassVar[int] - STARTED_AT_FIELD_NUMBER: _ClassVar[int] - COMPLETED_AT_FIELD_NUMBER: _ClassVar[int] - id: str - integration_id: str - status: str - items_synced: int - error_message: str - duration_ms: int - started_at: str - completed_at: str - def __init__(self, id: _Optional[str] = ..., integration_id: _Optional[str] = ..., status: _Optional[str] = ..., items_synced: _Optional[int] = ..., error_message: _Optional[str] = ..., duration_ms: _Optional[int] = ..., started_at: _Optional[str] = ..., completed_at: _Optional[str] = ...) -> None: ... - -class GetUserIntegrationsRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class IntegrationInfo(_message.Message): - __slots__ = ("id", "name", "type", "status", "workspace_id") - ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - TYPE_FIELD_NUMBER: _ClassVar[int] - STATUS_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - id: str - name: str - type: str - status: str - workspace_id: str - def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., type: _Optional[str] = ..., status: _Optional[str] = ..., workspace_id: _Optional[str] = ...) -> None: ... - -class GetUserIntegrationsResponse(_message.Message): - __slots__ = ("integrations",) - INTEGRATIONS_FIELD_NUMBER: _ClassVar[int] - integrations: _containers.RepeatedCompositeFieldContainer[IntegrationInfo] - def __init__(self, integrations: _Optional[_Iterable[_Union[IntegrationInfo, _Mapping]]] = ...) -> None: ... - -class GetRecentLogsRequest(_message.Message): - __slots__ = ("limit", "level", "source") - LIMIT_FIELD_NUMBER: _ClassVar[int] - LEVEL_FIELD_NUMBER: _ClassVar[int] - SOURCE_FIELD_NUMBER: _ClassVar[int] - limit: int - level: str - source: str - def __init__(self, limit: _Optional[int] = ..., level: _Optional[str] = ..., source: _Optional[str] = ...) -> None: ... - -class GetRecentLogsResponse(_message.Message): - __slots__ = ("logs",) - LOGS_FIELD_NUMBER: _ClassVar[int] - logs: _containers.RepeatedCompositeFieldContainer[LogEntryProto] - def __init__(self, logs: _Optional[_Iterable[_Union[LogEntryProto, _Mapping]]] = ...) -> None: ... - -class LogEntryProto(_message.Message): - __slots__ = ("timestamp", "level", "source", "message", "details", "trace_id", "span_id", "event_type", "operation_id", "entity_id") - class DetailsEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - TIMESTAMP_FIELD_NUMBER: _ClassVar[int] - LEVEL_FIELD_NUMBER: _ClassVar[int] - SOURCE_FIELD_NUMBER: _ClassVar[int] - MESSAGE_FIELD_NUMBER: _ClassVar[int] - DETAILS_FIELD_NUMBER: _ClassVar[int] - TRACE_ID_FIELD_NUMBER: _ClassVar[int] - SPAN_ID_FIELD_NUMBER: _ClassVar[int] - EVENT_TYPE_FIELD_NUMBER: _ClassVar[int] - OPERATION_ID_FIELD_NUMBER: _ClassVar[int] - ENTITY_ID_FIELD_NUMBER: _ClassVar[int] - timestamp: str - level: str - source: str - message: str - details: _containers.ScalarMap[str, str] - trace_id: str - span_id: str - event_type: str - operation_id: str - entity_id: str - def __init__(self, timestamp: _Optional[str] = ..., level: _Optional[str] = ..., source: _Optional[str] = ..., message: _Optional[str] = ..., details: _Optional[_Mapping[str, str]] = ..., trace_id: _Optional[str] = ..., span_id: _Optional[str] = ..., event_type: _Optional[str] = ..., operation_id: _Optional[str] = ..., entity_id: _Optional[str] = ...) -> None: ... - -class GetPerformanceMetricsRequest(_message.Message): - __slots__ = ("history_limit",) - HISTORY_LIMIT_FIELD_NUMBER: _ClassVar[int] - history_limit: int - def __init__(self, history_limit: _Optional[int] = ...) -> None: ... - -class GetPerformanceMetricsResponse(_message.Message): - __slots__ = ("current", "history") - CURRENT_FIELD_NUMBER: _ClassVar[int] - HISTORY_FIELD_NUMBER: _ClassVar[int] - current: PerformanceMetricsPoint - history: _containers.RepeatedCompositeFieldContainer[PerformanceMetricsPoint] - def __init__(self, current: _Optional[_Union[PerformanceMetricsPoint, _Mapping]] = ..., history: _Optional[_Iterable[_Union[PerformanceMetricsPoint, _Mapping]]] = ...) -> None: ... - -class PerformanceMetricsPoint(_message.Message): - __slots__ = ("timestamp", "cpu_percent", "memory_percent", "memory_mb", "disk_percent", "network_bytes_sent", "network_bytes_recv", "process_memory_mb", "active_connections") - TIMESTAMP_FIELD_NUMBER: _ClassVar[int] - CPU_PERCENT_FIELD_NUMBER: _ClassVar[int] - MEMORY_PERCENT_FIELD_NUMBER: _ClassVar[int] - MEMORY_MB_FIELD_NUMBER: _ClassVar[int] - DISK_PERCENT_FIELD_NUMBER: _ClassVar[int] - NETWORK_BYTES_SENT_FIELD_NUMBER: _ClassVar[int] - NETWORK_BYTES_RECV_FIELD_NUMBER: _ClassVar[int] - PROCESS_MEMORY_MB_FIELD_NUMBER: _ClassVar[int] - ACTIVE_CONNECTIONS_FIELD_NUMBER: _ClassVar[int] - timestamp: float - cpu_percent: float - memory_percent: float - memory_mb: float - disk_percent: float - network_bytes_sent: int - network_bytes_recv: int - process_memory_mb: float - active_connections: int - def __init__(self, timestamp: _Optional[float] = ..., cpu_percent: _Optional[float] = ..., memory_percent: _Optional[float] = ..., memory_mb: _Optional[float] = ..., disk_percent: _Optional[float] = ..., network_bytes_sent: _Optional[int] = ..., network_bytes_recv: _Optional[int] = ..., process_memory_mb: _Optional[float] = ..., active_connections: _Optional[int] = ...) -> None: ... - -class ClaimMappingProto(_message.Message): - __slots__ = ("subject_claim", "email_claim", "email_verified_claim", "name_claim", "preferred_username_claim", "groups_claim", "picture_claim", "first_name_claim", "last_name_claim", "phone_claim") - SUBJECT_CLAIM_FIELD_NUMBER: _ClassVar[int] - EMAIL_CLAIM_FIELD_NUMBER: _ClassVar[int] - EMAIL_VERIFIED_CLAIM_FIELD_NUMBER: _ClassVar[int] - NAME_CLAIM_FIELD_NUMBER: _ClassVar[int] - PREFERRED_USERNAME_CLAIM_FIELD_NUMBER: _ClassVar[int] - GROUPS_CLAIM_FIELD_NUMBER: _ClassVar[int] - PICTURE_CLAIM_FIELD_NUMBER: _ClassVar[int] - FIRST_NAME_CLAIM_FIELD_NUMBER: _ClassVar[int] - LAST_NAME_CLAIM_FIELD_NUMBER: _ClassVar[int] - PHONE_CLAIM_FIELD_NUMBER: _ClassVar[int] - subject_claim: str - email_claim: str - email_verified_claim: str - name_claim: str - preferred_username_claim: str - groups_claim: str - picture_claim: str - first_name_claim: str - last_name_claim: str - phone_claim: str - def __init__(self, subject_claim: _Optional[str] = ..., email_claim: _Optional[str] = ..., email_verified_claim: _Optional[str] = ..., name_claim: _Optional[str] = ..., preferred_username_claim: _Optional[str] = ..., groups_claim: _Optional[str] = ..., picture_claim: _Optional[str] = ..., first_name_claim: _Optional[str] = ..., last_name_claim: _Optional[str] = ..., phone_claim: _Optional[str] = ...) -> None: ... - -class OidcDiscoveryProto(_message.Message): - __slots__ = ("issuer", "authorization_endpoint", "token_endpoint", "userinfo_endpoint", "jwks_uri", "end_session_endpoint", "revocation_endpoint", "scopes_supported", "claims_supported", "supports_pkce") - ISSUER_FIELD_NUMBER: _ClassVar[int] - AUTHORIZATION_ENDPOINT_FIELD_NUMBER: _ClassVar[int] - TOKEN_ENDPOINT_FIELD_NUMBER: _ClassVar[int] - USERINFO_ENDPOINT_FIELD_NUMBER: _ClassVar[int] - JWKS_URI_FIELD_NUMBER: _ClassVar[int] - END_SESSION_ENDPOINT_FIELD_NUMBER: _ClassVar[int] - REVOCATION_ENDPOINT_FIELD_NUMBER: _ClassVar[int] - SCOPES_SUPPORTED_FIELD_NUMBER: _ClassVar[int] - CLAIMS_SUPPORTED_FIELD_NUMBER: _ClassVar[int] - SUPPORTS_PKCE_FIELD_NUMBER: _ClassVar[int] - issuer: str - authorization_endpoint: str - token_endpoint: str - userinfo_endpoint: str - jwks_uri: str - end_session_endpoint: str - revocation_endpoint: str - scopes_supported: _containers.RepeatedScalarFieldContainer[str] - claims_supported: _containers.RepeatedScalarFieldContainer[str] - supports_pkce: bool - def __init__(self, issuer: _Optional[str] = ..., authorization_endpoint: _Optional[str] = ..., token_endpoint: _Optional[str] = ..., userinfo_endpoint: _Optional[str] = ..., jwks_uri: _Optional[str] = ..., end_session_endpoint: _Optional[str] = ..., revocation_endpoint: _Optional[str] = ..., scopes_supported: _Optional[_Iterable[str]] = ..., claims_supported: _Optional[_Iterable[str]] = ..., supports_pkce: bool = ...) -> None: ... - -class OidcProviderProto(_message.Message): - __slots__ = ("id", "workspace_id", "name", "preset", "issuer_url", "client_id", "enabled", "discovery", "claim_mapping", "scopes", "require_email_verified", "allowed_groups", "created_at", "updated_at", "discovery_refreshed_at", "warnings") - ID_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - PRESET_FIELD_NUMBER: _ClassVar[int] - ISSUER_URL_FIELD_NUMBER: _ClassVar[int] - CLIENT_ID_FIELD_NUMBER: _ClassVar[int] - ENABLED_FIELD_NUMBER: _ClassVar[int] - DISCOVERY_FIELD_NUMBER: _ClassVar[int] - CLAIM_MAPPING_FIELD_NUMBER: _ClassVar[int] - SCOPES_FIELD_NUMBER: _ClassVar[int] - REQUIRE_EMAIL_VERIFIED_FIELD_NUMBER: _ClassVar[int] - ALLOWED_GROUPS_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - DISCOVERY_REFRESHED_AT_FIELD_NUMBER: _ClassVar[int] - WARNINGS_FIELD_NUMBER: _ClassVar[int] - id: str - workspace_id: str - name: str - preset: str - issuer_url: str - client_id: str - enabled: bool - discovery: OidcDiscoveryProto - claim_mapping: ClaimMappingProto - scopes: _containers.RepeatedScalarFieldContainer[str] - require_email_verified: bool - allowed_groups: _containers.RepeatedScalarFieldContainer[str] - created_at: int - updated_at: int - discovery_refreshed_at: int - warnings: _containers.RepeatedScalarFieldContainer[str] - def __init__(self, id: _Optional[str] = ..., workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., preset: _Optional[str] = ..., issuer_url: _Optional[str] = ..., client_id: _Optional[str] = ..., enabled: bool = ..., discovery: _Optional[_Union[OidcDiscoveryProto, _Mapping]] = ..., claim_mapping: _Optional[_Union[ClaimMappingProto, _Mapping]] = ..., scopes: _Optional[_Iterable[str]] = ..., require_email_verified: bool = ..., allowed_groups: _Optional[_Iterable[str]] = ..., created_at: _Optional[int] = ..., updated_at: _Optional[int] = ..., discovery_refreshed_at: _Optional[int] = ..., warnings: _Optional[_Iterable[str]] = ...) -> None: ... - -class RegisterOidcProviderRequest(_message.Message): - __slots__ = ("workspace_id", "name", "issuer_url", "client_id", "client_secret", "preset", "scopes", "claim_mapping", "allowed_groups", "require_email_verified", "auto_discover") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - ISSUER_URL_FIELD_NUMBER: _ClassVar[int] - CLIENT_ID_FIELD_NUMBER: _ClassVar[int] - CLIENT_SECRET_FIELD_NUMBER: _ClassVar[int] - PRESET_FIELD_NUMBER: _ClassVar[int] - SCOPES_FIELD_NUMBER: _ClassVar[int] - CLAIM_MAPPING_FIELD_NUMBER: _ClassVar[int] - ALLOWED_GROUPS_FIELD_NUMBER: _ClassVar[int] - REQUIRE_EMAIL_VERIFIED_FIELD_NUMBER: _ClassVar[int] - AUTO_DISCOVER_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - name: str - issuer_url: str - client_id: str - client_secret: str - preset: str - scopes: _containers.RepeatedScalarFieldContainer[str] - claim_mapping: ClaimMappingProto - allowed_groups: _containers.RepeatedScalarFieldContainer[str] - require_email_verified: bool - auto_discover: bool - def __init__(self, workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., issuer_url: _Optional[str] = ..., client_id: _Optional[str] = ..., client_secret: _Optional[str] = ..., preset: _Optional[str] = ..., scopes: _Optional[_Iterable[str]] = ..., claim_mapping: _Optional[_Union[ClaimMappingProto, _Mapping]] = ..., allowed_groups: _Optional[_Iterable[str]] = ..., require_email_verified: bool = ..., auto_discover: bool = ...) -> None: ... - -class ListOidcProvidersRequest(_message.Message): - __slots__ = ("workspace_id", "enabled_only") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - ENABLED_ONLY_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - enabled_only: bool - def __init__(self, workspace_id: _Optional[str] = ..., enabled_only: bool = ...) -> None: ... - -class ListOidcProvidersResponse(_message.Message): - __slots__ = ("providers", "total_count") - PROVIDERS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - providers: _containers.RepeatedCompositeFieldContainer[OidcProviderProto] - total_count: int - def __init__(self, providers: _Optional[_Iterable[_Union[OidcProviderProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class GetOidcProviderRequest(_message.Message): - __slots__ = ("provider_id",) - PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] - provider_id: str - def __init__(self, provider_id: _Optional[str] = ...) -> None: ... - -class UpdateOidcProviderRequest(_message.Message): - __slots__ = ("provider_id", "name", "scopes", "claim_mapping", "allowed_groups", "require_email_verified", "enabled") - PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SCOPES_FIELD_NUMBER: _ClassVar[int] - CLAIM_MAPPING_FIELD_NUMBER: _ClassVar[int] - ALLOWED_GROUPS_FIELD_NUMBER: _ClassVar[int] - REQUIRE_EMAIL_VERIFIED_FIELD_NUMBER: _ClassVar[int] - ENABLED_FIELD_NUMBER: _ClassVar[int] - provider_id: str - name: str - scopes: _containers.RepeatedScalarFieldContainer[str] - claim_mapping: ClaimMappingProto - allowed_groups: _containers.RepeatedScalarFieldContainer[str] - require_email_verified: bool - enabled: bool - def __init__(self, provider_id: _Optional[str] = ..., name: _Optional[str] = ..., scopes: _Optional[_Iterable[str]] = ..., claim_mapping: _Optional[_Union[ClaimMappingProto, _Mapping]] = ..., allowed_groups: _Optional[_Iterable[str]] = ..., require_email_verified: bool = ..., enabled: bool = ...) -> None: ... - -class DeleteOidcProviderRequest(_message.Message): - __slots__ = ("provider_id",) - PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] - provider_id: str - def __init__(self, provider_id: _Optional[str] = ...) -> None: ... - -class DeleteOidcProviderResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class RefreshOidcDiscoveryRequest(_message.Message): - __slots__ = ("provider_id", "workspace_id") - PROVIDER_ID_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - provider_id: str - workspace_id: str - def __init__(self, provider_id: _Optional[str] = ..., workspace_id: _Optional[str] = ...) -> None: ... - -class RefreshOidcDiscoveryResponse(_message.Message): - __slots__ = ("results", "success_count", "failure_count") - class ResultsEntry(_message.Message): - __slots__ = ("key", "value") - KEY_FIELD_NUMBER: _ClassVar[int] - VALUE_FIELD_NUMBER: _ClassVar[int] - key: str - value: str - def __init__(self, key: _Optional[str] = ..., value: _Optional[str] = ...) -> None: ... - RESULTS_FIELD_NUMBER: _ClassVar[int] - SUCCESS_COUNT_FIELD_NUMBER: _ClassVar[int] - FAILURE_COUNT_FIELD_NUMBER: _ClassVar[int] - results: _containers.ScalarMap[str, str] - success_count: int - failure_count: int - def __init__(self, results: _Optional[_Mapping[str, str]] = ..., success_count: _Optional[int] = ..., failure_count: _Optional[int] = ...) -> None: ... - -class ListOidcPresetsRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class OidcPresetProto(_message.Message): - __slots__ = ("preset", "display_name", "description", "default_scopes", "documentation_url", "notes") - PRESET_FIELD_NUMBER: _ClassVar[int] - DISPLAY_NAME_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - DEFAULT_SCOPES_FIELD_NUMBER: _ClassVar[int] - DOCUMENTATION_URL_FIELD_NUMBER: _ClassVar[int] - NOTES_FIELD_NUMBER: _ClassVar[int] - preset: str - display_name: str - description: str - default_scopes: _containers.RepeatedScalarFieldContainer[str] - documentation_url: str - notes: str - def __init__(self, preset: _Optional[str] = ..., display_name: _Optional[str] = ..., description: _Optional[str] = ..., default_scopes: _Optional[_Iterable[str]] = ..., documentation_url: _Optional[str] = ..., notes: _Optional[str] = ...) -> None: ... - -class ListOidcPresetsResponse(_message.Message): - __slots__ = ("presets",) - PRESETS_FIELD_NUMBER: _ClassVar[int] - presets: _containers.RepeatedCompositeFieldContainer[OidcPresetProto] - def __init__(self, presets: _Optional[_Iterable[_Union[OidcPresetProto, _Mapping]]] = ...) -> None: ... - -class ExportRulesProto(_message.Message): - __slots__ = ("default_format", "include_audio", "include_timestamps", "template_id") - DEFAULT_FORMAT_FIELD_NUMBER: _ClassVar[int] - INCLUDE_AUDIO_FIELD_NUMBER: _ClassVar[int] - INCLUDE_TIMESTAMPS_FIELD_NUMBER: _ClassVar[int] - TEMPLATE_ID_FIELD_NUMBER: _ClassVar[int] - default_format: ExportFormat - include_audio: bool - include_timestamps: bool - template_id: str - def __init__(self, default_format: _Optional[_Union[ExportFormat, str]] = ..., include_audio: bool = ..., include_timestamps: bool = ..., template_id: _Optional[str] = ...) -> None: ... - -class TriggerRulesProto(_message.Message): - __slots__ = ("auto_start_enabled", "calendar_match_patterns", "app_match_patterns") - AUTO_START_ENABLED_FIELD_NUMBER: _ClassVar[int] - CALENDAR_MATCH_PATTERNS_FIELD_NUMBER: _ClassVar[int] - APP_MATCH_PATTERNS_FIELD_NUMBER: _ClassVar[int] - auto_start_enabled: bool - calendar_match_patterns: _containers.RepeatedScalarFieldContainer[str] - app_match_patterns: _containers.RepeatedScalarFieldContainer[str] - def __init__(self, auto_start_enabled: bool = ..., calendar_match_patterns: _Optional[_Iterable[str]] = ..., app_match_patterns: _Optional[_Iterable[str]] = ...) -> None: ... - -class WorkspaceSettingsProto(_message.Message): - __slots__ = ("export_rules", "trigger_rules", "rag_enabled", "default_summarization_template") - EXPORT_RULES_FIELD_NUMBER: _ClassVar[int] - TRIGGER_RULES_FIELD_NUMBER: _ClassVar[int] - RAG_ENABLED_FIELD_NUMBER: _ClassVar[int] - DEFAULT_SUMMARIZATION_TEMPLATE_FIELD_NUMBER: _ClassVar[int] - export_rules: ExportRulesProto - trigger_rules: TriggerRulesProto - rag_enabled: bool - default_summarization_template: str - def __init__(self, export_rules: _Optional[_Union[ExportRulesProto, _Mapping]] = ..., trigger_rules: _Optional[_Union[TriggerRulesProto, _Mapping]] = ..., rag_enabled: bool = ..., default_summarization_template: _Optional[str] = ...) -> None: ... - -class ProjectSettingsProto(_message.Message): - __slots__ = ("export_rules", "trigger_rules", "rag_enabled", "default_summarization_template") - EXPORT_RULES_FIELD_NUMBER: _ClassVar[int] - TRIGGER_RULES_FIELD_NUMBER: _ClassVar[int] - RAG_ENABLED_FIELD_NUMBER: _ClassVar[int] - DEFAULT_SUMMARIZATION_TEMPLATE_FIELD_NUMBER: _ClassVar[int] - export_rules: ExportRulesProto - trigger_rules: TriggerRulesProto - rag_enabled: bool - default_summarization_template: str - def __init__(self, export_rules: _Optional[_Union[ExportRulesProto, _Mapping]] = ..., trigger_rules: _Optional[_Union[TriggerRulesProto, _Mapping]] = ..., rag_enabled: bool = ..., default_summarization_template: _Optional[str] = ...) -> None: ... - -class ProjectProto(_message.Message): - __slots__ = ("id", "workspace_id", "name", "slug", "description", "is_default", "is_archived", "settings", "created_at", "updated_at", "archived_at") - ID_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SLUG_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - IS_DEFAULT_FIELD_NUMBER: _ClassVar[int] - IS_ARCHIVED_FIELD_NUMBER: _ClassVar[int] - SETTINGS_FIELD_NUMBER: _ClassVar[int] - CREATED_AT_FIELD_NUMBER: _ClassVar[int] - UPDATED_AT_FIELD_NUMBER: _ClassVar[int] - ARCHIVED_AT_FIELD_NUMBER: _ClassVar[int] - id: str - workspace_id: str - name: str - slug: str - description: str - is_default: bool - is_archived: bool - settings: ProjectSettingsProto - created_at: int - updated_at: int - archived_at: int - def __init__(self, id: _Optional[str] = ..., workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., slug: _Optional[str] = ..., description: _Optional[str] = ..., is_default: bool = ..., is_archived: bool = ..., settings: _Optional[_Union[ProjectSettingsProto, _Mapping]] = ..., created_at: _Optional[int] = ..., updated_at: _Optional[int] = ..., archived_at: _Optional[int] = ...) -> None: ... - -class ProjectMembershipProto(_message.Message): - __slots__ = ("project_id", "user_id", "role", "joined_at") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - USER_ID_FIELD_NUMBER: _ClassVar[int] - ROLE_FIELD_NUMBER: _ClassVar[int] - JOINED_AT_FIELD_NUMBER: _ClassVar[int] - project_id: str - user_id: str - role: ProjectRoleProto - joined_at: int - def __init__(self, project_id: _Optional[str] = ..., user_id: _Optional[str] = ..., role: _Optional[_Union[ProjectRoleProto, str]] = ..., joined_at: _Optional[int] = ...) -> None: ... - -class CreateProjectRequest(_message.Message): - __slots__ = ("workspace_id", "name", "slug", "description", "settings") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SLUG_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - SETTINGS_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - name: str - slug: str - description: str - settings: ProjectSettingsProto - def __init__(self, workspace_id: _Optional[str] = ..., name: _Optional[str] = ..., slug: _Optional[str] = ..., description: _Optional[str] = ..., settings: _Optional[_Union[ProjectSettingsProto, _Mapping]] = ...) -> None: ... - -class GetProjectRequest(_message.Message): - __slots__ = ("project_id",) - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - project_id: str - def __init__(self, project_id: _Optional[str] = ...) -> None: ... - -class GetProjectBySlugRequest(_message.Message): - __slots__ = ("workspace_id", "slug") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - SLUG_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - slug: str - def __init__(self, workspace_id: _Optional[str] = ..., slug: _Optional[str] = ...) -> None: ... - -class ListProjectsRequest(_message.Message): - __slots__ = ("workspace_id", "include_archived", "limit", "offset") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - INCLUDE_ARCHIVED_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - include_archived: bool - limit: int - offset: int - def __init__(self, workspace_id: _Optional[str] = ..., include_archived: bool = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ...) -> None: ... - -class ListProjectsResponse(_message.Message): - __slots__ = ("projects", "total_count") - PROJECTS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - projects: _containers.RepeatedCompositeFieldContainer[ProjectProto] - total_count: int - def __init__(self, projects: _Optional[_Iterable[_Union[ProjectProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class UpdateProjectRequest(_message.Message): - __slots__ = ("project_id", "name", "slug", "description", "settings") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SLUG_FIELD_NUMBER: _ClassVar[int] - DESCRIPTION_FIELD_NUMBER: _ClassVar[int] - SETTINGS_FIELD_NUMBER: _ClassVar[int] - project_id: str - name: str - slug: str - description: str - settings: ProjectSettingsProto - def __init__(self, project_id: _Optional[str] = ..., name: _Optional[str] = ..., slug: _Optional[str] = ..., description: _Optional[str] = ..., settings: _Optional[_Union[ProjectSettingsProto, _Mapping]] = ...) -> None: ... - -class ArchiveProjectRequest(_message.Message): - __slots__ = ("project_id",) - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - project_id: str - def __init__(self, project_id: _Optional[str] = ...) -> None: ... - -class RestoreProjectRequest(_message.Message): - __slots__ = ("project_id",) - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - project_id: str - def __init__(self, project_id: _Optional[str] = ...) -> None: ... - -class DeleteProjectRequest(_message.Message): - __slots__ = ("project_id",) - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - project_id: str - def __init__(self, project_id: _Optional[str] = ...) -> None: ... - -class DeleteProjectResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class SetActiveProjectRequest(_message.Message): - __slots__ = ("workspace_id", "project_id") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - project_id: str - def __init__(self, workspace_id: _Optional[str] = ..., project_id: _Optional[str] = ...) -> None: ... - -class SetActiveProjectResponse(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class GetActiveProjectRequest(_message.Message): - __slots__ = ("workspace_id",) - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - def __init__(self, workspace_id: _Optional[str] = ...) -> None: ... - -class GetActiveProjectResponse(_message.Message): - __slots__ = ("project_id", "project") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - PROJECT_FIELD_NUMBER: _ClassVar[int] - project_id: str - project: ProjectProto - def __init__(self, project_id: _Optional[str] = ..., project: _Optional[_Union[ProjectProto, _Mapping]] = ...) -> None: ... - -class AddProjectMemberRequest(_message.Message): - __slots__ = ("project_id", "user_id", "role") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - USER_ID_FIELD_NUMBER: _ClassVar[int] - ROLE_FIELD_NUMBER: _ClassVar[int] - project_id: str - user_id: str - role: ProjectRoleProto - def __init__(self, project_id: _Optional[str] = ..., user_id: _Optional[str] = ..., role: _Optional[_Union[ProjectRoleProto, str]] = ...) -> None: ... - -class UpdateProjectMemberRoleRequest(_message.Message): - __slots__ = ("project_id", "user_id", "role") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - USER_ID_FIELD_NUMBER: _ClassVar[int] - ROLE_FIELD_NUMBER: _ClassVar[int] - project_id: str - user_id: str - role: ProjectRoleProto - def __init__(self, project_id: _Optional[str] = ..., user_id: _Optional[str] = ..., role: _Optional[_Union[ProjectRoleProto, str]] = ...) -> None: ... - -class RemoveProjectMemberRequest(_message.Message): - __slots__ = ("project_id", "user_id") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - USER_ID_FIELD_NUMBER: _ClassVar[int] - project_id: str - user_id: str - def __init__(self, project_id: _Optional[str] = ..., user_id: _Optional[str] = ...) -> None: ... - -class RemoveProjectMemberResponse(_message.Message): - __slots__ = ("success",) - SUCCESS_FIELD_NUMBER: _ClassVar[int] - success: bool - def __init__(self, success: bool = ...) -> None: ... - -class ListProjectMembersRequest(_message.Message): - __slots__ = ("project_id", "limit", "offset") - PROJECT_ID_FIELD_NUMBER: _ClassVar[int] - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - project_id: str - limit: int - offset: int - def __init__(self, project_id: _Optional[str] = ..., limit: _Optional[int] = ..., offset: _Optional[int] = ...) -> None: ... - -class ListProjectMembersResponse(_message.Message): - __slots__ = ("members", "total_count") - MEMBERS_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - members: _containers.RepeatedCompositeFieldContainer[ProjectMembershipProto] - total_count: int - def __init__(self, members: _Optional[_Iterable[_Union[ProjectMembershipProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class GetCurrentUserRequest(_message.Message): - __slots__ = () - def __init__(self) -> None: ... - -class GetCurrentUserResponse(_message.Message): - __slots__ = ("user_id", "workspace_id", "display_name", "email", "is_authenticated", "auth_provider", "workspace_name", "role") - USER_ID_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - DISPLAY_NAME_FIELD_NUMBER: _ClassVar[int] - EMAIL_FIELD_NUMBER: _ClassVar[int] - IS_AUTHENTICATED_FIELD_NUMBER: _ClassVar[int] - AUTH_PROVIDER_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_NAME_FIELD_NUMBER: _ClassVar[int] - ROLE_FIELD_NUMBER: _ClassVar[int] - user_id: str - workspace_id: str - display_name: str - email: str - is_authenticated: bool - auth_provider: str - workspace_name: str - role: str - def __init__(self, user_id: _Optional[str] = ..., workspace_id: _Optional[str] = ..., display_name: _Optional[str] = ..., email: _Optional[str] = ..., is_authenticated: bool = ..., auth_provider: _Optional[str] = ..., workspace_name: _Optional[str] = ..., role: _Optional[str] = ...) -> None: ... - -class WorkspaceProto(_message.Message): - __slots__ = ("id", "name", "slug", "is_default", "role") - ID_FIELD_NUMBER: _ClassVar[int] - NAME_FIELD_NUMBER: _ClassVar[int] - SLUG_FIELD_NUMBER: _ClassVar[int] - IS_DEFAULT_FIELD_NUMBER: _ClassVar[int] - ROLE_FIELD_NUMBER: _ClassVar[int] - id: str - name: str - slug: str - is_default: bool - role: str - def __init__(self, id: _Optional[str] = ..., name: _Optional[str] = ..., slug: _Optional[str] = ..., is_default: bool = ..., role: _Optional[str] = ...) -> None: ... - -class ListWorkspacesRequest(_message.Message): - __slots__ = ("limit", "offset") - LIMIT_FIELD_NUMBER: _ClassVar[int] - OFFSET_FIELD_NUMBER: _ClassVar[int] - limit: int - offset: int - def __init__(self, limit: _Optional[int] = ..., offset: _Optional[int] = ...) -> None: ... - -class ListWorkspacesResponse(_message.Message): - __slots__ = ("workspaces", "total_count") - WORKSPACES_FIELD_NUMBER: _ClassVar[int] - TOTAL_COUNT_FIELD_NUMBER: _ClassVar[int] - workspaces: _containers.RepeatedCompositeFieldContainer[WorkspaceProto] - total_count: int - def __init__(self, workspaces: _Optional[_Iterable[_Union[WorkspaceProto, _Mapping]]] = ..., total_count: _Optional[int] = ...) -> None: ... - -class SwitchWorkspaceRequest(_message.Message): - __slots__ = ("workspace_id",) - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - def __init__(self, workspace_id: _Optional[str] = ...) -> None: ... - -class SwitchWorkspaceResponse(_message.Message): - __slots__ = ("success", "workspace", "error_message") - SUCCESS_FIELD_NUMBER: _ClassVar[int] - WORKSPACE_FIELD_NUMBER: _ClassVar[int] - ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] - success: bool - workspace: WorkspaceProto - error_message: str - def __init__(self, success: bool = ..., workspace: _Optional[_Union[WorkspaceProto, _Mapping]] = ..., error_message: _Optional[str] = ...) -> None: ... - -class GetWorkspaceSettingsRequest(_message.Message): - __slots__ = ("workspace_id",) - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - def __init__(self, workspace_id: _Optional[str] = ...) -> None: ... - -class UpdateWorkspaceSettingsRequest(_message.Message): - __slots__ = ("workspace_id", "settings") - WORKSPACE_ID_FIELD_NUMBER: _ClassVar[int] - SETTINGS_FIELD_NUMBER: _ClassVar[int] - workspace_id: str - settings: WorkspaceSettingsProto - def __init__(self, workspace_id: _Optional[str] = ..., settings: _Optional[_Union[WorkspaceSettingsProto, _Mapping]] = ...) -> None: ... +""" +@generated by mypy-protobuf. Do not edit manually! +isort:skip_file +NoteFlow gRPC Service Definition +Provides real-time ASR streaming and meeting management +""" + +import builtins +import collections.abc +import google.protobuf.descriptor +import google.protobuf.internal.containers +import google.protobuf.internal.enum_type_wrapper +import google.protobuf.message +import sys +import typing + +if sys.version_info >= (3, 10): + import typing as typing_extensions +else: + import typing_extensions + +DESCRIPTOR: google.protobuf.descriptor.FileDescriptor + +class _UpdateType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _UpdateTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_UpdateType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + UPDATE_TYPE_UNSPECIFIED: _UpdateType.ValueType # 0 + UPDATE_TYPE_PARTIAL: _UpdateType.ValueType # 1 + """Tentative, may change""" + UPDATE_TYPE_FINAL: _UpdateType.ValueType # 2 + """Confirmed segment""" + UPDATE_TYPE_VAD_START: _UpdateType.ValueType # 3 + """Voice activity started""" + UPDATE_TYPE_VAD_END: _UpdateType.ValueType # 4 + """Voice activity ended""" + +class UpdateType(_UpdateType, metaclass=_UpdateTypeEnumTypeWrapper): ... + +UPDATE_TYPE_UNSPECIFIED: UpdateType.ValueType # 0 +UPDATE_TYPE_PARTIAL: UpdateType.ValueType # 1 +"""Tentative, may change""" +UPDATE_TYPE_FINAL: UpdateType.ValueType # 2 +"""Confirmed segment""" +UPDATE_TYPE_VAD_START: UpdateType.ValueType # 3 +"""Voice activity started""" +UPDATE_TYPE_VAD_END: UpdateType.ValueType # 4 +"""Voice activity ended""" +Global___UpdateType: typing_extensions.TypeAlias = UpdateType + +class _MeetingState: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _MeetingStateEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_MeetingState.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + MEETING_STATE_UNSPECIFIED: _MeetingState.ValueType # 0 + MEETING_STATE_CREATED: _MeetingState.ValueType # 1 + """Created but not started""" + MEETING_STATE_RECORDING: _MeetingState.ValueType # 2 + """Actively recording""" + MEETING_STATE_STOPPED: _MeetingState.ValueType # 3 + """Recording stopped, processing may continue""" + MEETING_STATE_COMPLETED: _MeetingState.ValueType # 4 + """All processing complete""" + MEETING_STATE_ERROR: _MeetingState.ValueType # 5 + """Error occurred""" + +class MeetingState(_MeetingState, metaclass=_MeetingStateEnumTypeWrapper): ... + +MEETING_STATE_UNSPECIFIED: MeetingState.ValueType # 0 +MEETING_STATE_CREATED: MeetingState.ValueType # 1 +"""Created but not started""" +MEETING_STATE_RECORDING: MeetingState.ValueType # 2 +"""Actively recording""" +MEETING_STATE_STOPPED: MeetingState.ValueType # 3 +"""Recording stopped, processing may continue""" +MEETING_STATE_COMPLETED: MeetingState.ValueType # 4 +"""All processing complete""" +MEETING_STATE_ERROR: MeetingState.ValueType # 5 +"""Error occurred""" +Global___MeetingState: typing_extensions.TypeAlias = MeetingState + +class _SortOrder: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _SortOrderEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_SortOrder.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + SORT_ORDER_UNSPECIFIED: _SortOrder.ValueType # 0 + SORT_ORDER_CREATED_DESC: _SortOrder.ValueType # 1 + """Newest first (default)""" + SORT_ORDER_CREATED_ASC: _SortOrder.ValueType # 2 + """Oldest first""" + +class SortOrder(_SortOrder, metaclass=_SortOrderEnumTypeWrapper): ... + +SORT_ORDER_UNSPECIFIED: SortOrder.ValueType # 0 +SORT_ORDER_CREATED_DESC: SortOrder.ValueType # 1 +"""Newest first (default)""" +SORT_ORDER_CREATED_ASC: SortOrder.ValueType # 2 +"""Oldest first""" +Global___SortOrder: typing_extensions.TypeAlias = SortOrder + +class _Priority: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _PriorityEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_Priority.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + PRIORITY_UNSPECIFIED: _Priority.ValueType # 0 + PRIORITY_LOW: _Priority.ValueType # 1 + PRIORITY_MEDIUM: _Priority.ValueType # 2 + PRIORITY_HIGH: _Priority.ValueType # 3 + +class Priority(_Priority, metaclass=_PriorityEnumTypeWrapper): ... + +PRIORITY_UNSPECIFIED: Priority.ValueType # 0 +PRIORITY_LOW: Priority.ValueType # 1 +PRIORITY_MEDIUM: Priority.ValueType # 2 +PRIORITY_HIGH: Priority.ValueType # 3 +Global___Priority: typing_extensions.TypeAlias = Priority + +class _AsrDevice: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _AsrDeviceEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_AsrDevice.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + ASR_DEVICE_UNSPECIFIED: _AsrDevice.ValueType # 0 + ASR_DEVICE_CPU: _AsrDevice.ValueType # 1 + ASR_DEVICE_CUDA: _AsrDevice.ValueType # 2 + +class AsrDevice(_AsrDevice, metaclass=_AsrDeviceEnumTypeWrapper): + """============================================================================= + ASR Configuration Messages (Sprint 19) + ============================================================================= + + Valid ASR devices + """ + +ASR_DEVICE_UNSPECIFIED: AsrDevice.ValueType # 0 +ASR_DEVICE_CPU: AsrDevice.ValueType # 1 +ASR_DEVICE_CUDA: AsrDevice.ValueType # 2 +Global___AsrDevice: typing_extensions.TypeAlias = AsrDevice + +class _AsrComputeType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _AsrComputeTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_AsrComputeType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + ASR_COMPUTE_TYPE_UNSPECIFIED: _AsrComputeType.ValueType # 0 + ASR_COMPUTE_TYPE_INT8: _AsrComputeType.ValueType # 1 + ASR_COMPUTE_TYPE_FLOAT16: _AsrComputeType.ValueType # 2 + ASR_COMPUTE_TYPE_FLOAT32: _AsrComputeType.ValueType # 3 + +class AsrComputeType(_AsrComputeType, metaclass=_AsrComputeTypeEnumTypeWrapper): + """Valid ASR compute types""" + +ASR_COMPUTE_TYPE_UNSPECIFIED: AsrComputeType.ValueType # 0 +ASR_COMPUTE_TYPE_INT8: AsrComputeType.ValueType # 1 +ASR_COMPUTE_TYPE_FLOAT16: AsrComputeType.ValueType # 2 +ASR_COMPUTE_TYPE_FLOAT32: AsrComputeType.ValueType # 3 +Global___AsrComputeType: typing_extensions.TypeAlias = AsrComputeType + +class _AnnotationType: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _AnnotationTypeEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_AnnotationType.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + ANNOTATION_TYPE_UNSPECIFIED: _AnnotationType.ValueType # 0 + ANNOTATION_TYPE_ACTION_ITEM: _AnnotationType.ValueType # 1 + ANNOTATION_TYPE_DECISION: _AnnotationType.ValueType # 2 + ANNOTATION_TYPE_NOTE: _AnnotationType.ValueType # 3 + ANNOTATION_TYPE_RISK: _AnnotationType.ValueType # 4 + +class AnnotationType(_AnnotationType, metaclass=_AnnotationTypeEnumTypeWrapper): + """============================================================================= + Annotation Messages + ============================================================================= + """ + +ANNOTATION_TYPE_UNSPECIFIED: AnnotationType.ValueType # 0 +ANNOTATION_TYPE_ACTION_ITEM: AnnotationType.ValueType # 1 +ANNOTATION_TYPE_DECISION: AnnotationType.ValueType # 2 +ANNOTATION_TYPE_NOTE: AnnotationType.ValueType # 3 +ANNOTATION_TYPE_RISK: AnnotationType.ValueType # 4 +Global___AnnotationType: typing_extensions.TypeAlias = AnnotationType + +class _ExportFormat: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ExportFormatEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ExportFormat.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + EXPORT_FORMAT_UNSPECIFIED: _ExportFormat.ValueType # 0 + EXPORT_FORMAT_MARKDOWN: _ExportFormat.ValueType # 1 + EXPORT_FORMAT_HTML: _ExportFormat.ValueType # 2 + EXPORT_FORMAT_PDF: _ExportFormat.ValueType # 3 + """PDF export (Sprint 3)""" + +class ExportFormat(_ExportFormat, metaclass=_ExportFormatEnumTypeWrapper): + """============================================================================= + Export Messages + ============================================================================= + """ + +EXPORT_FORMAT_UNSPECIFIED: ExportFormat.ValueType # 0 +EXPORT_FORMAT_MARKDOWN: ExportFormat.ValueType # 1 +EXPORT_FORMAT_HTML: ExportFormat.ValueType # 2 +EXPORT_FORMAT_PDF: ExportFormat.ValueType # 3 +"""PDF export (Sprint 3)""" +Global___ExportFormat: typing_extensions.TypeAlias = ExportFormat + +class _JobStatus: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _JobStatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_JobStatus.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + JOB_STATUS_UNSPECIFIED: _JobStatus.ValueType # 0 + JOB_STATUS_QUEUED: _JobStatus.ValueType # 1 + JOB_STATUS_RUNNING: _JobStatus.ValueType # 2 + JOB_STATUS_COMPLETED: _JobStatus.ValueType # 3 + JOB_STATUS_FAILED: _JobStatus.ValueType # 4 + JOB_STATUS_CANCELLED: _JobStatus.ValueType # 5 + +class JobStatus(_JobStatus, metaclass=_JobStatusEnumTypeWrapper): ... + +JOB_STATUS_UNSPECIFIED: JobStatus.ValueType # 0 +JOB_STATUS_QUEUED: JobStatus.ValueType # 1 +JOB_STATUS_RUNNING: JobStatus.ValueType # 2 +JOB_STATUS_COMPLETED: JobStatus.ValueType # 3 +JOB_STATUS_FAILED: JobStatus.ValueType # 4 +JOB_STATUS_CANCELLED: JobStatus.ValueType # 5 +Global___JobStatus: typing_extensions.TypeAlias = JobStatus + +class _ProcessingStepStatus: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ProcessingStepStatusEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ProcessingStepStatus.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + PROCESSING_STEP_UNSPECIFIED: _ProcessingStepStatus.ValueType # 0 + PROCESSING_STEP_PENDING: _ProcessingStepStatus.ValueType # 1 + """Not yet started""" + PROCESSING_STEP_RUNNING: _ProcessingStepStatus.ValueType # 2 + """Currently processing""" + PROCESSING_STEP_COMPLETED: _ProcessingStepStatus.ValueType # 3 + """Completed successfully""" + PROCESSING_STEP_FAILED: _ProcessingStepStatus.ValueType # 4 + """Failed with error""" + PROCESSING_STEP_SKIPPED: _ProcessingStepStatus.ValueType # 5 + """Skipped (e.g., feature disabled)""" + +class ProcessingStepStatus(_ProcessingStepStatus, metaclass=_ProcessingStepStatusEnumTypeWrapper): + """============================================================================= + Post-Processing Status Messages (GAP-W05) + ============================================================================= + + Status of an individual processing step (summary, entities, diarization) + """ + +PROCESSING_STEP_UNSPECIFIED: ProcessingStepStatus.ValueType # 0 +PROCESSING_STEP_PENDING: ProcessingStepStatus.ValueType # 1 +"""Not yet started""" +PROCESSING_STEP_RUNNING: ProcessingStepStatus.ValueType # 2 +"""Currently processing""" +PROCESSING_STEP_COMPLETED: ProcessingStepStatus.ValueType # 3 +"""Completed successfully""" +PROCESSING_STEP_FAILED: ProcessingStepStatus.ValueType # 4 +"""Failed with error""" +PROCESSING_STEP_SKIPPED: ProcessingStepStatus.ValueType # 5 +"""Skipped (e.g., feature disabled)""" +Global___ProcessingStepStatus: typing_extensions.TypeAlias = ProcessingStepStatus + +class _ProjectRoleProto: + ValueType = typing.NewType("ValueType", builtins.int) + V: typing_extensions.TypeAlias = ValueType + +class _ProjectRoleProtoEnumTypeWrapper(google.protobuf.internal.enum_type_wrapper._EnumTypeWrapper[_ProjectRoleProto.ValueType], builtins.type): + DESCRIPTOR: google.protobuf.descriptor.EnumDescriptor + PROJECT_ROLE_UNSPECIFIED: _ProjectRoleProto.ValueType # 0 + PROJECT_ROLE_VIEWER: _ProjectRoleProto.ValueType # 1 + """Read meetings, artifacts, run Q&A""" + PROJECT_ROLE_EDITOR: _ProjectRoleProto.ValueType # 2 + """+ Create/edit meetings, upload artifacts""" + PROJECT_ROLE_ADMIN: _ProjectRoleProto.ValueType # 3 + """+ Manage members, settings, rules""" + +class ProjectRoleProto(_ProjectRoleProto, metaclass=_ProjectRoleProtoEnumTypeWrapper): + """============================================================================= + Project Management Messages (Sprint 18) + ============================================================================= + + Project role within a project (access control) + """ + +PROJECT_ROLE_UNSPECIFIED: ProjectRoleProto.ValueType # 0 +PROJECT_ROLE_VIEWER: ProjectRoleProto.ValueType # 1 +"""Read meetings, artifacts, run Q&A""" +PROJECT_ROLE_EDITOR: ProjectRoleProto.ValueType # 2 +"""+ Create/edit meetings, upload artifacts""" +PROJECT_ROLE_ADMIN: ProjectRoleProto.ValueType # 3 +"""+ Manage members, settings, rules""" +Global___ProjectRoleProto: typing_extensions.TypeAlias = ProjectRoleProto + +@typing.final +class AudioChunk(google.protobuf.message.Message): + """============================================================================= + Audio Streaming Messages + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + AUDIO_DATA_FIELD_NUMBER: builtins.int + TIMESTAMP_FIELD_NUMBER: builtins.int + SAMPLE_RATE_FIELD_NUMBER: builtins.int + CHANNELS_FIELD_NUMBER: builtins.int + CHUNK_SEQUENCE_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID this audio belongs to""" + audio_data: builtins.bytes + """Raw audio data (float32, mono, 16kHz expected)""" + timestamp: builtins.float + """Timestamp when audio was captured (monotonic, seconds)""" + sample_rate: builtins.int + """Sample rate in Hz (default 16000)""" + channels: builtins.int + """Number of channels (default 1 for mono)""" + chunk_sequence: builtins.int + """Sequence number for acknowledgment tracking (monotonically increasing per stream)""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + audio_data: builtins.bytes = ..., + timestamp: builtins.float = ..., + sample_rate: builtins.int = ..., + channels: builtins.int = ..., + chunk_sequence: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["audio_data", b"audio_data", "channels", b"channels", "chunk_sequence", b"chunk_sequence", "meeting_id", b"meeting_id", "sample_rate", b"sample_rate", "timestamp", b"timestamp"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___AudioChunk: typing_extensions.TypeAlias = AudioChunk + +@typing.final +class CongestionInfo(google.protobuf.message.Message): + """Congestion information for backpressure signaling (Phase 3)""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROCESSING_DELAY_MS_FIELD_NUMBER: builtins.int + QUEUE_DEPTH_FIELD_NUMBER: builtins.int + THROTTLE_RECOMMENDED_FIELD_NUMBER: builtins.int + processing_delay_ms: builtins.int + """Time from chunk receipt to transcription processing (milliseconds)""" + queue_depth: builtins.int + """Number of chunks waiting to be processed""" + throttle_recommended: builtins.bool + """Signal that client should reduce sending rate""" + def __init__( + self, + *, + processing_delay_ms: builtins.int = ..., + queue_depth: builtins.int = ..., + throttle_recommended: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["processing_delay_ms", b"processing_delay_ms", "queue_depth", b"queue_depth", "throttle_recommended", b"throttle_recommended"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CongestionInfo: typing_extensions.TypeAlias = CongestionInfo + +@typing.final +class TranscriptUpdate(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + UPDATE_TYPE_FIELD_NUMBER: builtins.int + PARTIAL_TEXT_FIELD_NUMBER: builtins.int + SEGMENT_FIELD_NUMBER: builtins.int + SERVER_TIMESTAMP_FIELD_NUMBER: builtins.int + ACK_SEQUENCE_FIELD_NUMBER: builtins.int + CONGESTION_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID this transcript belongs to""" + update_type: Global___UpdateType.ValueType + """Type of update""" + partial_text: builtins.str + """For partial updates - tentative transcript text""" + server_timestamp: builtins.float + """Server-side processing timestamp""" + ack_sequence: builtins.int + """Acknowledgment: highest contiguous chunk sequence received (optional)""" + @property + def segment(self) -> Global___FinalSegment: + """For final segments - confirmed transcript""" + + @property + def congestion(self) -> Global___CongestionInfo: + """Congestion info for backpressure signaling (optional)""" + + def __init__( + self, + *, + meeting_id: builtins.str = ..., + update_type: Global___UpdateType.ValueType = ..., + partial_text: builtins.str = ..., + segment: Global___FinalSegment | None = ..., + server_timestamp: builtins.float = ..., + ack_sequence: builtins.int | None = ..., + congestion: Global___CongestionInfo | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_ack_sequence", b"_ack_sequence", "_congestion", b"_congestion", "ack_sequence", b"ack_sequence", "congestion", b"congestion", "segment", b"segment"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_ack_sequence", b"_ack_sequence", "_congestion", b"_congestion", "ack_sequence", b"ack_sequence", "congestion", b"congestion", "meeting_id", b"meeting_id", "partial_text", b"partial_text", "segment", b"segment", "server_timestamp", b"server_timestamp", "update_type", b"update_type"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__ack_sequence: typing_extensions.TypeAlias = typing.Literal["ack_sequence"] + _WhichOneofArgType__ack_sequence: typing_extensions.TypeAlias = typing.Literal["_ack_sequence", b"_ack_sequence"] + _WhichOneofReturnType__congestion: typing_extensions.TypeAlias = typing.Literal["congestion"] + _WhichOneofArgType__congestion: typing_extensions.TypeAlias = typing.Literal["_congestion", b"_congestion"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__ack_sequence) -> _WhichOneofReturnType__ack_sequence | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__congestion) -> _WhichOneofReturnType__congestion | None: ... + +Global___TranscriptUpdate: typing_extensions.TypeAlias = TranscriptUpdate + +@typing.final +class FinalSegment(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEGMENT_ID_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + WORDS_FIELD_NUMBER: builtins.int + LANGUAGE_FIELD_NUMBER: builtins.int + LANGUAGE_CONFIDENCE_FIELD_NUMBER: builtins.int + AVG_LOGPROB_FIELD_NUMBER: builtins.int + NO_SPEECH_PROB_FIELD_NUMBER: builtins.int + SPEAKER_ID_FIELD_NUMBER: builtins.int + SPEAKER_CONFIDENCE_FIELD_NUMBER: builtins.int + segment_id: builtins.int + """Segment ID (sequential within meeting)""" + text: builtins.str + """Transcript text""" + start_time: builtins.float + """Start time relative to meeting start (seconds)""" + end_time: builtins.float + """End time relative to meeting start (seconds)""" + language: builtins.str + """Detected language""" + language_confidence: builtins.float + """Language detection confidence (0.0-1.0)""" + avg_logprob: builtins.float + """Average log probability (quality indicator)""" + no_speech_prob: builtins.float + """Probability that segment contains no speech""" + speaker_id: builtins.str + """Speaker identification (from diarization)""" + speaker_confidence: builtins.float + """Speaker assignment confidence (0.0-1.0)""" + @property + def words(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___WordTiming]: + """Word-level timestamps""" + + def __init__( + self, + *, + segment_id: builtins.int = ..., + text: builtins.str = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + words: collections.abc.Iterable[Global___WordTiming] | None = ..., + language: builtins.str = ..., + language_confidence: builtins.float = ..., + avg_logprob: builtins.float = ..., + no_speech_prob: builtins.float = ..., + speaker_id: builtins.str = ..., + speaker_confidence: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["avg_logprob", b"avg_logprob", "end_time", b"end_time", "language", b"language", "language_confidence", b"language_confidence", "no_speech_prob", b"no_speech_prob", "segment_id", b"segment_id", "speaker_confidence", b"speaker_confidence", "speaker_id", b"speaker_id", "start_time", b"start_time", "text", b"text", "words", b"words"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___FinalSegment: typing_extensions.TypeAlias = FinalSegment + +@typing.final +class WordTiming(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORD_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + PROBABILITY_FIELD_NUMBER: builtins.int + word: builtins.str + start_time: builtins.float + end_time: builtins.float + probability: builtins.float + def __init__( + self, + *, + word: builtins.str = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + probability: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["end_time", b"end_time", "probability", b"probability", "start_time", b"start_time", "word", b"word"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___WordTiming: typing_extensions.TypeAlias = WordTiming + +@typing.final +class Meeting(google.protobuf.message.Message): + """============================================================================= + Meeting Management Messages + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + ID_FIELD_NUMBER: builtins.int + TITLE_FIELD_NUMBER: builtins.int + STATE_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + STARTED_AT_FIELD_NUMBER: builtins.int + ENDED_AT_FIELD_NUMBER: builtins.int + DURATION_SECONDS_FIELD_NUMBER: builtins.int + SEGMENTS_FIELD_NUMBER: builtins.int + SUMMARY_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + PROJECT_ID_FIELD_NUMBER: builtins.int + PROCESSING_STATUS_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique meeting identifier""" + title: builtins.str + """User-provided title""" + state: Global___MeetingState.ValueType + """Meeting state""" + created_at: builtins.float + """Creation timestamp (Unix epoch seconds)""" + started_at: builtins.float + """Start timestamp (when recording began)""" + ended_at: builtins.float + """End timestamp (when recording stopped)""" + duration_seconds: builtins.float + """Duration in seconds""" + project_id: builtins.str + """Optional project scope""" + @property + def segments(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___FinalSegment]: + """Full transcript segments""" + + @property + def summary(self) -> Global___Summary: + """Generated summary (if available)""" + + @property + def metadata(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """Metadata""" + + @property + def processing_status(self) -> Global___ProcessingStatus: + """Post-processing status (GAP-W05)""" + + def __init__( + self, + *, + id: builtins.str = ..., + title: builtins.str = ..., + state: Global___MeetingState.ValueType = ..., + created_at: builtins.float = ..., + started_at: builtins.float = ..., + ended_at: builtins.float = ..., + duration_seconds: builtins.float = ..., + segments: collections.abc.Iterable[Global___FinalSegment] | None = ..., + summary: Global___Summary | None = ..., + metadata: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + project_id: builtins.str | None = ..., + processing_status: Global___ProcessingStatus | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "processing_status", b"processing_status", "project_id", b"project_id", "summary", b"summary"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "created_at", b"created_at", "duration_seconds", b"duration_seconds", "ended_at", b"ended_at", "id", b"id", "metadata", b"metadata", "processing_status", b"processing_status", "project_id", b"project_id", "segments", b"segments", "started_at", b"started_at", "state", b"state", "summary", b"summary", "title", b"title"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__project_id: typing_extensions.TypeAlias = typing.Literal["project_id"] + _WhichOneofArgType__project_id: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__project_id) -> _WhichOneofReturnType__project_id | None: ... + +Global___Meeting: typing_extensions.TypeAlias = Meeting + +@typing.final +class CreateMeetingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class MetadataEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + TITLE_FIELD_NUMBER: builtins.int + METADATA_FIELD_NUMBER: builtins.int + PROJECT_ID_FIELD_NUMBER: builtins.int + title: builtins.str + """Optional title (generated if not provided)""" + project_id: builtins.str + """Optional project scope (defaults to active project)""" + @property + def metadata(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """Optional metadata""" + + def __init__( + self, + *, + title: builtins.str = ..., + metadata: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + project_id: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "project_id", b"project_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "metadata", b"metadata", "project_id", b"project_id", "title", b"title"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__project_id: typing_extensions.TypeAlias = typing.Literal["project_id"] + _WhichOneofArgType__project_id: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__project_id) -> _WhichOneofReturnType__project_id | None: ... + +Global___CreateMeetingRequest: typing_extensions.TypeAlias = CreateMeetingRequest + +@typing.final +class StopMeetingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + def __init__( + self, + *, + meeting_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["meeting_id", b"meeting_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___StopMeetingRequest: typing_extensions.TypeAlias = StopMeetingRequest + +@typing.final +class ListMeetingsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATES_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + SORT_ORDER_FIELD_NUMBER: builtins.int + PROJECT_ID_FIELD_NUMBER: builtins.int + PROJECT_IDS_FIELD_NUMBER: builtins.int + limit: builtins.int + """Pagination""" + offset: builtins.int + sort_order: Global___SortOrder.ValueType + """Sort order""" + project_id: builtins.str + """Optional project filter (defaults to active project if omitted)""" + @property + def states(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[Global___MeetingState.ValueType]: + """Optional filter by state""" + + @property + def project_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Optional project filter for multiple projects (overrides project_id when provided)""" + + def __init__( + self, + *, + states: collections.abc.Iterable[Global___MeetingState.ValueType] | None = ..., + limit: builtins.int = ..., + offset: builtins.int = ..., + sort_order: Global___SortOrder.ValueType = ..., + project_id: builtins.str | None = ..., + project_ids: collections.abc.Iterable[builtins.str] | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "project_id", b"project_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "limit", b"limit", "offset", b"offset", "project_id", b"project_id", "project_ids", b"project_ids", "sort_order", b"sort_order", "states", b"states"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__project_id: typing_extensions.TypeAlias = typing.Literal["project_id"] + _WhichOneofArgType__project_id: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__project_id) -> _WhichOneofReturnType__project_id | None: ... + +Global___ListMeetingsRequest: typing_extensions.TypeAlias = ListMeetingsRequest + +@typing.final +class ListMeetingsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETINGS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + @property + def meetings(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___Meeting]: ... + def __init__( + self, + *, + meetings: collections.abc.Iterable[Global___Meeting] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["meetings", b"meetings", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListMeetingsResponse: typing_extensions.TypeAlias = ListMeetingsResponse + +@typing.final +class GetMeetingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + INCLUDE_SEGMENTS_FIELD_NUMBER: builtins.int + INCLUDE_SUMMARY_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + include_segments: builtins.bool + """Whether to include full transcript segments""" + include_summary: builtins.bool + """Whether to include summary""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + include_segments: builtins.bool = ..., + include_summary: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["include_segments", b"include_segments", "include_summary", b"include_summary", "meeting_id", b"meeting_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetMeetingRequest: typing_extensions.TypeAlias = GetMeetingRequest + +@typing.final +class DeleteMeetingRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + def __init__( + self, + *, + meeting_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["meeting_id", b"meeting_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteMeetingRequest: typing_extensions.TypeAlias = DeleteMeetingRequest + +@typing.final +class DeleteMeetingResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteMeetingResponse: typing_extensions.TypeAlias = DeleteMeetingResponse + +@typing.final +class Summary(google.protobuf.message.Message): + """============================================================================= + Summary Messages + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + EXECUTIVE_SUMMARY_FIELD_NUMBER: builtins.int + KEY_POINTS_FIELD_NUMBER: builtins.int + ACTION_ITEMS_FIELD_NUMBER: builtins.int + GENERATED_AT_FIELD_NUMBER: builtins.int + MODEL_VERSION_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting this summary belongs to""" + executive_summary: builtins.str + """Executive summary (2-3 sentences)""" + generated_at: builtins.float + """Generated timestamp""" + model_version: builtins.str + """Model/version used for generation""" + @property + def key_points(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___KeyPoint]: + """Key points / highlights""" + + @property + def action_items(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ActionItem]: + """Action items extracted""" + + def __init__( + self, + *, + meeting_id: builtins.str = ..., + executive_summary: builtins.str = ..., + key_points: collections.abc.Iterable[Global___KeyPoint] | None = ..., + action_items: collections.abc.Iterable[Global___ActionItem] | None = ..., + generated_at: builtins.float = ..., + model_version: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["action_items", b"action_items", "executive_summary", b"executive_summary", "generated_at", b"generated_at", "key_points", b"key_points", "meeting_id", b"meeting_id", "model_version", b"model_version"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___Summary: typing_extensions.TypeAlias = Summary + +@typing.final +class KeyPoint(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEXT_FIELD_NUMBER: builtins.int + SEGMENT_IDS_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + text: builtins.str + """The key point text""" + start_time: builtins.float + """Timestamp range this point covers""" + end_time: builtins.float + @property + def segment_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Segment IDs that support this point (evidence linking)""" + + def __init__( + self, + *, + text: builtins.str = ..., + segment_ids: collections.abc.Iterable[builtins.int] | None = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["end_time", b"end_time", "segment_ids", b"segment_ids", "start_time", b"start_time", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___KeyPoint: typing_extensions.TypeAlias = KeyPoint + +@typing.final +class ActionItem(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEXT_FIELD_NUMBER: builtins.int + ASSIGNEE_FIELD_NUMBER: builtins.int + DUE_DATE_FIELD_NUMBER: builtins.int + PRIORITY_FIELD_NUMBER: builtins.int + SEGMENT_IDS_FIELD_NUMBER: builtins.int + text: builtins.str + """Action item text""" + assignee: builtins.str + """Assigned to (if mentioned)""" + due_date: builtins.float + """Due date (if mentioned, Unix epoch)""" + priority: Global___Priority.ValueType + """Priority level""" + @property + def segment_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Segment IDs that mention this action""" + + def __init__( + self, + *, + text: builtins.str = ..., + assignee: builtins.str = ..., + due_date: builtins.float = ..., + priority: Global___Priority.ValueType = ..., + segment_ids: collections.abc.Iterable[builtins.int] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["assignee", b"assignee", "due_date", b"due_date", "priority", b"priority", "segment_ids", b"segment_ids", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ActionItem: typing_extensions.TypeAlias = ActionItem + +@typing.final +class SummarizationOptions(google.protobuf.message.Message): + """Summarization style options (Sprint 1)""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TONE_FIELD_NUMBER: builtins.int + FORMAT_FIELD_NUMBER: builtins.int + VERBOSITY_FIELD_NUMBER: builtins.int + TEMPLATE_ID_FIELD_NUMBER: builtins.int + tone: builtins.str + """Tone: professional, casual, technical, friendly""" + format: builtins.str + """Format: bullet_points, narrative, structured, concise""" + verbosity: builtins.str + """Verbosity: minimal, balanced, detailed, comprehensive""" + template_id: builtins.str + """Summarization template ID override (optional)""" + def __init__( + self, + *, + tone: builtins.str = ..., + format: builtins.str = ..., + verbosity: builtins.str = ..., + template_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["format", b"format", "template_id", b"template_id", "tone", b"tone", "verbosity", b"verbosity"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SummarizationOptions: typing_extensions.TypeAlias = SummarizationOptions + +@typing.final +class GenerateSummaryRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + FORCE_REGENERATE_FIELD_NUMBER: builtins.int + OPTIONS_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + force_regenerate: builtins.bool + """Force regeneration even if summary exists""" + @property + def options(self) -> Global___SummarizationOptions: + """Advanced summarization options (Sprint 1)""" + + def __init__( + self, + *, + meeting_id: builtins.str = ..., + force_regenerate: builtins.bool = ..., + options: Global___SummarizationOptions | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["options", b"options"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["force_regenerate", b"force_regenerate", "meeting_id", b"meeting_id", "options", b"options"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GenerateSummaryRequest: typing_extensions.TypeAlias = GenerateSummaryRequest + +@typing.final +class SummarizationTemplateProto(google.protobuf.message.Message): + """============================================================================= + Summarization Template Messages + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + IS_SYSTEM_FIELD_NUMBER: builtins.int + IS_ARCHIVED_FIELD_NUMBER: builtins.int + CURRENT_VERSION_ID_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + UPDATED_AT_FIELD_NUMBER: builtins.int + CREATED_BY_FIELD_NUMBER: builtins.int + UPDATED_BY_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique template identifier""" + workspace_id: builtins.str + """Workspace identifier (unset for system templates)""" + name: builtins.str + """Template name""" + description: builtins.str + """Optional description""" + is_system: builtins.bool + """Whether this is a system template""" + is_archived: builtins.bool + """Whether this template is archived""" + current_version_id: builtins.str + """Current version identifier""" + created_at: builtins.int + """Creation timestamp (Unix epoch seconds)""" + updated_at: builtins.int + """Update timestamp (Unix epoch seconds)""" + created_by: builtins.str + """User who created the template""" + updated_by: builtins.str + """User who last updated the template""" + def __init__( + self, + *, + id: builtins.str = ..., + workspace_id: builtins.str | None = ..., + name: builtins.str = ..., + description: builtins.str | None = ..., + is_system: builtins.bool = ..., + is_archived: builtins.bool = ..., + current_version_id: builtins.str | None = ..., + created_at: builtins.int = ..., + updated_at: builtins.int = ..., + created_by: builtins.str | None = ..., + updated_by: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_created_by", b"_created_by", "_current_version_id", b"_current_version_id", "_description", b"_description", "_updated_by", b"_updated_by", "_workspace_id", b"_workspace_id", "created_by", b"created_by", "current_version_id", b"current_version_id", "description", b"description", "updated_by", b"updated_by", "workspace_id", b"workspace_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_created_by", b"_created_by", "_current_version_id", b"_current_version_id", "_description", b"_description", "_updated_by", b"_updated_by", "_workspace_id", b"_workspace_id", "created_at", b"created_at", "created_by", b"created_by", "current_version_id", b"current_version_id", "description", b"description", "id", b"id", "is_archived", b"is_archived", "is_system", b"is_system", "name", b"name", "updated_at", b"updated_at", "updated_by", b"updated_by", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__created_by: typing_extensions.TypeAlias = typing.Literal["created_by"] + _WhichOneofArgType__created_by: typing_extensions.TypeAlias = typing.Literal["_created_by", b"_created_by"] + _WhichOneofReturnType__current_version_id: typing_extensions.TypeAlias = typing.Literal["current_version_id"] + _WhichOneofArgType__current_version_id: typing_extensions.TypeAlias = typing.Literal["_current_version_id", b"_current_version_id"] + _WhichOneofReturnType__description: typing_extensions.TypeAlias = typing.Literal["description"] + _WhichOneofArgType__description: typing_extensions.TypeAlias = typing.Literal["_description", b"_description"] + _WhichOneofReturnType__updated_by: typing_extensions.TypeAlias = typing.Literal["updated_by"] + _WhichOneofArgType__updated_by: typing_extensions.TypeAlias = typing.Literal["_updated_by", b"_updated_by"] + _WhichOneofReturnType__workspace_id: typing_extensions.TypeAlias = typing.Literal["workspace_id"] + _WhichOneofArgType__workspace_id: typing_extensions.TypeAlias = typing.Literal["_workspace_id", b"_workspace_id"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__created_by) -> _WhichOneofReturnType__created_by | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__current_version_id) -> _WhichOneofReturnType__current_version_id | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__description) -> _WhichOneofReturnType__description | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__updated_by) -> _WhichOneofReturnType__updated_by | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__workspace_id) -> _WhichOneofReturnType__workspace_id | None: ... + +Global___SummarizationTemplateProto: typing_extensions.TypeAlias = SummarizationTemplateProto + +@typing.final +class SummarizationTemplateVersionProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + TEMPLATE_ID_FIELD_NUMBER: builtins.int + VERSION_NUMBER_FIELD_NUMBER: builtins.int + CONTENT_FIELD_NUMBER: builtins.int + CHANGE_NOTE_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + CREATED_BY_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique version identifier""" + template_id: builtins.str + """Parent template identifier""" + version_number: builtins.int + """Version number""" + content: builtins.str + """Template content""" + change_note: builtins.str + """Optional change note""" + created_at: builtins.int + """Creation timestamp (Unix epoch seconds)""" + created_by: builtins.str + """User who created the version""" + def __init__( + self, + *, + id: builtins.str = ..., + template_id: builtins.str = ..., + version_number: builtins.int = ..., + content: builtins.str = ..., + change_note: builtins.str | None = ..., + created_at: builtins.int = ..., + created_by: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note", "_created_by", b"_created_by", "change_note", b"change_note", "created_by", b"created_by"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note", "_created_by", b"_created_by", "change_note", b"change_note", "content", b"content", "created_at", b"created_at", "created_by", b"created_by", "id", b"id", "template_id", b"template_id", "version_number", b"version_number"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__change_note: typing_extensions.TypeAlias = typing.Literal["change_note"] + _WhichOneofArgType__change_note: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note"] + _WhichOneofReturnType__created_by: typing_extensions.TypeAlias = typing.Literal["created_by"] + _WhichOneofArgType__created_by: typing_extensions.TypeAlias = typing.Literal["_created_by", b"_created_by"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__change_note) -> _WhichOneofReturnType__change_note | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__created_by) -> _WhichOneofReturnType__created_by | None: ... + +Global___SummarizationTemplateVersionProto: typing_extensions.TypeAlias = SummarizationTemplateVersionProto + +@typing.final +class ListSummarizationTemplatesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + INCLUDE_SYSTEM_FIELD_NUMBER: builtins.int + INCLUDE_ARCHIVED_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace identifier to list templates for""" + include_system: builtins.bool + """Include system templates""" + include_archived: builtins.bool + """Include archived templates""" + limit: builtins.int + """Max results to return""" + offset: builtins.int + """Offset for pagination""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + include_system: builtins.bool = ..., + include_archived: builtins.bool = ..., + limit: builtins.int = ..., + offset: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["include_archived", b"include_archived", "include_system", b"include_system", "limit", b"limit", "offset", b"offset", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListSummarizationTemplatesRequest: typing_extensions.TypeAlias = ListSummarizationTemplatesRequest + +@typing.final +class ListSummarizationTemplatesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATES_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + @property + def templates(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___SummarizationTemplateProto]: ... + def __init__( + self, + *, + templates: collections.abc.Iterable[Global___SummarizationTemplateProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["templates", b"templates", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListSummarizationTemplatesResponse: typing_extensions.TypeAlias = ListSummarizationTemplatesResponse + +@typing.final +class GetSummarizationTemplateRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_ID_FIELD_NUMBER: builtins.int + INCLUDE_CURRENT_VERSION_FIELD_NUMBER: builtins.int + template_id: builtins.str + include_current_version: builtins.bool + def __init__( + self, + *, + template_id: builtins.str = ..., + include_current_version: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["include_current_version", b"include_current_version", "template_id", b"template_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetSummarizationTemplateRequest: typing_extensions.TypeAlias = GetSummarizationTemplateRequest + +@typing.final +class GetSummarizationTemplateResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_FIELD_NUMBER: builtins.int + CURRENT_VERSION_FIELD_NUMBER: builtins.int + @property + def template(self) -> Global___SummarizationTemplateProto: ... + @property + def current_version(self) -> Global___SummarizationTemplateVersionProto: ... + def __init__( + self, + *, + template: Global___SummarizationTemplateProto | None = ..., + current_version: Global___SummarizationTemplateVersionProto | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_current_version", b"_current_version", "current_version", b"current_version", "template", b"template"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_current_version", b"_current_version", "current_version", b"current_version", "template", b"template"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__current_version: typing_extensions.TypeAlias = typing.Literal["current_version"] + _WhichOneofArgType__current_version: typing_extensions.TypeAlias = typing.Literal["_current_version", b"_current_version"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__current_version) -> _WhichOneofReturnType__current_version | None: ... + +Global___GetSummarizationTemplateResponse: typing_extensions.TypeAlias = GetSummarizationTemplateResponse + +@typing.final +class SummarizationTemplateMutationResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_FIELD_NUMBER: builtins.int + VERSION_FIELD_NUMBER: builtins.int + @property + def template(self) -> Global___SummarizationTemplateProto: ... + @property + def version(self) -> Global___SummarizationTemplateVersionProto: ... + def __init__( + self, + *, + template: Global___SummarizationTemplateProto | None = ..., + version: Global___SummarizationTemplateVersionProto | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_version", b"_version", "template", b"template", "version", b"version"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_version", b"_version", "template", b"template", "version", b"version"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__version: typing_extensions.TypeAlias = typing.Literal["version"] + _WhichOneofArgType__version: typing_extensions.TypeAlias = typing.Literal["_version", b"_version"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__version) -> _WhichOneofReturnType__version | None: ... + +Global___SummarizationTemplateMutationResponse: typing_extensions.TypeAlias = SummarizationTemplateMutationResponse + +@typing.final +class CreateSummarizationTemplateRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + CONTENT_FIELD_NUMBER: builtins.int + CHANGE_NOTE_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + name: builtins.str + description: builtins.str + content: builtins.str + change_note: builtins.str + def __init__( + self, + *, + workspace_id: builtins.str = ..., + name: builtins.str = ..., + description: builtins.str | None = ..., + content: builtins.str = ..., + change_note: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note", "_description", b"_description", "change_note", b"change_note", "description", b"description"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note", "_description", b"_description", "change_note", b"change_note", "content", b"content", "description", b"description", "name", b"name", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__change_note: typing_extensions.TypeAlias = typing.Literal["change_note"] + _WhichOneofArgType__change_note: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note"] + _WhichOneofReturnType__description: typing_extensions.TypeAlias = typing.Literal["description"] + _WhichOneofArgType__description: typing_extensions.TypeAlias = typing.Literal["_description", b"_description"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__change_note) -> _WhichOneofReturnType__change_note | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__description) -> _WhichOneofReturnType__description | None: ... + +Global___CreateSummarizationTemplateRequest: typing_extensions.TypeAlias = CreateSummarizationTemplateRequest + +@typing.final +class UpdateSummarizationTemplateRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + CONTENT_FIELD_NUMBER: builtins.int + CHANGE_NOTE_FIELD_NUMBER: builtins.int + template_id: builtins.str + name: builtins.str + description: builtins.str + content: builtins.str + change_note: builtins.str + def __init__( + self, + *, + template_id: builtins.str = ..., + name: builtins.str | None = ..., + description: builtins.str | None = ..., + content: builtins.str | None = ..., + change_note: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note", "_content", b"_content", "_description", b"_description", "_name", b"_name", "change_note", b"change_note", "content", b"content", "description", b"description", "name", b"name"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note", "_content", b"_content", "_description", b"_description", "_name", b"_name", "change_note", b"change_note", "content", b"content", "description", b"description", "name", b"name", "template_id", b"template_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__change_note: typing_extensions.TypeAlias = typing.Literal["change_note"] + _WhichOneofArgType__change_note: typing_extensions.TypeAlias = typing.Literal["_change_note", b"_change_note"] + _WhichOneofReturnType__content: typing_extensions.TypeAlias = typing.Literal["content"] + _WhichOneofArgType__content: typing_extensions.TypeAlias = typing.Literal["_content", b"_content"] + _WhichOneofReturnType__description: typing_extensions.TypeAlias = typing.Literal["description"] + _WhichOneofArgType__description: typing_extensions.TypeAlias = typing.Literal["_description", b"_description"] + _WhichOneofReturnType__name: typing_extensions.TypeAlias = typing.Literal["name"] + _WhichOneofArgType__name: typing_extensions.TypeAlias = typing.Literal["_name", b"_name"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__change_note) -> _WhichOneofReturnType__change_note | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__content) -> _WhichOneofReturnType__content | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__description) -> _WhichOneofReturnType__description | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__name) -> _WhichOneofReturnType__name | None: ... + +Global___UpdateSummarizationTemplateRequest: typing_extensions.TypeAlias = UpdateSummarizationTemplateRequest + +@typing.final +class ArchiveSummarizationTemplateRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_ID_FIELD_NUMBER: builtins.int + template_id: builtins.str + def __init__( + self, + *, + template_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["template_id", b"template_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ArchiveSummarizationTemplateRequest: typing_extensions.TypeAlias = ArchiveSummarizationTemplateRequest + +@typing.final +class ListSummarizationTemplateVersionsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_ID_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + template_id: builtins.str + limit: builtins.int + offset: builtins.int + def __init__( + self, + *, + template_id: builtins.str = ..., + limit: builtins.int = ..., + offset: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["limit", b"limit", "offset", b"offset", "template_id", b"template_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListSummarizationTemplateVersionsRequest: typing_extensions.TypeAlias = ListSummarizationTemplateVersionsRequest + +@typing.final +class ListSummarizationTemplateVersionsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VERSIONS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + @property + def versions(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___SummarizationTemplateVersionProto]: ... + def __init__( + self, + *, + versions: collections.abc.Iterable[Global___SummarizationTemplateVersionProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["total_count", b"total_count", "versions", b"versions"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListSummarizationTemplateVersionsResponse: typing_extensions.TypeAlias = ListSummarizationTemplateVersionsResponse + +@typing.final +class RestoreSummarizationTemplateVersionRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TEMPLATE_ID_FIELD_NUMBER: builtins.int + VERSION_ID_FIELD_NUMBER: builtins.int + template_id: builtins.str + version_id: builtins.str + def __init__( + self, + *, + template_id: builtins.str = ..., + version_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["template_id", b"template_id", "version_id", b"version_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RestoreSummarizationTemplateVersionRequest: typing_extensions.TypeAlias = RestoreSummarizationTemplateVersionRequest + +@typing.final +class ServerInfoRequest(google.protobuf.message.Message): + """============================================================================= + Server Info Messages + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___ServerInfoRequest: typing_extensions.TypeAlias = ServerInfoRequest + +@typing.final +class ServerInfo(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VERSION_FIELD_NUMBER: builtins.int + ASR_MODEL_FIELD_NUMBER: builtins.int + ASR_READY_FIELD_NUMBER: builtins.int + SUPPORTED_SAMPLE_RATES_FIELD_NUMBER: builtins.int + MAX_CHUNK_SIZE_FIELD_NUMBER: builtins.int + UPTIME_SECONDS_FIELD_NUMBER: builtins.int + ACTIVE_MEETINGS_FIELD_NUMBER: builtins.int + DIARIZATION_ENABLED_FIELD_NUMBER: builtins.int + DIARIZATION_READY_FIELD_NUMBER: builtins.int + STATE_VERSION_FIELD_NUMBER: builtins.int + version: builtins.str + """Server version""" + asr_model: builtins.str + """ASR model loaded""" + asr_ready: builtins.bool + """Whether ASR is ready""" + max_chunk_size: builtins.int + """Maximum audio chunk size in bytes""" + uptime_seconds: builtins.float + """Server uptime in seconds""" + active_meetings: builtins.int + """Number of active meetings""" + diarization_enabled: builtins.bool + """Whether diarization is enabled""" + diarization_ready: builtins.bool + """Whether diarization models are ready""" + state_version: builtins.int + """Server state version for cache invalidation (Sprint GAP-002) + Increment when breaking state changes require client cache invalidation + """ + @property + def supported_sample_rates(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Supported sample rates""" + + def __init__( + self, + *, + version: builtins.str = ..., + asr_model: builtins.str = ..., + asr_ready: builtins.bool = ..., + supported_sample_rates: collections.abc.Iterable[builtins.int] | None = ..., + max_chunk_size: builtins.int = ..., + uptime_seconds: builtins.float = ..., + active_meetings: builtins.int = ..., + diarization_enabled: builtins.bool = ..., + diarization_ready: builtins.bool = ..., + state_version: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["active_meetings", b"active_meetings", "asr_model", b"asr_model", "asr_ready", b"asr_ready", "diarization_enabled", b"diarization_enabled", "diarization_ready", b"diarization_ready", "max_chunk_size", b"max_chunk_size", "state_version", b"state_version", "supported_sample_rates", b"supported_sample_rates", "uptime_seconds", b"uptime_seconds", "version", b"version"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ServerInfo: typing_extensions.TypeAlias = ServerInfo + +@typing.final +class AsrConfiguration(google.protobuf.message.Message): + """Current ASR configuration and capabilities""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MODEL_SIZE_FIELD_NUMBER: builtins.int + DEVICE_FIELD_NUMBER: builtins.int + COMPUTE_TYPE_FIELD_NUMBER: builtins.int + IS_READY_FIELD_NUMBER: builtins.int + CUDA_AVAILABLE_FIELD_NUMBER: builtins.int + AVAILABLE_MODEL_SIZES_FIELD_NUMBER: builtins.int + AVAILABLE_COMPUTE_TYPES_FIELD_NUMBER: builtins.int + model_size: builtins.str + """Currently loaded model size (e.g., "base", "small", "medium")""" + device: Global___AsrDevice.ValueType + """Current device in use""" + compute_type: Global___AsrComputeType.ValueType + """Current compute type""" + is_ready: builtins.bool + """Whether ASR engine is ready for transcription""" + cuda_available: builtins.bool + """Whether CUDA is available on this server""" + @property + def available_model_sizes(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Available model sizes that can be loaded""" + + @property + def available_compute_types(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[Global___AsrComputeType.ValueType]: + """Available compute types for current device""" + + def __init__( + self, + *, + model_size: builtins.str = ..., + device: Global___AsrDevice.ValueType = ..., + compute_type: Global___AsrComputeType.ValueType = ..., + is_ready: builtins.bool = ..., + cuda_available: builtins.bool = ..., + available_model_sizes: collections.abc.Iterable[builtins.str] | None = ..., + available_compute_types: collections.abc.Iterable[Global___AsrComputeType.ValueType] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["available_compute_types", b"available_compute_types", "available_model_sizes", b"available_model_sizes", "compute_type", b"compute_type", "cuda_available", b"cuda_available", "device", b"device", "is_ready", b"is_ready", "model_size", b"model_size"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___AsrConfiguration: typing_extensions.TypeAlias = AsrConfiguration + +@typing.final +class GetAsrConfigurationRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetAsrConfigurationRequest: typing_extensions.TypeAlias = GetAsrConfigurationRequest + +@typing.final +class GetAsrConfigurationResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CONFIGURATION_FIELD_NUMBER: builtins.int + @property + def configuration(self) -> Global___AsrConfiguration: ... + def __init__( + self, + *, + configuration: Global___AsrConfiguration | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["configuration", b"configuration"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["configuration", b"configuration"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetAsrConfigurationResponse: typing_extensions.TypeAlias = GetAsrConfigurationResponse + +@typing.final +class UpdateAsrConfigurationRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MODEL_SIZE_FIELD_NUMBER: builtins.int + DEVICE_FIELD_NUMBER: builtins.int + COMPUTE_TYPE_FIELD_NUMBER: builtins.int + model_size: builtins.str + """New model size to load (optional, keeps current if empty)""" + device: Global___AsrDevice.ValueType + """New device (optional, keeps current if unspecified)""" + compute_type: Global___AsrComputeType.ValueType + """New compute type (optional, keeps current if unspecified)""" + def __init__( + self, + *, + model_size: builtins.str | None = ..., + device: Global___AsrDevice.ValueType | None = ..., + compute_type: Global___AsrComputeType.ValueType | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_compute_type", b"_compute_type", "_device", b"_device", "_model_size", b"_model_size", "compute_type", b"compute_type", "device", b"device", "model_size", b"model_size"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_compute_type", b"_compute_type", "_device", b"_device", "_model_size", b"_model_size", "compute_type", b"compute_type", "device", b"device", "model_size", b"model_size"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__compute_type: typing_extensions.TypeAlias = typing.Literal["compute_type"] + _WhichOneofArgType__compute_type: typing_extensions.TypeAlias = typing.Literal["_compute_type", b"_compute_type"] + _WhichOneofReturnType__device: typing_extensions.TypeAlias = typing.Literal["device"] + _WhichOneofArgType__device: typing_extensions.TypeAlias = typing.Literal["_device", b"_device"] + _WhichOneofReturnType__model_size: typing_extensions.TypeAlias = typing.Literal["model_size"] + _WhichOneofArgType__model_size: typing_extensions.TypeAlias = typing.Literal["_model_size", b"_model_size"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__compute_type) -> _WhichOneofReturnType__compute_type | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__device) -> _WhichOneofReturnType__device | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__model_size) -> _WhichOneofReturnType__model_size | None: ... + +Global___UpdateAsrConfigurationRequest: typing_extensions.TypeAlias = UpdateAsrConfigurationRequest + +@typing.final +class UpdateAsrConfigurationResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOB_ID_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + ACCEPTED_FIELD_NUMBER: builtins.int + job_id: builtins.str + """Background job identifier for tracking reload progress""" + status: Global___JobStatus.ValueType + """Initial status (always QUEUED or RUNNING)""" + error_message: builtins.str + """Error message if validation failed before job creation""" + accepted: builtins.bool + """Whether the request was accepted (false if active recording)""" + def __init__( + self, + *, + job_id: builtins.str = ..., + status: Global___JobStatus.ValueType = ..., + error_message: builtins.str = ..., + accepted: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["accepted", b"accepted", "error_message", b"error_message", "job_id", b"job_id", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___UpdateAsrConfigurationResponse: typing_extensions.TypeAlias = UpdateAsrConfigurationResponse + +@typing.final +class GetAsrConfigurationJobStatusRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOB_ID_FIELD_NUMBER: builtins.int + job_id: builtins.str + def __init__( + self, + *, + job_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["job_id", b"job_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetAsrConfigurationJobStatusRequest: typing_extensions.TypeAlias = GetAsrConfigurationJobStatusRequest + +@typing.final +class AsrConfigurationJobStatus(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOB_ID_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + PROGRESS_PERCENT_FIELD_NUMBER: builtins.int + PHASE_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + NEW_CONFIGURATION_FIELD_NUMBER: builtins.int + job_id: builtins.str + status: Global___JobStatus.ValueType + """Current status""" + progress_percent: builtins.float + """Progress percentage (0.0-100.0), primarily for model download""" + phase: builtins.str + """Current phase: "validating", "downloading", "loading", "completed" """ + error_message: builtins.str + """Error message if failed""" + @property + def new_configuration(self) -> Global___AsrConfiguration: + """New configuration after successful reload""" + + def __init__( + self, + *, + job_id: builtins.str = ..., + status: Global___JobStatus.ValueType = ..., + progress_percent: builtins.float = ..., + phase: builtins.str = ..., + error_message: builtins.str = ..., + new_configuration: Global___AsrConfiguration | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_new_configuration", b"_new_configuration", "new_configuration", b"new_configuration"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_new_configuration", b"_new_configuration", "error_message", b"error_message", "job_id", b"job_id", "new_configuration", b"new_configuration", "phase", b"phase", "progress_percent", b"progress_percent", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__new_configuration: typing_extensions.TypeAlias = typing.Literal["new_configuration"] + _WhichOneofArgType__new_configuration: typing_extensions.TypeAlias = typing.Literal["_new_configuration", b"_new_configuration"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__new_configuration) -> _WhichOneofReturnType__new_configuration | None: ... + +Global___AsrConfigurationJobStatus: typing_extensions.TypeAlias = AsrConfigurationJobStatus + +@typing.final +class Annotation(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + MEETING_ID_FIELD_NUMBER: builtins.int + ANNOTATION_TYPE_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + SEGMENT_IDS_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique annotation identifier""" + meeting_id: builtins.str + """Meeting this annotation belongs to""" + annotation_type: Global___AnnotationType.ValueType + """Type of annotation""" + text: builtins.str + """Annotation text""" + start_time: builtins.float + """Start time relative to meeting start (seconds)""" + end_time: builtins.float + """End time relative to meeting start (seconds)""" + created_at: builtins.float + """Creation timestamp (Unix epoch seconds)""" + @property + def segment_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Linked segment IDs (evidence linking)""" + + def __init__( + self, + *, + id: builtins.str = ..., + meeting_id: builtins.str = ..., + annotation_type: Global___AnnotationType.ValueType = ..., + text: builtins.str = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + segment_ids: collections.abc.Iterable[builtins.int] | None = ..., + created_at: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["annotation_type", b"annotation_type", "created_at", b"created_at", "end_time", b"end_time", "id", b"id", "meeting_id", b"meeting_id", "segment_ids", b"segment_ids", "start_time", b"start_time", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___Annotation: typing_extensions.TypeAlias = Annotation + +@typing.final +class AddAnnotationRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + ANNOTATION_TYPE_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + SEGMENT_IDS_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID to add annotation to""" + annotation_type: Global___AnnotationType.ValueType + """Type of annotation""" + text: builtins.str + """Annotation text""" + start_time: builtins.float + """Start time relative to meeting start (seconds)""" + end_time: builtins.float + """End time relative to meeting start (seconds)""" + @property + def segment_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Optional linked segment IDs""" + + def __init__( + self, + *, + meeting_id: builtins.str = ..., + annotation_type: Global___AnnotationType.ValueType = ..., + text: builtins.str = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + segment_ids: collections.abc.Iterable[builtins.int] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["annotation_type", b"annotation_type", "end_time", b"end_time", "meeting_id", b"meeting_id", "segment_ids", b"segment_ids", "start_time", b"start_time", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___AddAnnotationRequest: typing_extensions.TypeAlias = AddAnnotationRequest + +@typing.final +class GetAnnotationRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ANNOTATION_ID_FIELD_NUMBER: builtins.int + annotation_id: builtins.str + def __init__( + self, + *, + annotation_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["annotation_id", b"annotation_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetAnnotationRequest: typing_extensions.TypeAlias = GetAnnotationRequest + +@typing.final +class ListAnnotationsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID to list annotations for""" + start_time: builtins.float + """Optional time range filter""" + end_time: builtins.float + def __init__( + self, + *, + meeting_id: builtins.str = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["end_time", b"end_time", "meeting_id", b"meeting_id", "start_time", b"start_time"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListAnnotationsRequest: typing_extensions.TypeAlias = ListAnnotationsRequest + +@typing.final +class ListAnnotationsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ANNOTATIONS_FIELD_NUMBER: builtins.int + @property + def annotations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___Annotation]: ... + def __init__( + self, + *, + annotations: collections.abc.Iterable[Global___Annotation] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["annotations", b"annotations"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListAnnotationsResponse: typing_extensions.TypeAlias = ListAnnotationsResponse + +@typing.final +class UpdateAnnotationRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ANNOTATION_ID_FIELD_NUMBER: builtins.int + ANNOTATION_TYPE_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + SEGMENT_IDS_FIELD_NUMBER: builtins.int + annotation_id: builtins.str + """Annotation ID to update""" + annotation_type: Global___AnnotationType.ValueType + """Updated type (optional, keeps existing if not set)""" + text: builtins.str + """Updated text (optional, keeps existing if empty)""" + start_time: builtins.float + """Updated start time (optional, keeps existing if 0)""" + end_time: builtins.float + """Updated end time (optional, keeps existing if 0)""" + @property + def segment_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Updated segment IDs (replaces existing)""" + + def __init__( + self, + *, + annotation_id: builtins.str = ..., + annotation_type: Global___AnnotationType.ValueType = ..., + text: builtins.str = ..., + start_time: builtins.float = ..., + end_time: builtins.float = ..., + segment_ids: collections.abc.Iterable[builtins.int] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["annotation_id", b"annotation_id", "annotation_type", b"annotation_type", "end_time", b"end_time", "segment_ids", b"segment_ids", "start_time", b"start_time", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___UpdateAnnotationRequest: typing_extensions.TypeAlias = UpdateAnnotationRequest + +@typing.final +class DeleteAnnotationRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ANNOTATION_ID_FIELD_NUMBER: builtins.int + annotation_id: builtins.str + def __init__( + self, + *, + annotation_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["annotation_id", b"annotation_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteAnnotationRequest: typing_extensions.TypeAlias = DeleteAnnotationRequest + +@typing.final +class DeleteAnnotationResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteAnnotationResponse: typing_extensions.TypeAlias = DeleteAnnotationResponse + +@typing.final +class ProcessingStepState(google.protobuf.message.Message): + """State of a single processing step with timing and error info""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATUS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + STARTED_AT_FIELD_NUMBER: builtins.int + COMPLETED_AT_FIELD_NUMBER: builtins.int + status: Global___ProcessingStepStatus.ValueType + """Current status of this step""" + error_message: builtins.str + """Error message if status is FAILED""" + started_at: builtins.float + """When this step started (Unix epoch seconds), 0 if not started""" + completed_at: builtins.float + """When this step completed (Unix epoch seconds), 0 if not completed""" + def __init__( + self, + *, + status: Global___ProcessingStepStatus.ValueType = ..., + error_message: builtins.str = ..., + started_at: builtins.float = ..., + completed_at: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["completed_at", b"completed_at", "error_message", b"error_message", "started_at", b"started_at", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ProcessingStepState: typing_extensions.TypeAlias = ProcessingStepState + +@typing.final +class ProcessingStatus(google.protobuf.message.Message): + """Aggregate status of all post-processing steps for a meeting""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUMMARY_FIELD_NUMBER: builtins.int + ENTITIES_FIELD_NUMBER: builtins.int + DIARIZATION_FIELD_NUMBER: builtins.int + @property + def summary(self) -> Global___ProcessingStepState: + """Summary generation status""" + + @property + def entities(self) -> Global___ProcessingStepState: + """Entity extraction status""" + + @property + def diarization(self) -> Global___ProcessingStepState: + """Speaker diarization status""" + + def __init__( + self, + *, + summary: Global___ProcessingStepState | None = ..., + entities: Global___ProcessingStepState | None = ..., + diarization: Global___ProcessingStepState | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["diarization", b"diarization", "entities", b"entities", "summary", b"summary"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["diarization", b"diarization", "entities", b"entities", "summary", b"summary"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ProcessingStatus: typing_extensions.TypeAlias = ProcessingStatus + +@typing.final +class ExportTranscriptRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + FORMAT_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID to export""" + format: Global___ExportFormat.ValueType + """Export format""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + format: Global___ExportFormat.ValueType = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["format", b"format", "meeting_id", b"meeting_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ExportTranscriptRequest: typing_extensions.TypeAlias = ExportTranscriptRequest + +@typing.final +class ExportTranscriptResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CONTENT_FIELD_NUMBER: builtins.int + FORMAT_NAME_FIELD_NUMBER: builtins.int + FILE_EXTENSION_FIELD_NUMBER: builtins.int + content: builtins.str + """Exported content""" + format_name: builtins.str + """Format name""" + file_extension: builtins.str + """Suggested file extension""" + def __init__( + self, + *, + content: builtins.str = ..., + format_name: builtins.str = ..., + file_extension: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["content", b"content", "file_extension", b"file_extension", "format_name", b"format_name"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ExportTranscriptResponse: typing_extensions.TypeAlias = ExportTranscriptResponse + +@typing.final +class RefineSpeakerDiarizationRequest(google.protobuf.message.Message): + """============================================================================= + Speaker Diarization Messages + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + NUM_SPEAKERS_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID to run diarization on""" + num_speakers: builtins.int + """Optional known number of speakers (auto-detect if not set or 0)""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + num_speakers: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["meeting_id", b"meeting_id", "num_speakers", b"num_speakers"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RefineSpeakerDiarizationRequest: typing_extensions.TypeAlias = RefineSpeakerDiarizationRequest + +@typing.final +class RefineSpeakerDiarizationResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEGMENTS_UPDATED_FIELD_NUMBER: builtins.int + SPEAKER_IDS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + JOB_ID_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + segments_updated: builtins.int + """Number of segments updated with speaker labels""" + error_message: builtins.str + """Error message if diarization failed""" + job_id: builtins.str + """Background job identifier (empty if request failed)""" + status: Global___JobStatus.ValueType + """Current job status""" + @property + def speaker_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Distinct speaker IDs found""" + + def __init__( + self, + *, + segments_updated: builtins.int = ..., + speaker_ids: collections.abc.Iterable[builtins.str] | None = ..., + error_message: builtins.str = ..., + job_id: builtins.str = ..., + status: Global___JobStatus.ValueType = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "job_id", b"job_id", "segments_updated", b"segments_updated", "speaker_ids", b"speaker_ids", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RefineSpeakerDiarizationResponse: typing_extensions.TypeAlias = RefineSpeakerDiarizationResponse + +@typing.final +class RenameSpeakerRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + OLD_SPEAKER_ID_FIELD_NUMBER: builtins.int + NEW_SPEAKER_NAME_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID""" + old_speaker_id: builtins.str + """Original speaker ID (e.g., "SPEAKER_00")""" + new_speaker_name: builtins.str + """New speaker name (e.g., "Alice")""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + old_speaker_id: builtins.str = ..., + new_speaker_name: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["meeting_id", b"meeting_id", "new_speaker_name", b"new_speaker_name", "old_speaker_id", b"old_speaker_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RenameSpeakerRequest: typing_extensions.TypeAlias = RenameSpeakerRequest + +@typing.final +class RenameSpeakerResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SEGMENTS_UPDATED_FIELD_NUMBER: builtins.int + SUCCESS_FIELD_NUMBER: builtins.int + segments_updated: builtins.int + """Number of segments updated""" + success: builtins.bool + """Success flag""" + def __init__( + self, + *, + segments_updated: builtins.int = ..., + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["segments_updated", b"segments_updated", "success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RenameSpeakerResponse: typing_extensions.TypeAlias = RenameSpeakerResponse + +@typing.final +class GetDiarizationJobStatusRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOB_ID_FIELD_NUMBER: builtins.int + job_id: builtins.str + """Job ID returned by RefineSpeakerDiarization""" + def __init__( + self, + *, + job_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["job_id", b"job_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetDiarizationJobStatusRequest: typing_extensions.TypeAlias = GetDiarizationJobStatusRequest + +@typing.final +class DiarizationJobStatus(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOB_ID_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + SEGMENTS_UPDATED_FIELD_NUMBER: builtins.int + SPEAKER_IDS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + PROGRESS_PERCENT_FIELD_NUMBER: builtins.int + job_id: builtins.str + """Job ID""" + status: Global___JobStatus.ValueType + """Current status""" + segments_updated: builtins.int + """Number of segments updated (when completed)""" + error_message: builtins.str + """Error message if failed""" + progress_percent: builtins.float + """Progress percentage (0.0-100.0)""" + @property + def speaker_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Distinct speaker IDs found (when completed)""" + + def __init__( + self, + *, + job_id: builtins.str = ..., + status: Global___JobStatus.ValueType = ..., + segments_updated: builtins.int = ..., + speaker_ids: collections.abc.Iterable[builtins.str] | None = ..., + error_message: builtins.str = ..., + progress_percent: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "job_id", b"job_id", "progress_percent", b"progress_percent", "segments_updated", b"segments_updated", "speaker_ids", b"speaker_ids", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DiarizationJobStatus: typing_extensions.TypeAlias = DiarizationJobStatus + +@typing.final +class CancelDiarizationJobRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOB_ID_FIELD_NUMBER: builtins.int + job_id: builtins.str + """Job ID to cancel""" + def __init__( + self, + *, + job_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["job_id", b"job_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CancelDiarizationJobRequest: typing_extensions.TypeAlias = CancelDiarizationJobRequest + +@typing.final +class CancelDiarizationJobResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether cancellation succeeded""" + error_message: builtins.str + """Error message if failed""" + status: Global___JobStatus.ValueType + """Final job status""" + def __init__( + self, + *, + success: builtins.bool = ..., + error_message: builtins.str = ..., + status: Global___JobStatus.ValueType = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "status", b"status", "success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CancelDiarizationJobResponse: typing_extensions.TypeAlias = CancelDiarizationJobResponse + +@typing.final +class GetActiveDiarizationJobsRequest(google.protobuf.message.Message): + """Empty - returns all active jobs for the current user/session""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetActiveDiarizationJobsRequest: typing_extensions.TypeAlias = GetActiveDiarizationJobsRequest + +@typing.final +class GetActiveDiarizationJobsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + JOBS_FIELD_NUMBER: builtins.int + @property + def jobs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___DiarizationJobStatus]: + """List of active (QUEUED or RUNNING) diarization jobs""" + + def __init__( + self, + *, + jobs: collections.abc.Iterable[Global___DiarizationJobStatus] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["jobs", b"jobs"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetActiveDiarizationJobsResponse: typing_extensions.TypeAlias = GetActiveDiarizationJobsResponse + +@typing.final +class ExtractEntitiesRequest(google.protobuf.message.Message): + """============================================================================= + Named Entity Extraction Messages (Sprint 4) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + FORCE_REFRESH_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID to extract entities from""" + force_refresh: builtins.bool + """Force re-extraction even if entities exist""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + force_refresh: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["force_refresh", b"force_refresh", "meeting_id", b"meeting_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ExtractEntitiesRequest: typing_extensions.TypeAlias = ExtractEntitiesRequest + +@typing.final +class ExtractedEntity(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + CATEGORY_FIELD_NUMBER: builtins.int + SEGMENT_IDS_FIELD_NUMBER: builtins.int + CONFIDENCE_FIELD_NUMBER: builtins.int + IS_PINNED_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique entity identifier""" + text: builtins.str + """Entity text as it appears in transcript""" + category: builtins.str + """Category: person, company, product, technical, acronym, location, date, other""" + confidence: builtins.float + """Extraction confidence (0.0-1.0)""" + is_pinned: builtins.bool + """User-confirmed (pinned) entity""" + @property + def segment_ids(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.int]: + """Segment IDs where this entity appears""" + + def __init__( + self, + *, + id: builtins.str = ..., + text: builtins.str = ..., + category: builtins.str = ..., + segment_ids: collections.abc.Iterable[builtins.int] | None = ..., + confidence: builtins.float = ..., + is_pinned: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["category", b"category", "confidence", b"confidence", "id", b"id", "is_pinned", b"is_pinned", "segment_ids", b"segment_ids", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ExtractedEntity: typing_extensions.TypeAlias = ExtractedEntity + +@typing.final +class ExtractEntitiesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ENTITIES_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + CACHED_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total entity count""" + cached: builtins.bool + """True if returning cached results""" + @property + def entities(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ExtractedEntity]: + """Extracted entities""" + + def __init__( + self, + *, + entities: collections.abc.Iterable[Global___ExtractedEntity] | None = ..., + total_count: builtins.int = ..., + cached: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["cached", b"cached", "entities", b"entities", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ExtractEntitiesResponse: typing_extensions.TypeAlias = ExtractEntitiesResponse + +@typing.final +class UpdateEntityRequest(google.protobuf.message.Message): + """Entity mutation messages (Sprint 8)""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + ENTITY_ID_FIELD_NUMBER: builtins.int + TEXT_FIELD_NUMBER: builtins.int + CATEGORY_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID containing the entity""" + entity_id: builtins.str + """Entity ID to update""" + text: builtins.str + """New text value (optional, empty = no change)""" + category: builtins.str + """New category value (optional, empty = no change)""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + entity_id: builtins.str = ..., + text: builtins.str = ..., + category: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["category", b"category", "entity_id", b"entity_id", "meeting_id", b"meeting_id", "text", b"text"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___UpdateEntityRequest: typing_extensions.TypeAlias = UpdateEntityRequest + +@typing.final +class UpdateEntityResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ENTITY_FIELD_NUMBER: builtins.int + @property + def entity(self) -> Global___ExtractedEntity: + """Updated entity""" + + def __init__( + self, + *, + entity: Global___ExtractedEntity | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["entity", b"entity"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["entity", b"entity"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___UpdateEntityResponse: typing_extensions.TypeAlias = UpdateEntityResponse + +@typing.final +class DeleteEntityRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEETING_ID_FIELD_NUMBER: builtins.int + ENTITY_ID_FIELD_NUMBER: builtins.int + meeting_id: builtins.str + """Meeting ID containing the entity""" + entity_id: builtins.str + """Entity ID to delete""" + def __init__( + self, + *, + meeting_id: builtins.str = ..., + entity_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["entity_id", b"entity_id", "meeting_id", b"meeting_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteEntityRequest: typing_extensions.TypeAlias = DeleteEntityRequest + +@typing.final +class DeleteEntityResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + """True if entity was deleted""" + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteEntityResponse: typing_extensions.TypeAlias = DeleteEntityResponse + +@typing.final +class CalendarEvent(google.protobuf.message.Message): + """============================================================================= + Calendar Integration Messages (Sprint 5) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + TITLE_FIELD_NUMBER: builtins.int + START_TIME_FIELD_NUMBER: builtins.int + END_TIME_FIELD_NUMBER: builtins.int + ATTENDEES_FIELD_NUMBER: builtins.int + LOCATION_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + MEETING_URL_FIELD_NUMBER: builtins.int + IS_RECURRING_FIELD_NUMBER: builtins.int + PROVIDER_FIELD_NUMBER: builtins.int + id: builtins.str + """Calendar event identifier""" + title: builtins.str + """Event title""" + start_time: builtins.int + """Start time (Unix timestamp seconds)""" + end_time: builtins.int + """End time (Unix timestamp seconds)""" + location: builtins.str + """Event location""" + description: builtins.str + """Event description""" + meeting_url: builtins.str + """Meeting URL (Zoom, Meet, Teams, etc.)""" + is_recurring: builtins.bool + """Whether event is recurring""" + provider: builtins.str + """Calendar provider: google, outlook""" + @property + def attendees(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Attendee email addresses""" + + def __init__( + self, + *, + id: builtins.str = ..., + title: builtins.str = ..., + start_time: builtins.int = ..., + end_time: builtins.int = ..., + attendees: collections.abc.Iterable[builtins.str] | None = ..., + location: builtins.str = ..., + description: builtins.str = ..., + meeting_url: builtins.str = ..., + is_recurring: builtins.bool = ..., + provider: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["attendees", b"attendees", "description", b"description", "end_time", b"end_time", "id", b"id", "is_recurring", b"is_recurring", "location", b"location", "meeting_url", b"meeting_url", "provider", b"provider", "start_time", b"start_time", "title", b"title"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CalendarEvent: typing_extensions.TypeAlias = CalendarEvent + +@typing.final +class ListCalendarEventsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + HOURS_AHEAD_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + PROVIDER_FIELD_NUMBER: builtins.int + hours_ahead: builtins.int + """How far ahead to look in hours (default: 24)""" + limit: builtins.int + """Maximum events to return (default: 10)""" + provider: builtins.str + """Optional: specific provider name""" + def __init__( + self, + *, + hours_ahead: builtins.int = ..., + limit: builtins.int = ..., + provider: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["hours_ahead", b"hours_ahead", "limit", b"limit", "provider", b"provider"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListCalendarEventsRequest: typing_extensions.TypeAlias = ListCalendarEventsRequest + +@typing.final +class ListCalendarEventsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + EVENTS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total event count""" + @property + def events(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___CalendarEvent]: + """Upcoming calendar events""" + + def __init__( + self, + *, + events: collections.abc.Iterable[Global___CalendarEvent] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["events", b"events", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListCalendarEventsResponse: typing_extensions.TypeAlias = ListCalendarEventsResponse + +@typing.final +class GetCalendarProvidersRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetCalendarProvidersRequest: typing_extensions.TypeAlias = GetCalendarProvidersRequest + +@typing.final +class CalendarProvider(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + NAME_FIELD_NUMBER: builtins.int + IS_AUTHENTICATED_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + name: builtins.str + """Provider name: google, outlook""" + is_authenticated: builtins.bool + """Whether provider is authenticated""" + display_name: builtins.str + """Display name: "Google Calendar", "Microsoft Outlook" """ + def __init__( + self, + *, + name: builtins.str = ..., + is_authenticated: builtins.bool = ..., + display_name: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["display_name", b"display_name", "is_authenticated", b"is_authenticated", "name", b"name"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CalendarProvider: typing_extensions.TypeAlias = CalendarProvider + +@typing.final +class GetCalendarProvidersResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDERS_FIELD_NUMBER: builtins.int + @property + def providers(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___CalendarProvider]: + """Available calendar providers""" + + def __init__( + self, + *, + providers: collections.abc.Iterable[Global___CalendarProvider] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["providers", b"providers"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetCalendarProvidersResponse: typing_extensions.TypeAlias = GetCalendarProvidersResponse + +@typing.final +class InitiateOAuthRequest(google.protobuf.message.Message): + """============================================================================= + OAuth Integration Messages (generic for calendar, email, PKM, etc.) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_FIELD_NUMBER: builtins.int + REDIRECT_URI_FIELD_NUMBER: builtins.int + INTEGRATION_TYPE_FIELD_NUMBER: builtins.int + provider: builtins.str + """Provider to authenticate: google, outlook, notion, etc.""" + redirect_uri: builtins.str + """Redirect URI for OAuth callback""" + integration_type: builtins.str + """Integration type: calendar, email, pkm, custom""" + def __init__( + self, + *, + provider: builtins.str = ..., + redirect_uri: builtins.str = ..., + integration_type: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["integration_type", b"integration_type", "provider", b"provider", "redirect_uri", b"redirect_uri"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___InitiateOAuthRequest: typing_extensions.TypeAlias = InitiateOAuthRequest + +@typing.final +class InitiateOAuthResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + AUTH_URL_FIELD_NUMBER: builtins.int + STATE_FIELD_NUMBER: builtins.int + auth_url: builtins.str + """Authorization URL to redirect user to""" + state: builtins.str + """CSRF state token for verification""" + def __init__( + self, + *, + auth_url: builtins.str = ..., + state: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["auth_url", b"auth_url", "state", b"state"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___InitiateOAuthResponse: typing_extensions.TypeAlias = InitiateOAuthResponse + +@typing.final +class CompleteOAuthRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_FIELD_NUMBER: builtins.int + CODE_FIELD_NUMBER: builtins.int + STATE_FIELD_NUMBER: builtins.int + provider: builtins.str + """Provider being authenticated""" + code: builtins.str + """Authorization code from OAuth callback""" + state: builtins.str + """CSRF state token for verification""" + def __init__( + self, + *, + provider: builtins.str = ..., + code: builtins.str = ..., + state: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["code", b"code", "provider", b"provider", "state", b"state"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CompleteOAuthRequest: typing_extensions.TypeAlias = CompleteOAuthRequest + +@typing.final +class CompleteOAuthResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + PROVIDER_EMAIL_FIELD_NUMBER: builtins.int + INTEGRATION_ID_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether authentication succeeded""" + error_message: builtins.str + """Error message if failed""" + provider_email: builtins.str + """Email of authenticated account""" + integration_id: builtins.str + """Server-assigned integration ID (UUID string) - use this for sync operations""" + def __init__( + self, + *, + success: builtins.bool = ..., + error_message: builtins.str = ..., + provider_email: builtins.str = ..., + integration_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "integration_id", b"integration_id", "provider_email", b"provider_email", "success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___CompleteOAuthResponse: typing_extensions.TypeAlias = CompleteOAuthResponse + +@typing.final +class OAuthConnection(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + EMAIL_FIELD_NUMBER: builtins.int + EXPIRES_AT_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + INTEGRATION_TYPE_FIELD_NUMBER: builtins.int + provider: builtins.str + """Provider name: google, outlook, notion""" + status: builtins.str + """Connection status: disconnected, connected, error""" + email: builtins.str + """Email of authenticated account""" + expires_at: builtins.int + """Token expiration timestamp (Unix epoch seconds)""" + error_message: builtins.str + """Error message if status is error""" + integration_type: builtins.str + """Integration type: calendar, email, pkm, custom""" + def __init__( + self, + *, + provider: builtins.str = ..., + status: builtins.str = ..., + email: builtins.str = ..., + expires_at: builtins.int = ..., + error_message: builtins.str = ..., + integration_type: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["email", b"email", "error_message", b"error_message", "expires_at", b"expires_at", "integration_type", b"integration_type", "provider", b"provider", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___OAuthConnection: typing_extensions.TypeAlias = OAuthConnection + +@typing.final +class GetOAuthConnectionStatusRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_FIELD_NUMBER: builtins.int + INTEGRATION_TYPE_FIELD_NUMBER: builtins.int + provider: builtins.str + """Provider to check: google, outlook, notion""" + integration_type: builtins.str + """Optional integration type filter""" + def __init__( + self, + *, + provider: builtins.str = ..., + integration_type: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["integration_type", b"integration_type", "provider", b"provider"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetOAuthConnectionStatusRequest: typing_extensions.TypeAlias = GetOAuthConnectionStatusRequest + +@typing.final +class GetOAuthConnectionStatusResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CONNECTION_FIELD_NUMBER: builtins.int + @property + def connection(self) -> Global___OAuthConnection: + """Connection details""" + + def __init__( + self, + *, + connection: Global___OAuthConnection | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["connection", b"connection"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["connection", b"connection"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetOAuthConnectionStatusResponse: typing_extensions.TypeAlias = GetOAuthConnectionStatusResponse + +@typing.final +class DisconnectOAuthRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_FIELD_NUMBER: builtins.int + INTEGRATION_TYPE_FIELD_NUMBER: builtins.int + provider: builtins.str + """Provider to disconnect""" + integration_type: builtins.str + """Optional integration type""" + def __init__( + self, + *, + provider: builtins.str = ..., + integration_type: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["integration_type", b"integration_type", "provider", b"provider"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DisconnectOAuthRequest: typing_extensions.TypeAlias = DisconnectOAuthRequest + +@typing.final +class DisconnectOAuthResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether disconnection succeeded""" + error_message: builtins.str + """Error message if failed""" + def __init__( + self, + *, + success: builtins.bool = ..., + error_message: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DisconnectOAuthResponse: typing_extensions.TypeAlias = DisconnectOAuthResponse + +@typing.final +class RegisterWebhookRequest(google.protobuf.message.Message): + """============================================================================= + Webhook Management Messages (Sprint 6) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + URL_FIELD_NUMBER: builtins.int + EVENTS_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SECRET_FIELD_NUMBER: builtins.int + TIMEOUT_MS_FIELD_NUMBER: builtins.int + MAX_RETRIES_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace this webhook belongs to""" + url: builtins.str + """Target URL for webhook delivery""" + name: builtins.str + """Human-readable webhook name""" + secret: builtins.str + """Optional HMAC signing secret""" + timeout_ms: builtins.int + """Request timeout in milliseconds (default: 10000)""" + max_retries: builtins.int + """Maximum retry attempts (default: 3)""" + @property + def events(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Events to subscribe to: meeting.completed, summary.generated, recording.started, recording.stopped""" + + def __init__( + self, + *, + workspace_id: builtins.str = ..., + url: builtins.str = ..., + events: collections.abc.Iterable[builtins.str] | None = ..., + name: builtins.str = ..., + secret: builtins.str = ..., + timeout_ms: builtins.int = ..., + max_retries: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["events", b"events", "max_retries", b"max_retries", "name", b"name", "secret", b"secret", "timeout_ms", b"timeout_ms", "url", b"url", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RegisterWebhookRequest: typing_extensions.TypeAlias = RegisterWebhookRequest + +@typing.final +class WebhookConfigProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + URL_FIELD_NUMBER: builtins.int + EVENTS_FIELD_NUMBER: builtins.int + ENABLED_FIELD_NUMBER: builtins.int + TIMEOUT_MS_FIELD_NUMBER: builtins.int + MAX_RETRIES_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + UPDATED_AT_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique webhook identifier""" + workspace_id: builtins.str + """Workspace this webhook belongs to""" + name: builtins.str + """Human-readable webhook name""" + url: builtins.str + """Target URL for webhook delivery""" + enabled: builtins.bool + """Whether webhook is enabled""" + timeout_ms: builtins.int + """Request timeout in milliseconds""" + max_retries: builtins.int + """Maximum retry attempts""" + created_at: builtins.int + """Creation timestamp (Unix epoch seconds)""" + updated_at: builtins.int + """Last update timestamp (Unix epoch seconds)""" + @property + def events(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Subscribed event types""" + + def __init__( + self, + *, + id: builtins.str = ..., + workspace_id: builtins.str = ..., + name: builtins.str = ..., + url: builtins.str = ..., + events: collections.abc.Iterable[builtins.str] | None = ..., + enabled: builtins.bool = ..., + timeout_ms: builtins.int = ..., + max_retries: builtins.int = ..., + created_at: builtins.int = ..., + updated_at: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["created_at", b"created_at", "enabled", b"enabled", "events", b"events", "id", b"id", "max_retries", b"max_retries", "name", b"name", "timeout_ms", b"timeout_ms", "updated_at", b"updated_at", "url", b"url", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___WebhookConfigProto: typing_extensions.TypeAlias = WebhookConfigProto + +@typing.final +class ListWebhooksRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ENABLED_ONLY_FIELD_NUMBER: builtins.int + enabled_only: builtins.bool + """Filter to only enabled webhooks""" + def __init__( + self, + *, + enabled_only: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["enabled_only", b"enabled_only"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListWebhooksRequest: typing_extensions.TypeAlias = ListWebhooksRequest + +@typing.final +class ListWebhooksResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WEBHOOKS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total webhook count""" + @property + def webhooks(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___WebhookConfigProto]: + """Registered webhooks""" + + def __init__( + self, + *, + webhooks: collections.abc.Iterable[Global___WebhookConfigProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["total_count", b"total_count", "webhooks", b"webhooks"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListWebhooksResponse: typing_extensions.TypeAlias = ListWebhooksResponse + +@typing.final +class UpdateWebhookRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WEBHOOK_ID_FIELD_NUMBER: builtins.int + URL_FIELD_NUMBER: builtins.int + EVENTS_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SECRET_FIELD_NUMBER: builtins.int + ENABLED_FIELD_NUMBER: builtins.int + TIMEOUT_MS_FIELD_NUMBER: builtins.int + MAX_RETRIES_FIELD_NUMBER: builtins.int + webhook_id: builtins.str + """Webhook ID to update""" + url: builtins.str + """Updated URL (optional)""" + name: builtins.str + """Updated name (optional)""" + secret: builtins.str + """Updated secret (optional)""" + enabled: builtins.bool + """Updated enabled status (optional)""" + timeout_ms: builtins.int + """Updated timeout in milliseconds (optional)""" + max_retries: builtins.int + """Updated max retries (optional)""" + @property + def events(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Updated events (replaces existing)""" + + def __init__( + self, + *, + webhook_id: builtins.str = ..., + url: builtins.str | None = ..., + events: collections.abc.Iterable[builtins.str] | None = ..., + name: builtins.str | None = ..., + secret: builtins.str | None = ..., + enabled: builtins.bool | None = ..., + timeout_ms: builtins.int | None = ..., + max_retries: builtins.int | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_enabled", b"_enabled", "_max_retries", b"_max_retries", "_name", b"_name", "_secret", b"_secret", "_timeout_ms", b"_timeout_ms", "_url", b"_url", "enabled", b"enabled", "max_retries", b"max_retries", "name", b"name", "secret", b"secret", "timeout_ms", b"timeout_ms", "url", b"url"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_enabled", b"_enabled", "_max_retries", b"_max_retries", "_name", b"_name", "_secret", b"_secret", "_timeout_ms", b"_timeout_ms", "_url", b"_url", "enabled", b"enabled", "events", b"events", "max_retries", b"max_retries", "name", b"name", "secret", b"secret", "timeout_ms", b"timeout_ms", "url", b"url", "webhook_id", b"webhook_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__enabled: typing_extensions.TypeAlias = typing.Literal["enabled"] + _WhichOneofArgType__enabled: typing_extensions.TypeAlias = typing.Literal["_enabled", b"_enabled"] + _WhichOneofReturnType__max_retries: typing_extensions.TypeAlias = typing.Literal["max_retries"] + _WhichOneofArgType__max_retries: typing_extensions.TypeAlias = typing.Literal["_max_retries", b"_max_retries"] + _WhichOneofReturnType__name: typing_extensions.TypeAlias = typing.Literal["name"] + _WhichOneofArgType__name: typing_extensions.TypeAlias = typing.Literal["_name", b"_name"] + _WhichOneofReturnType__secret: typing_extensions.TypeAlias = typing.Literal["secret"] + _WhichOneofArgType__secret: typing_extensions.TypeAlias = typing.Literal["_secret", b"_secret"] + _WhichOneofReturnType__timeout_ms: typing_extensions.TypeAlias = typing.Literal["timeout_ms"] + _WhichOneofArgType__timeout_ms: typing_extensions.TypeAlias = typing.Literal["_timeout_ms", b"_timeout_ms"] + _WhichOneofReturnType__url: typing_extensions.TypeAlias = typing.Literal["url"] + _WhichOneofArgType__url: typing_extensions.TypeAlias = typing.Literal["_url", b"_url"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__enabled) -> _WhichOneofReturnType__enabled | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__max_retries) -> _WhichOneofReturnType__max_retries | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__name) -> _WhichOneofReturnType__name | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__secret) -> _WhichOneofReturnType__secret | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__timeout_ms) -> _WhichOneofReturnType__timeout_ms | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__url) -> _WhichOneofReturnType__url | None: ... + +Global___UpdateWebhookRequest: typing_extensions.TypeAlias = UpdateWebhookRequest + +@typing.final +class DeleteWebhookRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WEBHOOK_ID_FIELD_NUMBER: builtins.int + webhook_id: builtins.str + """Webhook ID to delete""" + def __init__( + self, + *, + webhook_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["webhook_id", b"webhook_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteWebhookRequest: typing_extensions.TypeAlias = DeleteWebhookRequest + +@typing.final +class DeleteWebhookResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether deletion succeeded""" + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteWebhookResponse: typing_extensions.TypeAlias = DeleteWebhookResponse + +@typing.final +class WebhookDeliveryProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + WEBHOOK_ID_FIELD_NUMBER: builtins.int + EVENT_TYPE_FIELD_NUMBER: builtins.int + STATUS_CODE_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + ATTEMPT_COUNT_FIELD_NUMBER: builtins.int + DURATION_MS_FIELD_NUMBER: builtins.int + DELIVERED_AT_FIELD_NUMBER: builtins.int + SUCCEEDED_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique delivery identifier""" + webhook_id: builtins.str + """Webhook ID this delivery belongs to""" + event_type: builtins.str + """Event type that triggered this delivery""" + status_code: builtins.int + """HTTP status code (0 if no response)""" + error_message: builtins.str + """Error message if delivery failed""" + attempt_count: builtins.int + """Number of delivery attempts""" + duration_ms: builtins.int + """Request duration in milliseconds""" + delivered_at: builtins.int + """Delivery timestamp (Unix epoch seconds)""" + succeeded: builtins.bool + """Whether delivery succeeded""" + def __init__( + self, + *, + id: builtins.str = ..., + webhook_id: builtins.str = ..., + event_type: builtins.str = ..., + status_code: builtins.int = ..., + error_message: builtins.str = ..., + attempt_count: builtins.int = ..., + duration_ms: builtins.int = ..., + delivered_at: builtins.int = ..., + succeeded: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["attempt_count", b"attempt_count", "delivered_at", b"delivered_at", "duration_ms", b"duration_ms", "error_message", b"error_message", "event_type", b"event_type", "id", b"id", "status_code", b"status_code", "succeeded", b"succeeded", "webhook_id", b"webhook_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___WebhookDeliveryProto: typing_extensions.TypeAlias = WebhookDeliveryProto + +@typing.final +class GetWebhookDeliveriesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WEBHOOK_ID_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + webhook_id: builtins.str + """Webhook ID to get deliveries for""" + limit: builtins.int + """Maximum deliveries to return (default: 50, max: 500)""" + def __init__( + self, + *, + webhook_id: builtins.str = ..., + limit: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["limit", b"limit", "webhook_id", b"webhook_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetWebhookDeliveriesRequest: typing_extensions.TypeAlias = GetWebhookDeliveriesRequest + +@typing.final +class GetWebhookDeliveriesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + DELIVERIES_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total delivery count""" + @property + def deliveries(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___WebhookDeliveryProto]: + """Recent webhook deliveries""" + + def __init__( + self, + *, + deliveries: collections.abc.Iterable[Global___WebhookDeliveryProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["deliveries", b"deliveries", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetWebhookDeliveriesResponse: typing_extensions.TypeAlias = GetWebhookDeliveriesResponse + +@typing.final +class GrantCloudConsentRequest(google.protobuf.message.Message): + """============================================================================= + Cloud Consent Messages (Sprint 7) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GrantCloudConsentRequest: typing_extensions.TypeAlias = GrantCloudConsentRequest + +@typing.final +class GrantCloudConsentResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GrantCloudConsentResponse: typing_extensions.TypeAlias = GrantCloudConsentResponse + +@typing.final +class RevokeCloudConsentRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___RevokeCloudConsentRequest: typing_extensions.TypeAlias = RevokeCloudConsentRequest + +@typing.final +class RevokeCloudConsentResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___RevokeCloudConsentResponse: typing_extensions.TypeAlias = RevokeCloudConsentResponse + +@typing.final +class GetCloudConsentStatusRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetCloudConsentStatusRequest: typing_extensions.TypeAlias = GetCloudConsentStatusRequest + +@typing.final +class GetCloudConsentStatusResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CONSENT_GRANTED_FIELD_NUMBER: builtins.int + consent_granted: builtins.bool + """Whether cloud consent is currently granted""" + def __init__( + self, + *, + consent_granted: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["consent_granted", b"consent_granted"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetCloudConsentStatusResponse: typing_extensions.TypeAlias = GetCloudConsentStatusResponse + +@typing.final +class SetHuggingFaceTokenRequest(google.protobuf.message.Message): + """============================================================================= + HuggingFace Token Management Messages (Sprint 19) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TOKEN_FIELD_NUMBER: builtins.int + VALIDATE_FIELD_NUMBER: builtins.int + token: builtins.str + """HuggingFace access token (will be encrypted at rest)""" + validate: builtins.bool + """Whether to validate token against HuggingFace API""" + def __init__( + self, + *, + token: builtins.str = ..., + validate: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["token", b"token", "validate", b"validate"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SetHuggingFaceTokenRequest: typing_extensions.TypeAlias = SetHuggingFaceTokenRequest + +@typing.final +class SetHuggingFaceTokenResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + VALID_FIELD_NUMBER: builtins.int + VALIDATION_ERROR_FIELD_NUMBER: builtins.int + USERNAME_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether the token was saved successfully""" + valid: builtins.bool + """Whether the token passed validation (if validate=true)""" + validation_error: builtins.str + """Validation error message if valid=false""" + username: builtins.str + """HuggingFace username associated with token (if validate=true and valid)""" + def __init__( + self, + *, + success: builtins.bool = ..., + valid: builtins.bool | None = ..., + validation_error: builtins.str = ..., + username: builtins.str = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_valid", b"_valid", "valid", b"valid"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_valid", b"_valid", "success", b"success", "username", b"username", "valid", b"valid", "validation_error", b"validation_error"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__valid: typing_extensions.TypeAlias = typing.Literal["valid"] + _WhichOneofArgType__valid: typing_extensions.TypeAlias = typing.Literal["_valid", b"_valid"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__valid) -> _WhichOneofReturnType__valid | None: ... + +Global___SetHuggingFaceTokenResponse: typing_extensions.TypeAlias = SetHuggingFaceTokenResponse + +@typing.final +class GetHuggingFaceTokenStatusRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetHuggingFaceTokenStatusRequest: typing_extensions.TypeAlias = GetHuggingFaceTokenStatusRequest + +@typing.final +class GetHuggingFaceTokenStatusResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + IS_CONFIGURED_FIELD_NUMBER: builtins.int + IS_VALIDATED_FIELD_NUMBER: builtins.int + USERNAME_FIELD_NUMBER: builtins.int + VALIDATED_AT_FIELD_NUMBER: builtins.int + is_configured: builtins.bool + """Whether a token is configured""" + is_validated: builtins.bool + """Whether the token has been validated""" + username: builtins.str + """HuggingFace username (if validated)""" + validated_at: builtins.float + """Last validation timestamp (Unix epoch seconds)""" + def __init__( + self, + *, + is_configured: builtins.bool = ..., + is_validated: builtins.bool = ..., + username: builtins.str = ..., + validated_at: builtins.float = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["is_configured", b"is_configured", "is_validated", b"is_validated", "username", b"username", "validated_at", b"validated_at"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetHuggingFaceTokenStatusResponse: typing_extensions.TypeAlias = GetHuggingFaceTokenStatusResponse + +@typing.final +class DeleteHuggingFaceTokenRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___DeleteHuggingFaceTokenRequest: typing_extensions.TypeAlias = DeleteHuggingFaceTokenRequest + +@typing.final +class DeleteHuggingFaceTokenResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteHuggingFaceTokenResponse: typing_extensions.TypeAlias = DeleteHuggingFaceTokenResponse + +@typing.final +class ValidateHuggingFaceTokenRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___ValidateHuggingFaceTokenRequest: typing_extensions.TypeAlias = ValidateHuggingFaceTokenRequest + +@typing.final +class ValidateHuggingFaceTokenResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + VALID_FIELD_NUMBER: builtins.int + USERNAME_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + valid: builtins.bool + username: builtins.str + error_message: builtins.str + def __init__( + self, + *, + valid: builtins.bool = ..., + username: builtins.str = ..., + error_message: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "username", b"username", "valid", b"valid"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ValidateHuggingFaceTokenResponse: typing_extensions.TypeAlias = ValidateHuggingFaceTokenResponse + +@typing.final +class GetPreferencesRequest(google.protobuf.message.Message): + """============================================================================= + User Preferences Sync Messages (Sprint 14) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEYS_FIELD_NUMBER: builtins.int + @property + def keys(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Optional: filter to specific keys (empty = all)""" + + def __init__( + self, + *, + keys: collections.abc.Iterable[builtins.str] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["keys", b"keys"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetPreferencesRequest: typing_extensions.TypeAlias = GetPreferencesRequest + +@typing.final +class GetPreferencesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class PreferencesEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + PREFERENCES_FIELD_NUMBER: builtins.int + UPDATED_AT_FIELD_NUMBER: builtins.int + ETAG_FIELD_NUMBER: builtins.int + updated_at: builtins.float + """Server-side last update timestamp (Unix epoch seconds)""" + etag: builtins.str + """ETag for optimistic concurrency control""" + @property + def preferences(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """All preference key-value pairs as JSON strings + Key: preference key, Value: JSON-encoded value + """ + + def __init__( + self, + *, + preferences: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + updated_at: builtins.float = ..., + etag: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["etag", b"etag", "preferences", b"preferences", "updated_at", b"updated_at"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetPreferencesResponse: typing_extensions.TypeAlias = GetPreferencesResponse + +@typing.final +class SetPreferencesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class PreferencesEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + PREFERENCES_FIELD_NUMBER: builtins.int + IF_MATCH_FIELD_NUMBER: builtins.int + CLIENT_UPDATED_AT_FIELD_NUMBER: builtins.int + MERGE_FIELD_NUMBER: builtins.int + if_match: builtins.str + """Optional ETag for conflict detection (if-match)""" + client_updated_at: builtins.float + """Client-side last update timestamp for conflict resolution""" + merge: builtins.bool + """Merge mode: if true, only updates provided keys; if false, replaces all""" + @property + def preferences(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """Preferences to update as JSON strings + Key: preference key, Value: JSON-encoded value + """ + + def __init__( + self, + *, + preferences: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + if_match: builtins.str = ..., + client_updated_at: builtins.float = ..., + merge: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["client_updated_at", b"client_updated_at", "if_match", b"if_match", "merge", b"merge", "preferences", b"preferences"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SetPreferencesRequest: typing_extensions.TypeAlias = SetPreferencesRequest + +@typing.final +class SetPreferencesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class ServerPreferencesEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + SUCCESS_FIELD_NUMBER: builtins.int + CONFLICT_FIELD_NUMBER: builtins.int + SERVER_PREFERENCES_FIELD_NUMBER: builtins.int + SERVER_UPDATED_AT_FIELD_NUMBER: builtins.int + ETAG_FIELD_NUMBER: builtins.int + CONFLICT_MESSAGE_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether the update succeeded""" + conflict: builtins.bool + """Whether a conflict was detected (client data was stale)""" + server_updated_at: builtins.float + """Server-side timestamp after update""" + etag: builtins.str + """New ETag after update""" + conflict_message: builtins.str + """Conflict details if conflict = true""" + @property + def server_preferences(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """Server preferences after update (or current state if conflict)""" + + def __init__( + self, + *, + success: builtins.bool = ..., + conflict: builtins.bool = ..., + server_preferences: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + server_updated_at: builtins.float = ..., + etag: builtins.str = ..., + conflict_message: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["conflict", b"conflict", "conflict_message", b"conflict_message", "etag", b"etag", "server_preferences", b"server_preferences", "server_updated_at", b"server_updated_at", "success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SetPreferencesResponse: typing_extensions.TypeAlias = SetPreferencesResponse + +@typing.final +class StartIntegrationSyncRequest(google.protobuf.message.Message): + """============================================================================= + Integration Sync Orchestration Messages (Sprint 9) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + INTEGRATION_ID_FIELD_NUMBER: builtins.int + integration_id: builtins.str + """Integration ID to sync""" + def __init__( + self, + *, + integration_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["integration_id", b"integration_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___StartIntegrationSyncRequest: typing_extensions.TypeAlias = StartIntegrationSyncRequest + +@typing.final +class StartIntegrationSyncResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SYNC_RUN_ID_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + sync_run_id: builtins.str + """Unique sync run identifier""" + status: builtins.str + """Initial status (always "running")""" + def __init__( + self, + *, + sync_run_id: builtins.str = ..., + status: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["status", b"status", "sync_run_id", b"sync_run_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___StartIntegrationSyncResponse: typing_extensions.TypeAlias = StartIntegrationSyncResponse + +@typing.final +class GetSyncStatusRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SYNC_RUN_ID_FIELD_NUMBER: builtins.int + sync_run_id: builtins.str + """Sync run ID to check""" + def __init__( + self, + *, + sync_run_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["sync_run_id", b"sync_run_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetSyncStatusRequest: typing_extensions.TypeAlias = GetSyncStatusRequest + +@typing.final +class GetSyncStatusResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + STATUS_FIELD_NUMBER: builtins.int + ITEMS_SYNCED_FIELD_NUMBER: builtins.int + ITEMS_TOTAL_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + DURATION_MS_FIELD_NUMBER: builtins.int + EXPIRES_AT_FIELD_NUMBER: builtins.int + NOT_FOUND_REASON_FIELD_NUMBER: builtins.int + status: builtins.str + """Current status: "running", "success", "error" """ + items_synced: builtins.int + """Number of items synced (so far or total)""" + items_total: builtins.int + """Total items to sync (if known)""" + error_message: builtins.str + """Error message if status is "error" """ + duration_ms: builtins.int + """Duration in milliseconds (when completed)""" + expires_at: builtins.str + """When this sync run expires from cache (ISO 8601 timestamp) + (Sprint GAP-002: State Synchronization) + """ + not_found_reason: builtins.str + """Reason for NOT_FOUND: "expired" or "never_existed" + (Sprint GAP-002: State Synchronization) + """ + def __init__( + self, + *, + status: builtins.str = ..., + items_synced: builtins.int = ..., + items_total: builtins.int = ..., + error_message: builtins.str = ..., + duration_ms: builtins.int = ..., + expires_at: builtins.str | None = ..., + not_found_reason: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_expires_at", b"_expires_at", "_not_found_reason", b"_not_found_reason", "expires_at", b"expires_at", "not_found_reason", b"not_found_reason"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_expires_at", b"_expires_at", "_not_found_reason", b"_not_found_reason", "duration_ms", b"duration_ms", "error_message", b"error_message", "expires_at", b"expires_at", "items_synced", b"items_synced", "items_total", b"items_total", "not_found_reason", b"not_found_reason", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__expires_at: typing_extensions.TypeAlias = typing.Literal["expires_at"] + _WhichOneofArgType__expires_at: typing_extensions.TypeAlias = typing.Literal["_expires_at", b"_expires_at"] + _WhichOneofReturnType__not_found_reason: typing_extensions.TypeAlias = typing.Literal["not_found_reason"] + _WhichOneofArgType__not_found_reason: typing_extensions.TypeAlias = typing.Literal["_not_found_reason", b"_not_found_reason"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__expires_at) -> _WhichOneofReturnType__expires_at | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__not_found_reason) -> _WhichOneofReturnType__not_found_reason | None: ... + +Global___GetSyncStatusResponse: typing_extensions.TypeAlias = GetSyncStatusResponse + +@typing.final +class ListSyncHistoryRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + INTEGRATION_ID_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + integration_id: builtins.str + """Integration ID to list history for""" + limit: builtins.int + """Maximum runs to return (default: 20, max: 100)""" + offset: builtins.int + """Pagination offset""" + def __init__( + self, + *, + integration_id: builtins.str = ..., + limit: builtins.int = ..., + offset: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["integration_id", b"integration_id", "limit", b"limit", "offset", b"offset"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListSyncHistoryRequest: typing_extensions.TypeAlias = ListSyncHistoryRequest + +@typing.final +class ListSyncHistoryResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + RUNS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total count of sync runs""" + @property + def runs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___SyncRunProto]: + """Sync runs (newest first)""" + + def __init__( + self, + *, + runs: collections.abc.Iterable[Global___SyncRunProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["runs", b"runs", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListSyncHistoryResponse: typing_extensions.TypeAlias = ListSyncHistoryResponse + +@typing.final +class SyncRunProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + INTEGRATION_ID_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + ITEMS_SYNCED_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + DURATION_MS_FIELD_NUMBER: builtins.int + STARTED_AT_FIELD_NUMBER: builtins.int + COMPLETED_AT_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique sync run identifier""" + integration_id: builtins.str + """Integration ID""" + status: builtins.str + """Status: "running", "success", "error" """ + items_synced: builtins.int + """Number of items synced""" + error_message: builtins.str + """Error message if failed""" + duration_ms: builtins.int + """Duration in milliseconds""" + started_at: builtins.str + """Start timestamp (ISO 8601)""" + completed_at: builtins.str + """Completion timestamp (ISO 8601, empty if running)""" + def __init__( + self, + *, + id: builtins.str = ..., + integration_id: builtins.str = ..., + status: builtins.str = ..., + items_synced: builtins.int = ..., + error_message: builtins.str = ..., + duration_ms: builtins.int = ..., + started_at: builtins.str = ..., + completed_at: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["completed_at", b"completed_at", "duration_ms", b"duration_ms", "error_message", b"error_message", "id", b"id", "integration_id", b"integration_id", "items_synced", b"items_synced", "started_at", b"started_at", "status", b"status"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SyncRunProto: typing_extensions.TypeAlias = SyncRunProto + +@typing.final +class GetUserIntegrationsRequest(google.protobuf.message.Message): + """============================================================================= + Integration Cache Validation Messages (Sprint 18.1) + ============================================================================= + + Empty - uses identity context for user/workspace filtering + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetUserIntegrationsRequest: typing_extensions.TypeAlias = GetUserIntegrationsRequest + +@typing.final +class IntegrationInfo(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + TYPE_FIELD_NUMBER: builtins.int + STATUS_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique integration identifier""" + name: builtins.str + """Display name (e.g., "Google Calendar")""" + type: builtins.str + """Integration type: "calendar", "pkm", "custom" """ + status: builtins.str + """Connection status: "connected", "disconnected", "error", "pending" """ + workspace_id: builtins.str + """Workspace ID that owns this integration""" + def __init__( + self, + *, + id: builtins.str = ..., + name: builtins.str = ..., + type: builtins.str = ..., + status: builtins.str = ..., + workspace_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["id", b"id", "name", b"name", "status", b"status", "type", b"type", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___IntegrationInfo: typing_extensions.TypeAlias = IntegrationInfo + +@typing.final +class GetUserIntegrationsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + INTEGRATIONS_FIELD_NUMBER: builtins.int + @property + def integrations(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___IntegrationInfo]: + """List of integrations for the current user/workspace""" + + def __init__( + self, + *, + integrations: collections.abc.Iterable[Global___IntegrationInfo] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["integrations", b"integrations"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetUserIntegrationsResponse: typing_extensions.TypeAlias = GetUserIntegrationsResponse + +@typing.final +class GetRecentLogsRequest(google.protobuf.message.Message): + """============================================================================= + Observability Messages (Sprint 9) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LIMIT_FIELD_NUMBER: builtins.int + LEVEL_FIELD_NUMBER: builtins.int + SOURCE_FIELD_NUMBER: builtins.int + limit: builtins.int + """Maximum logs to return (default: 100, max: 1000)""" + level: builtins.str + """Filter by log level: debug, info, warning, error""" + source: builtins.str + """Filter by source: app, api, sync, auth, system""" + def __init__( + self, + *, + limit: builtins.int = ..., + level: builtins.str = ..., + source: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["level", b"level", "limit", b"limit", "source", b"source"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetRecentLogsRequest: typing_extensions.TypeAlias = GetRecentLogsRequest + +@typing.final +class GetRecentLogsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LOGS_FIELD_NUMBER: builtins.int + @property + def logs(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___LogEntryProto]: + """Recent log entries""" + + def __init__( + self, + *, + logs: collections.abc.Iterable[Global___LogEntryProto] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["logs", b"logs"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetRecentLogsResponse: typing_extensions.TypeAlias = GetRecentLogsResponse + +@typing.final +class LogEntryProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class DetailsEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + TIMESTAMP_FIELD_NUMBER: builtins.int + LEVEL_FIELD_NUMBER: builtins.int + SOURCE_FIELD_NUMBER: builtins.int + MESSAGE_FIELD_NUMBER: builtins.int + DETAILS_FIELD_NUMBER: builtins.int + TRACE_ID_FIELD_NUMBER: builtins.int + SPAN_ID_FIELD_NUMBER: builtins.int + EVENT_TYPE_FIELD_NUMBER: builtins.int + OPERATION_ID_FIELD_NUMBER: builtins.int + ENTITY_ID_FIELD_NUMBER: builtins.int + timestamp: builtins.str + """Timestamp (ISO 8601)""" + level: builtins.str + """Log level: debug, info, warning, error""" + source: builtins.str + """Source component: app, api, sync, auth, system""" + message: builtins.str + """Log message""" + trace_id: builtins.str + """Distributed tracing correlation ID""" + span_id: builtins.str + """Span ID within trace""" + event_type: builtins.str + """Semantic event type (e.g., "meeting.created", "summary.generated")""" + operation_id: builtins.str + """Groups related events (e.g., all events for one meeting session)""" + entity_id: builtins.str + """Primary entity ID (e.g., meeting_id for meeting events)""" + @property + def details(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """Additional details (key-value pairs)""" + + def __init__( + self, + *, + timestamp: builtins.str = ..., + level: builtins.str = ..., + source: builtins.str = ..., + message: builtins.str = ..., + details: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + trace_id: builtins.str = ..., + span_id: builtins.str = ..., + event_type: builtins.str = ..., + operation_id: builtins.str = ..., + entity_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["details", b"details", "entity_id", b"entity_id", "event_type", b"event_type", "level", b"level", "message", b"message", "operation_id", b"operation_id", "source", b"source", "span_id", b"span_id", "timestamp", b"timestamp", "trace_id", b"trace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___LogEntryProto: typing_extensions.TypeAlias = LogEntryProto + +@typing.final +class GetPerformanceMetricsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + HISTORY_LIMIT_FIELD_NUMBER: builtins.int + history_limit: builtins.int + """Number of historical data points (default: 60)""" + def __init__( + self, + *, + history_limit: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["history_limit", b"history_limit"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetPerformanceMetricsRequest: typing_extensions.TypeAlias = GetPerformanceMetricsRequest + +@typing.final +class GetPerformanceMetricsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + CURRENT_FIELD_NUMBER: builtins.int + HISTORY_FIELD_NUMBER: builtins.int + @property + def current(self) -> Global___PerformanceMetricsPoint: + """Current metrics""" + + @property + def history(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___PerformanceMetricsPoint]: + """Historical metrics (oldest to newest)""" + + def __init__( + self, + *, + current: Global___PerformanceMetricsPoint | None = ..., + history: collections.abc.Iterable[Global___PerformanceMetricsPoint] | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["current", b"current"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["current", b"current", "history", b"history"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetPerformanceMetricsResponse: typing_extensions.TypeAlias = GetPerformanceMetricsResponse + +@typing.final +class PerformanceMetricsPoint(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + TIMESTAMP_FIELD_NUMBER: builtins.int + CPU_PERCENT_FIELD_NUMBER: builtins.int + MEMORY_PERCENT_FIELD_NUMBER: builtins.int + MEMORY_MB_FIELD_NUMBER: builtins.int + DISK_PERCENT_FIELD_NUMBER: builtins.int + NETWORK_BYTES_SENT_FIELD_NUMBER: builtins.int + NETWORK_BYTES_RECV_FIELD_NUMBER: builtins.int + PROCESS_MEMORY_MB_FIELD_NUMBER: builtins.int + ACTIVE_CONNECTIONS_FIELD_NUMBER: builtins.int + timestamp: builtins.float + """Unix timestamp""" + cpu_percent: builtins.float + """CPU usage percentage (0-100)""" + memory_percent: builtins.float + """Memory usage percentage (0-100)""" + memory_mb: builtins.float + """Memory used in megabytes""" + disk_percent: builtins.float + """Disk usage percentage (0-100)""" + network_bytes_sent: builtins.int + """Network bytes sent since last measurement""" + network_bytes_recv: builtins.int + """Network bytes received since last measurement""" + process_memory_mb: builtins.float + """NoteFlow process memory in megabytes""" + active_connections: builtins.int + """Active network connections""" + def __init__( + self, + *, + timestamp: builtins.float = ..., + cpu_percent: builtins.float = ..., + memory_percent: builtins.float = ..., + memory_mb: builtins.float = ..., + disk_percent: builtins.float = ..., + network_bytes_sent: builtins.int = ..., + network_bytes_recv: builtins.int = ..., + process_memory_mb: builtins.float = ..., + active_connections: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["active_connections", b"active_connections", "cpu_percent", b"cpu_percent", "disk_percent", b"disk_percent", "memory_mb", b"memory_mb", "memory_percent", b"memory_percent", "network_bytes_recv", b"network_bytes_recv", "network_bytes_sent", b"network_bytes_sent", "process_memory_mb", b"process_memory_mb", "timestamp", b"timestamp"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___PerformanceMetricsPoint: typing_extensions.TypeAlias = PerformanceMetricsPoint + +@typing.final +class ClaimMappingProto(google.protobuf.message.Message): + """============================================================================= + OIDC Provider Management Messages (Sprint 17) + ============================================================================= + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUBJECT_CLAIM_FIELD_NUMBER: builtins.int + EMAIL_CLAIM_FIELD_NUMBER: builtins.int + EMAIL_VERIFIED_CLAIM_FIELD_NUMBER: builtins.int + NAME_CLAIM_FIELD_NUMBER: builtins.int + PREFERRED_USERNAME_CLAIM_FIELD_NUMBER: builtins.int + GROUPS_CLAIM_FIELD_NUMBER: builtins.int + PICTURE_CLAIM_FIELD_NUMBER: builtins.int + FIRST_NAME_CLAIM_FIELD_NUMBER: builtins.int + LAST_NAME_CLAIM_FIELD_NUMBER: builtins.int + PHONE_CLAIM_FIELD_NUMBER: builtins.int + subject_claim: builtins.str + """OIDC claim names mapped to user attributes""" + email_claim: builtins.str + email_verified_claim: builtins.str + name_claim: builtins.str + preferred_username_claim: builtins.str + groups_claim: builtins.str + picture_claim: builtins.str + first_name_claim: builtins.str + last_name_claim: builtins.str + phone_claim: builtins.str + def __init__( + self, + *, + subject_claim: builtins.str = ..., + email_claim: builtins.str = ..., + email_verified_claim: builtins.str = ..., + name_claim: builtins.str = ..., + preferred_username_claim: builtins.str = ..., + groups_claim: builtins.str = ..., + picture_claim: builtins.str = ..., + first_name_claim: builtins.str | None = ..., + last_name_claim: builtins.str | None = ..., + phone_claim: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_first_name_claim", b"_first_name_claim", "_last_name_claim", b"_last_name_claim", "_phone_claim", b"_phone_claim", "first_name_claim", b"first_name_claim", "last_name_claim", b"last_name_claim", "phone_claim", b"phone_claim"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_first_name_claim", b"_first_name_claim", "_last_name_claim", b"_last_name_claim", "_phone_claim", b"_phone_claim", "email_claim", b"email_claim", "email_verified_claim", b"email_verified_claim", "first_name_claim", b"first_name_claim", "groups_claim", b"groups_claim", "last_name_claim", b"last_name_claim", "name_claim", b"name_claim", "phone_claim", b"phone_claim", "picture_claim", b"picture_claim", "preferred_username_claim", b"preferred_username_claim", "subject_claim", b"subject_claim"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__first_name_claim: typing_extensions.TypeAlias = typing.Literal["first_name_claim"] + _WhichOneofArgType__first_name_claim: typing_extensions.TypeAlias = typing.Literal["_first_name_claim", b"_first_name_claim"] + _WhichOneofReturnType__last_name_claim: typing_extensions.TypeAlias = typing.Literal["last_name_claim"] + _WhichOneofArgType__last_name_claim: typing_extensions.TypeAlias = typing.Literal["_last_name_claim", b"_last_name_claim"] + _WhichOneofReturnType__phone_claim: typing_extensions.TypeAlias = typing.Literal["phone_claim"] + _WhichOneofArgType__phone_claim: typing_extensions.TypeAlias = typing.Literal["_phone_claim", b"_phone_claim"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__first_name_claim) -> _WhichOneofReturnType__first_name_claim | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__last_name_claim) -> _WhichOneofReturnType__last_name_claim | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__phone_claim) -> _WhichOneofReturnType__phone_claim | None: ... + +Global___ClaimMappingProto: typing_extensions.TypeAlias = ClaimMappingProto + +@typing.final +class OidcDiscoveryProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ISSUER_FIELD_NUMBER: builtins.int + AUTHORIZATION_ENDPOINT_FIELD_NUMBER: builtins.int + TOKEN_ENDPOINT_FIELD_NUMBER: builtins.int + USERINFO_ENDPOINT_FIELD_NUMBER: builtins.int + JWKS_URI_FIELD_NUMBER: builtins.int + END_SESSION_ENDPOINT_FIELD_NUMBER: builtins.int + REVOCATION_ENDPOINT_FIELD_NUMBER: builtins.int + SCOPES_SUPPORTED_FIELD_NUMBER: builtins.int + CLAIMS_SUPPORTED_FIELD_NUMBER: builtins.int + SUPPORTS_PKCE_FIELD_NUMBER: builtins.int + issuer: builtins.str + """Discovery endpoint information""" + authorization_endpoint: builtins.str + token_endpoint: builtins.str + userinfo_endpoint: builtins.str + jwks_uri: builtins.str + end_session_endpoint: builtins.str + revocation_endpoint: builtins.str + supports_pkce: builtins.bool + @property + def scopes_supported(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ... + @property + def claims_supported(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ... + def __init__( + self, + *, + issuer: builtins.str = ..., + authorization_endpoint: builtins.str = ..., + token_endpoint: builtins.str = ..., + userinfo_endpoint: builtins.str | None = ..., + jwks_uri: builtins.str | None = ..., + end_session_endpoint: builtins.str | None = ..., + revocation_endpoint: builtins.str | None = ..., + scopes_supported: collections.abc.Iterable[builtins.str] | None = ..., + claims_supported: collections.abc.Iterable[builtins.str] | None = ..., + supports_pkce: builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_end_session_endpoint", b"_end_session_endpoint", "_jwks_uri", b"_jwks_uri", "_revocation_endpoint", b"_revocation_endpoint", "_userinfo_endpoint", b"_userinfo_endpoint", "end_session_endpoint", b"end_session_endpoint", "jwks_uri", b"jwks_uri", "revocation_endpoint", b"revocation_endpoint", "userinfo_endpoint", b"userinfo_endpoint"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_end_session_endpoint", b"_end_session_endpoint", "_jwks_uri", b"_jwks_uri", "_revocation_endpoint", b"_revocation_endpoint", "_userinfo_endpoint", b"_userinfo_endpoint", "authorization_endpoint", b"authorization_endpoint", "claims_supported", b"claims_supported", "end_session_endpoint", b"end_session_endpoint", "issuer", b"issuer", "jwks_uri", b"jwks_uri", "revocation_endpoint", b"revocation_endpoint", "scopes_supported", b"scopes_supported", "supports_pkce", b"supports_pkce", "token_endpoint", b"token_endpoint", "userinfo_endpoint", b"userinfo_endpoint"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__end_session_endpoint: typing_extensions.TypeAlias = typing.Literal["end_session_endpoint"] + _WhichOneofArgType__end_session_endpoint: typing_extensions.TypeAlias = typing.Literal["_end_session_endpoint", b"_end_session_endpoint"] + _WhichOneofReturnType__jwks_uri: typing_extensions.TypeAlias = typing.Literal["jwks_uri"] + _WhichOneofArgType__jwks_uri: typing_extensions.TypeAlias = typing.Literal["_jwks_uri", b"_jwks_uri"] + _WhichOneofReturnType__revocation_endpoint: typing_extensions.TypeAlias = typing.Literal["revocation_endpoint"] + _WhichOneofArgType__revocation_endpoint: typing_extensions.TypeAlias = typing.Literal["_revocation_endpoint", b"_revocation_endpoint"] + _WhichOneofReturnType__userinfo_endpoint: typing_extensions.TypeAlias = typing.Literal["userinfo_endpoint"] + _WhichOneofArgType__userinfo_endpoint: typing_extensions.TypeAlias = typing.Literal["_userinfo_endpoint", b"_userinfo_endpoint"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__end_session_endpoint) -> _WhichOneofReturnType__end_session_endpoint | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__jwks_uri) -> _WhichOneofReturnType__jwks_uri | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__revocation_endpoint) -> _WhichOneofReturnType__revocation_endpoint | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__userinfo_endpoint) -> _WhichOneofReturnType__userinfo_endpoint | None: ... + +Global___OidcDiscoveryProto: typing_extensions.TypeAlias = OidcDiscoveryProto + +@typing.final +class OidcProviderProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + PRESET_FIELD_NUMBER: builtins.int + ISSUER_URL_FIELD_NUMBER: builtins.int + CLIENT_ID_FIELD_NUMBER: builtins.int + ENABLED_FIELD_NUMBER: builtins.int + DISCOVERY_FIELD_NUMBER: builtins.int + CLAIM_MAPPING_FIELD_NUMBER: builtins.int + SCOPES_FIELD_NUMBER: builtins.int + REQUIRE_EMAIL_VERIFIED_FIELD_NUMBER: builtins.int + ALLOWED_GROUPS_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + UPDATED_AT_FIELD_NUMBER: builtins.int + DISCOVERY_REFRESHED_AT_FIELD_NUMBER: builtins.int + WARNINGS_FIELD_NUMBER: builtins.int + id: builtins.str + """Provider configuration""" + workspace_id: builtins.str + name: builtins.str + preset: builtins.str + issuer_url: builtins.str + client_id: builtins.str + enabled: builtins.bool + require_email_verified: builtins.bool + """Access control""" + created_at: builtins.int + """Timestamps""" + updated_at: builtins.int + discovery_refreshed_at: builtins.int + @property + def discovery(self) -> Global___OidcDiscoveryProto: + """Discovery configuration (populated from .well-known)""" + + @property + def claim_mapping(self) -> Global___ClaimMappingProto: + """Claim mapping configuration""" + + @property + def scopes(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """OAuth scopes to request""" + + @property + def allowed_groups(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: ... + @property + def warnings(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Validation warnings (only in responses)""" + + def __init__( + self, + *, + id: builtins.str = ..., + workspace_id: builtins.str = ..., + name: builtins.str = ..., + preset: builtins.str = ..., + issuer_url: builtins.str = ..., + client_id: builtins.str = ..., + enabled: builtins.bool = ..., + discovery: Global___OidcDiscoveryProto | None = ..., + claim_mapping: Global___ClaimMappingProto | None = ..., + scopes: collections.abc.Iterable[builtins.str] | None = ..., + require_email_verified: builtins.bool = ..., + allowed_groups: collections.abc.Iterable[builtins.str] | None = ..., + created_at: builtins.int = ..., + updated_at: builtins.int = ..., + discovery_refreshed_at: builtins.int | None = ..., + warnings: collections.abc.Iterable[builtins.str] | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_discovery", b"_discovery", "_discovery_refreshed_at", b"_discovery_refreshed_at", "claim_mapping", b"claim_mapping", "discovery", b"discovery", "discovery_refreshed_at", b"discovery_refreshed_at"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_discovery", b"_discovery", "_discovery_refreshed_at", b"_discovery_refreshed_at", "allowed_groups", b"allowed_groups", "claim_mapping", b"claim_mapping", "client_id", b"client_id", "created_at", b"created_at", "discovery", b"discovery", "discovery_refreshed_at", b"discovery_refreshed_at", "enabled", b"enabled", "id", b"id", "issuer_url", b"issuer_url", "name", b"name", "preset", b"preset", "require_email_verified", b"require_email_verified", "scopes", b"scopes", "updated_at", b"updated_at", "warnings", b"warnings", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__discovery: typing_extensions.TypeAlias = typing.Literal["discovery"] + _WhichOneofArgType__discovery: typing_extensions.TypeAlias = typing.Literal["_discovery", b"_discovery"] + _WhichOneofReturnType__discovery_refreshed_at: typing_extensions.TypeAlias = typing.Literal["discovery_refreshed_at"] + _WhichOneofArgType__discovery_refreshed_at: typing_extensions.TypeAlias = typing.Literal["_discovery_refreshed_at", b"_discovery_refreshed_at"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__discovery) -> _WhichOneofReturnType__discovery | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__discovery_refreshed_at) -> _WhichOneofReturnType__discovery_refreshed_at | None: ... + +Global___OidcProviderProto: typing_extensions.TypeAlias = OidcProviderProto + +@typing.final +class RegisterOidcProviderRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + ISSUER_URL_FIELD_NUMBER: builtins.int + CLIENT_ID_FIELD_NUMBER: builtins.int + CLIENT_SECRET_FIELD_NUMBER: builtins.int + PRESET_FIELD_NUMBER: builtins.int + SCOPES_FIELD_NUMBER: builtins.int + CLAIM_MAPPING_FIELD_NUMBER: builtins.int + ALLOWED_GROUPS_FIELD_NUMBER: builtins.int + REQUIRE_EMAIL_VERIFIED_FIELD_NUMBER: builtins.int + AUTO_DISCOVER_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace to register provider in""" + name: builtins.str + """Display name for the provider""" + issuer_url: builtins.str + """OIDC issuer URL (base URL for discovery)""" + client_id: builtins.str + """OAuth client ID""" + client_secret: builtins.str + """Optional client secret (for confidential clients)""" + preset: builtins.str + """Provider preset: authentik, authelia, keycloak, auth0, okta, azure_ad, custom""" + require_email_verified: builtins.bool + """Whether to require verified email (default: true)""" + auto_discover: builtins.bool + """Whether to auto-discover endpoints (default: true)""" + @property + def scopes(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Optional custom scopes (defaults to preset)""" + + @property + def claim_mapping(self) -> Global___ClaimMappingProto: + """Optional custom claim mapping (defaults to preset)""" + + @property + def allowed_groups(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Optional group-based access control""" + + def __init__( + self, + *, + workspace_id: builtins.str = ..., + name: builtins.str = ..., + issuer_url: builtins.str = ..., + client_id: builtins.str = ..., + client_secret: builtins.str | None = ..., + preset: builtins.str = ..., + scopes: collections.abc.Iterable[builtins.str] | None = ..., + claim_mapping: Global___ClaimMappingProto | None = ..., + allowed_groups: collections.abc.Iterable[builtins.str] | None = ..., + require_email_verified: builtins.bool | None = ..., + auto_discover: builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_claim_mapping", b"_claim_mapping", "_client_secret", b"_client_secret", "_require_email_verified", b"_require_email_verified", "claim_mapping", b"claim_mapping", "client_secret", b"client_secret", "require_email_verified", b"require_email_verified"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_claim_mapping", b"_claim_mapping", "_client_secret", b"_client_secret", "_require_email_verified", b"_require_email_verified", "allowed_groups", b"allowed_groups", "auto_discover", b"auto_discover", "claim_mapping", b"claim_mapping", "client_id", b"client_id", "client_secret", b"client_secret", "issuer_url", b"issuer_url", "name", b"name", "preset", b"preset", "require_email_verified", b"require_email_verified", "scopes", b"scopes", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__claim_mapping: typing_extensions.TypeAlias = typing.Literal["claim_mapping"] + _WhichOneofArgType__claim_mapping: typing_extensions.TypeAlias = typing.Literal["_claim_mapping", b"_claim_mapping"] + _WhichOneofReturnType__client_secret: typing_extensions.TypeAlias = typing.Literal["client_secret"] + _WhichOneofArgType__client_secret: typing_extensions.TypeAlias = typing.Literal["_client_secret", b"_client_secret"] + _WhichOneofReturnType__require_email_verified: typing_extensions.TypeAlias = typing.Literal["require_email_verified"] + _WhichOneofArgType__require_email_verified: typing_extensions.TypeAlias = typing.Literal["_require_email_verified", b"_require_email_verified"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__claim_mapping) -> _WhichOneofReturnType__claim_mapping | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__client_secret) -> _WhichOneofReturnType__client_secret | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__require_email_verified) -> _WhichOneofReturnType__require_email_verified | None: ... + +Global___RegisterOidcProviderRequest: typing_extensions.TypeAlias = RegisterOidcProviderRequest + +@typing.final +class ListOidcProvidersRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + ENABLED_ONLY_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Optional workspace filter""" + enabled_only: builtins.bool + """Filter to only enabled providers""" + def __init__( + self, + *, + workspace_id: builtins.str | None = ..., + enabled_only: builtins.bool = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_workspace_id", b"_workspace_id", "workspace_id", b"workspace_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_workspace_id", b"_workspace_id", "enabled_only", b"enabled_only", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__workspace_id: typing_extensions.TypeAlias = typing.Literal["workspace_id"] + _WhichOneofArgType__workspace_id: typing_extensions.TypeAlias = typing.Literal["_workspace_id", b"_workspace_id"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__workspace_id) -> _WhichOneofReturnType__workspace_id | None: ... + +Global___ListOidcProvidersRequest: typing_extensions.TypeAlias = ListOidcProvidersRequest + +@typing.final +class ListOidcProvidersResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDERS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total count""" + @property + def providers(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___OidcProviderProto]: + """Registered OIDC providers""" + + def __init__( + self, + *, + providers: collections.abc.Iterable[Global___OidcProviderProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["providers", b"providers", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListOidcProvidersResponse: typing_extensions.TypeAlias = ListOidcProvidersResponse + +@typing.final +class GetOidcProviderRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_ID_FIELD_NUMBER: builtins.int + provider_id: builtins.str + """Provider ID to retrieve""" + def __init__( + self, + *, + provider_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["provider_id", b"provider_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetOidcProviderRequest: typing_extensions.TypeAlias = GetOidcProviderRequest + +@typing.final +class UpdateOidcProviderRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SCOPES_FIELD_NUMBER: builtins.int + CLAIM_MAPPING_FIELD_NUMBER: builtins.int + ALLOWED_GROUPS_FIELD_NUMBER: builtins.int + REQUIRE_EMAIL_VERIFIED_FIELD_NUMBER: builtins.int + ENABLED_FIELD_NUMBER: builtins.int + provider_id: builtins.str + """Provider ID to update""" + name: builtins.str + """Updated name (optional)""" + require_email_verified: builtins.bool + """Updated require_email_verified (optional)""" + enabled: builtins.bool + """Updated enabled status (optional)""" + @property + def scopes(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Updated scopes (replaces existing)""" + + @property + def claim_mapping(self) -> Global___ClaimMappingProto: + """Updated claim mapping (optional)""" + + @property + def allowed_groups(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Updated allowed groups (replaces existing)""" + + def __init__( + self, + *, + provider_id: builtins.str = ..., + name: builtins.str | None = ..., + scopes: collections.abc.Iterable[builtins.str] | None = ..., + claim_mapping: Global___ClaimMappingProto | None = ..., + allowed_groups: collections.abc.Iterable[builtins.str] | None = ..., + require_email_verified: builtins.bool | None = ..., + enabled: builtins.bool | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_claim_mapping", b"_claim_mapping", "_enabled", b"_enabled", "_name", b"_name", "_require_email_verified", b"_require_email_verified", "claim_mapping", b"claim_mapping", "enabled", b"enabled", "name", b"name", "require_email_verified", b"require_email_verified"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_claim_mapping", b"_claim_mapping", "_enabled", b"_enabled", "_name", b"_name", "_require_email_verified", b"_require_email_verified", "allowed_groups", b"allowed_groups", "claim_mapping", b"claim_mapping", "enabled", b"enabled", "name", b"name", "provider_id", b"provider_id", "require_email_verified", b"require_email_verified", "scopes", b"scopes"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__claim_mapping: typing_extensions.TypeAlias = typing.Literal["claim_mapping"] + _WhichOneofArgType__claim_mapping: typing_extensions.TypeAlias = typing.Literal["_claim_mapping", b"_claim_mapping"] + _WhichOneofReturnType__enabled: typing_extensions.TypeAlias = typing.Literal["enabled"] + _WhichOneofArgType__enabled: typing_extensions.TypeAlias = typing.Literal["_enabled", b"_enabled"] + _WhichOneofReturnType__name: typing_extensions.TypeAlias = typing.Literal["name"] + _WhichOneofArgType__name: typing_extensions.TypeAlias = typing.Literal["_name", b"_name"] + _WhichOneofReturnType__require_email_verified: typing_extensions.TypeAlias = typing.Literal["require_email_verified"] + _WhichOneofArgType__require_email_verified: typing_extensions.TypeAlias = typing.Literal["_require_email_verified", b"_require_email_verified"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__claim_mapping) -> _WhichOneofReturnType__claim_mapping | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__enabled) -> _WhichOneofReturnType__enabled | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__name) -> _WhichOneofReturnType__name | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__require_email_verified) -> _WhichOneofReturnType__require_email_verified | None: ... + +Global___UpdateOidcProviderRequest: typing_extensions.TypeAlias = UpdateOidcProviderRequest + +@typing.final +class DeleteOidcProviderRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_ID_FIELD_NUMBER: builtins.int + provider_id: builtins.str + """Provider ID to delete""" + def __init__( + self, + *, + provider_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["provider_id", b"provider_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteOidcProviderRequest: typing_extensions.TypeAlias = DeleteOidcProviderRequest + +@typing.final +class DeleteOidcProviderResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether deletion succeeded""" + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteOidcProviderResponse: typing_extensions.TypeAlias = DeleteOidcProviderResponse + +@typing.final +class RefreshOidcDiscoveryRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROVIDER_ID_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + provider_id: builtins.str + """Optional provider ID (if not set, refreshes all)""" + workspace_id: builtins.str + """Optional workspace filter (for refresh all)""" + def __init__( + self, + *, + provider_id: builtins.str | None = ..., + workspace_id: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_provider_id", b"_provider_id", "_workspace_id", b"_workspace_id", "provider_id", b"provider_id", "workspace_id", b"workspace_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_provider_id", b"_provider_id", "_workspace_id", b"_workspace_id", "provider_id", b"provider_id", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__provider_id: typing_extensions.TypeAlias = typing.Literal["provider_id"] + _WhichOneofArgType__provider_id: typing_extensions.TypeAlias = typing.Literal["_provider_id", b"_provider_id"] + _WhichOneofReturnType__workspace_id: typing_extensions.TypeAlias = typing.Literal["workspace_id"] + _WhichOneofArgType__workspace_id: typing_extensions.TypeAlias = typing.Literal["_workspace_id", b"_workspace_id"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__provider_id) -> _WhichOneofReturnType__provider_id | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__workspace_id) -> _WhichOneofReturnType__workspace_id | None: ... + +Global___RefreshOidcDiscoveryRequest: typing_extensions.TypeAlias = RefreshOidcDiscoveryRequest + +@typing.final +class RefreshOidcDiscoveryResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + @typing.final + class ResultsEntry(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + KEY_FIELD_NUMBER: builtins.int + VALUE_FIELD_NUMBER: builtins.int + key: builtins.str + value: builtins.str + def __init__( + self, + *, + key: builtins.str = ..., + value: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["key", b"key", "value", b"value"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + + RESULTS_FIELD_NUMBER: builtins.int + SUCCESS_COUNT_FIELD_NUMBER: builtins.int + FAILURE_COUNT_FIELD_NUMBER: builtins.int + success_count: builtins.int + """Count of successful refreshes""" + failure_count: builtins.int + """Count of failed refreshes""" + @property + def results(self) -> google.protobuf.internal.containers.ScalarMap[builtins.str, builtins.str]: + """Results per provider: provider_id -> error message (empty if success)""" + + def __init__( + self, + *, + results: collections.abc.Mapping[builtins.str, builtins.str] | None = ..., + success_count: builtins.int = ..., + failure_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["failure_count", b"failure_count", "results", b"results", "success_count", b"success_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RefreshOidcDiscoveryResponse: typing_extensions.TypeAlias = RefreshOidcDiscoveryResponse + +@typing.final +class ListOidcPresetsRequest(google.protobuf.message.Message): + """No parameters needed""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___ListOidcPresetsRequest: typing_extensions.TypeAlias = ListOidcPresetsRequest + +@typing.final +class OidcPresetProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PRESET_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + DEFAULT_SCOPES_FIELD_NUMBER: builtins.int + DOCUMENTATION_URL_FIELD_NUMBER: builtins.int + NOTES_FIELD_NUMBER: builtins.int + preset: builtins.str + """Preset identifier""" + display_name: builtins.str + """Display name""" + description: builtins.str + """Description""" + documentation_url: builtins.str + """Documentation URL""" + notes: builtins.str + """Configuration notes""" + @property + def default_scopes(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Default scopes""" + + def __init__( + self, + *, + preset: builtins.str = ..., + display_name: builtins.str = ..., + description: builtins.str = ..., + default_scopes: collections.abc.Iterable[builtins.str] | None = ..., + documentation_url: builtins.str | None = ..., + notes: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_documentation_url", b"_documentation_url", "_notes", b"_notes", "documentation_url", b"documentation_url", "notes", b"notes"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_documentation_url", b"_documentation_url", "_notes", b"_notes", "default_scopes", b"default_scopes", "description", b"description", "display_name", b"display_name", "documentation_url", b"documentation_url", "notes", b"notes", "preset", b"preset"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__documentation_url: typing_extensions.TypeAlias = typing.Literal["documentation_url"] + _WhichOneofArgType__documentation_url: typing_extensions.TypeAlias = typing.Literal["_documentation_url", b"_documentation_url"] + _WhichOneofReturnType__notes: typing_extensions.TypeAlias = typing.Literal["notes"] + _WhichOneofArgType__notes: typing_extensions.TypeAlias = typing.Literal["_notes", b"_notes"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__documentation_url) -> _WhichOneofReturnType__documentation_url | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__notes) -> _WhichOneofReturnType__notes | None: ... + +Global___OidcPresetProto: typing_extensions.TypeAlias = OidcPresetProto + +@typing.final +class ListOidcPresetsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PRESETS_FIELD_NUMBER: builtins.int + @property + def presets(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___OidcPresetProto]: + """Available presets""" + + def __init__( + self, + *, + presets: collections.abc.Iterable[Global___OidcPresetProto] | None = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["presets", b"presets"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListOidcPresetsResponse: typing_extensions.TypeAlias = ListOidcPresetsResponse + +@typing.final +class ExportRulesProto(google.protobuf.message.Message): + """Export configuration for a project""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + DEFAULT_FORMAT_FIELD_NUMBER: builtins.int + INCLUDE_AUDIO_FIELD_NUMBER: builtins.int + INCLUDE_TIMESTAMPS_FIELD_NUMBER: builtins.int + TEMPLATE_ID_FIELD_NUMBER: builtins.int + default_format: Global___ExportFormat.ValueType + """Default export format (markdown, html, pdf)""" + include_audio: builtins.bool + """Whether to include audio file in exports""" + include_timestamps: builtins.bool + """Whether to include timestamps in transcript""" + template_id: builtins.str + """ID of export template to use""" + def __init__( + self, + *, + default_format: Global___ExportFormat.ValueType | None = ..., + include_audio: builtins.bool | None = ..., + include_timestamps: builtins.bool | None = ..., + template_id: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_default_format", b"_default_format", "_include_audio", b"_include_audio", "_include_timestamps", b"_include_timestamps", "_template_id", b"_template_id", "default_format", b"default_format", "include_audio", b"include_audio", "include_timestamps", b"include_timestamps", "template_id", b"template_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_default_format", b"_default_format", "_include_audio", b"_include_audio", "_include_timestamps", b"_include_timestamps", "_template_id", b"_template_id", "default_format", b"default_format", "include_audio", b"include_audio", "include_timestamps", b"include_timestamps", "template_id", b"template_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__default_format: typing_extensions.TypeAlias = typing.Literal["default_format"] + _WhichOneofArgType__default_format: typing_extensions.TypeAlias = typing.Literal["_default_format", b"_default_format"] + _WhichOneofReturnType__include_audio: typing_extensions.TypeAlias = typing.Literal["include_audio"] + _WhichOneofArgType__include_audio: typing_extensions.TypeAlias = typing.Literal["_include_audio", b"_include_audio"] + _WhichOneofReturnType__include_timestamps: typing_extensions.TypeAlias = typing.Literal["include_timestamps"] + _WhichOneofArgType__include_timestamps: typing_extensions.TypeAlias = typing.Literal["_include_timestamps", b"_include_timestamps"] + _WhichOneofReturnType__template_id: typing_extensions.TypeAlias = typing.Literal["template_id"] + _WhichOneofArgType__template_id: typing_extensions.TypeAlias = typing.Literal["_template_id", b"_template_id"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__default_format) -> _WhichOneofReturnType__default_format | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__include_audio) -> _WhichOneofReturnType__include_audio | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__include_timestamps) -> _WhichOneofReturnType__include_timestamps | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__template_id) -> _WhichOneofReturnType__template_id | None: ... + +Global___ExportRulesProto: typing_extensions.TypeAlias = ExportRulesProto + +@typing.final +class TriggerRulesProto(google.protobuf.message.Message): + """Trigger configuration for a project""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + AUTO_START_ENABLED_FIELD_NUMBER: builtins.int + CALENDAR_MATCH_PATTERNS_FIELD_NUMBER: builtins.int + APP_MATCH_PATTERNS_FIELD_NUMBER: builtins.int + auto_start_enabled: builtins.bool + """Whether auto-start recording is enabled""" + @property + def calendar_match_patterns(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Glob patterns for calendar event titles""" + + @property + def app_match_patterns(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]: + """Glob patterns for application names""" + + def __init__( + self, + *, + auto_start_enabled: builtins.bool | None = ..., + calendar_match_patterns: collections.abc.Iterable[builtins.str] | None = ..., + app_match_patterns: collections.abc.Iterable[builtins.str] | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_auto_start_enabled", b"_auto_start_enabled", "auto_start_enabled", b"auto_start_enabled"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_auto_start_enabled", b"_auto_start_enabled", "app_match_patterns", b"app_match_patterns", "auto_start_enabled", b"auto_start_enabled", "calendar_match_patterns", b"calendar_match_patterns"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__auto_start_enabled: typing_extensions.TypeAlias = typing.Literal["auto_start_enabled"] + _WhichOneofArgType__auto_start_enabled: typing_extensions.TypeAlias = typing.Literal["_auto_start_enabled", b"_auto_start_enabled"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__auto_start_enabled) -> _WhichOneofReturnType__auto_start_enabled | None: ... + +Global___TriggerRulesProto: typing_extensions.TypeAlias = TriggerRulesProto + +@typing.final +class WorkspaceSettingsProto(google.protobuf.message.Message): + """Workspace settings (inheritable defaults)""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + EXPORT_RULES_FIELD_NUMBER: builtins.int + TRIGGER_RULES_FIELD_NUMBER: builtins.int + RAG_ENABLED_FIELD_NUMBER: builtins.int + DEFAULT_SUMMARIZATION_TEMPLATE_FIELD_NUMBER: builtins.int + rag_enabled: builtins.bool + """Whether RAG Q&A is enabled for this workspace""" + default_summarization_template: builtins.str + """Default summarization template ID""" + @property + def export_rules(self) -> Global___ExportRulesProto: + """Export configuration""" + + @property + def trigger_rules(self) -> Global___TriggerRulesProto: + """Trigger configuration""" + + def __init__( + self, + *, + export_rules: Global___ExportRulesProto | None = ..., + trigger_rules: Global___TriggerRulesProto | None = ..., + rag_enabled: builtins.bool | None = ..., + default_summarization_template: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_default_summarization_template", b"_default_summarization_template", "_export_rules", b"_export_rules", "_rag_enabled", b"_rag_enabled", "_trigger_rules", b"_trigger_rules", "default_summarization_template", b"default_summarization_template", "export_rules", b"export_rules", "rag_enabled", b"rag_enabled", "trigger_rules", b"trigger_rules"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_default_summarization_template", b"_default_summarization_template", "_export_rules", b"_export_rules", "_rag_enabled", b"_rag_enabled", "_trigger_rules", b"_trigger_rules", "default_summarization_template", b"default_summarization_template", "export_rules", b"export_rules", "rag_enabled", b"rag_enabled", "trigger_rules", b"trigger_rules"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__default_summarization_template: typing_extensions.TypeAlias = typing.Literal["default_summarization_template"] + _WhichOneofArgType__default_summarization_template: typing_extensions.TypeAlias = typing.Literal["_default_summarization_template", b"_default_summarization_template"] + _WhichOneofReturnType__export_rules: typing_extensions.TypeAlias = typing.Literal["export_rules"] + _WhichOneofArgType__export_rules: typing_extensions.TypeAlias = typing.Literal["_export_rules", b"_export_rules"] + _WhichOneofReturnType__rag_enabled: typing_extensions.TypeAlias = typing.Literal["rag_enabled"] + _WhichOneofArgType__rag_enabled: typing_extensions.TypeAlias = typing.Literal["_rag_enabled", b"_rag_enabled"] + _WhichOneofReturnType__trigger_rules: typing_extensions.TypeAlias = typing.Literal["trigger_rules"] + _WhichOneofArgType__trigger_rules: typing_extensions.TypeAlias = typing.Literal["_trigger_rules", b"_trigger_rules"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__default_summarization_template) -> _WhichOneofReturnType__default_summarization_template | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__export_rules) -> _WhichOneofReturnType__export_rules | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__rag_enabled) -> _WhichOneofReturnType__rag_enabled | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__trigger_rules) -> _WhichOneofReturnType__trigger_rules | None: ... + +Global___WorkspaceSettingsProto: typing_extensions.TypeAlias = WorkspaceSettingsProto + +@typing.final +class ProjectSettingsProto(google.protobuf.message.Message): + """Project settings (inheritable from workspace)""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + EXPORT_RULES_FIELD_NUMBER: builtins.int + TRIGGER_RULES_FIELD_NUMBER: builtins.int + RAG_ENABLED_FIELD_NUMBER: builtins.int + DEFAULT_SUMMARIZATION_TEMPLATE_FIELD_NUMBER: builtins.int + rag_enabled: builtins.bool + """Whether RAG Q&A is enabled for this project""" + default_summarization_template: builtins.str + """Default summarization template ID""" + @property + def export_rules(self) -> Global___ExportRulesProto: + """Export configuration""" + + @property + def trigger_rules(self) -> Global___TriggerRulesProto: + """Trigger configuration""" + + def __init__( + self, + *, + export_rules: Global___ExportRulesProto | None = ..., + trigger_rules: Global___TriggerRulesProto | None = ..., + rag_enabled: builtins.bool | None = ..., + default_summarization_template: builtins.str | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_default_summarization_template", b"_default_summarization_template", "_export_rules", b"_export_rules", "_rag_enabled", b"_rag_enabled", "_trigger_rules", b"_trigger_rules", "default_summarization_template", b"default_summarization_template", "export_rules", b"export_rules", "rag_enabled", b"rag_enabled", "trigger_rules", b"trigger_rules"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_default_summarization_template", b"_default_summarization_template", "_export_rules", b"_export_rules", "_rag_enabled", b"_rag_enabled", "_trigger_rules", b"_trigger_rules", "default_summarization_template", b"default_summarization_template", "export_rules", b"export_rules", "rag_enabled", b"rag_enabled", "trigger_rules", b"trigger_rules"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__default_summarization_template: typing_extensions.TypeAlias = typing.Literal["default_summarization_template"] + _WhichOneofArgType__default_summarization_template: typing_extensions.TypeAlias = typing.Literal["_default_summarization_template", b"_default_summarization_template"] + _WhichOneofReturnType__export_rules: typing_extensions.TypeAlias = typing.Literal["export_rules"] + _WhichOneofArgType__export_rules: typing_extensions.TypeAlias = typing.Literal["_export_rules", b"_export_rules"] + _WhichOneofReturnType__rag_enabled: typing_extensions.TypeAlias = typing.Literal["rag_enabled"] + _WhichOneofArgType__rag_enabled: typing_extensions.TypeAlias = typing.Literal["_rag_enabled", b"_rag_enabled"] + _WhichOneofReturnType__trigger_rules: typing_extensions.TypeAlias = typing.Literal["trigger_rules"] + _WhichOneofArgType__trigger_rules: typing_extensions.TypeAlias = typing.Literal["_trigger_rules", b"_trigger_rules"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__default_summarization_template) -> _WhichOneofReturnType__default_summarization_template | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__export_rules) -> _WhichOneofReturnType__export_rules | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__rag_enabled) -> _WhichOneofReturnType__rag_enabled | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__trigger_rules) -> _WhichOneofReturnType__trigger_rules | None: ... + +Global___ProjectSettingsProto: typing_extensions.TypeAlias = ProjectSettingsProto + +@typing.final +class ProjectProto(google.protobuf.message.Message): + """Full project entity""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SLUG_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + IS_DEFAULT_FIELD_NUMBER: builtins.int + IS_ARCHIVED_FIELD_NUMBER: builtins.int + SETTINGS_FIELD_NUMBER: builtins.int + CREATED_AT_FIELD_NUMBER: builtins.int + UPDATED_AT_FIELD_NUMBER: builtins.int + ARCHIVED_AT_FIELD_NUMBER: builtins.int + id: builtins.str + """Unique project identifier""" + workspace_id: builtins.str + """Parent workspace identifier""" + name: builtins.str + """User-provided project name""" + slug: builtins.str + """URL-friendly identifier (unique per workspace)""" + description: builtins.str + """Optional project description""" + is_default: builtins.bool + """Whether this is the workspace's default project""" + is_archived: builtins.bool + """Whether the project is archived""" + created_at: builtins.int + """Creation timestamp (Unix epoch seconds)""" + updated_at: builtins.int + """Last modification timestamp (Unix epoch seconds)""" + archived_at: builtins.int + """Archive timestamp (Unix epoch seconds, 0 if not archived)""" + @property + def settings(self) -> Global___ProjectSettingsProto: + """Project-level settings""" + + def __init__( + self, + *, + id: builtins.str = ..., + workspace_id: builtins.str = ..., + name: builtins.str = ..., + slug: builtins.str | None = ..., + description: builtins.str | None = ..., + is_default: builtins.bool = ..., + is_archived: builtins.bool = ..., + settings: Global___ProjectSettingsProto | None = ..., + created_at: builtins.int = ..., + updated_at: builtins.int = ..., + archived_at: builtins.int | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_archived_at", b"_archived_at", "_description", b"_description", "_settings", b"_settings", "_slug", b"_slug", "archived_at", b"archived_at", "description", b"description", "settings", b"settings", "slug", b"slug"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_archived_at", b"_archived_at", "_description", b"_description", "_settings", b"_settings", "_slug", b"_slug", "archived_at", b"archived_at", "created_at", b"created_at", "description", b"description", "id", b"id", "is_archived", b"is_archived", "is_default", b"is_default", "name", b"name", "settings", b"settings", "slug", b"slug", "updated_at", b"updated_at", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__archived_at: typing_extensions.TypeAlias = typing.Literal["archived_at"] + _WhichOneofArgType__archived_at: typing_extensions.TypeAlias = typing.Literal["_archived_at", b"_archived_at"] + _WhichOneofReturnType__description: typing_extensions.TypeAlias = typing.Literal["description"] + _WhichOneofArgType__description: typing_extensions.TypeAlias = typing.Literal["_description", b"_description"] + _WhichOneofReturnType__settings: typing_extensions.TypeAlias = typing.Literal["settings"] + _WhichOneofArgType__settings: typing_extensions.TypeAlias = typing.Literal["_settings", b"_settings"] + _WhichOneofReturnType__slug: typing_extensions.TypeAlias = typing.Literal["slug"] + _WhichOneofArgType__slug: typing_extensions.TypeAlias = typing.Literal["_slug", b"_slug"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__archived_at) -> _WhichOneofReturnType__archived_at | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__description) -> _WhichOneofReturnType__description | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__settings) -> _WhichOneofReturnType__settings | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__slug) -> _WhichOneofReturnType__slug | None: ... + +Global___ProjectProto: typing_extensions.TypeAlias = ProjectProto + +@typing.final +class ProjectMembershipProto(google.protobuf.message.Message): + """Project membership entity""" + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + USER_ID_FIELD_NUMBER: builtins.int + ROLE_FIELD_NUMBER: builtins.int + JOINED_AT_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project identifier""" + user_id: builtins.str + """User identifier""" + role: Global___ProjectRoleProto.ValueType + """User's role in the project""" + joined_at: builtins.int + """When the user joined the project (Unix epoch seconds)""" + def __init__( + self, + *, + project_id: builtins.str = ..., + user_id: builtins.str = ..., + role: Global___ProjectRoleProto.ValueType = ..., + joined_at: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["joined_at", b"joined_at", "project_id", b"project_id", "role", b"role", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ProjectMembershipProto: typing_extensions.TypeAlias = ProjectMembershipProto + +@typing.final +class CreateProjectRequest(google.protobuf.message.Message): + """----------------------------------------------------------------------------- + Project CRUD Request/Response Messages + ----------------------------------------------------------------------------- + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SLUG_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + SETTINGS_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace to create project in""" + name: builtins.str + """Project name""" + slug: builtins.str + """Optional URL-friendly slug (auto-generated from name if not provided)""" + description: builtins.str + """Optional project description""" + @property + def settings(self) -> Global___ProjectSettingsProto: + """Optional project settings""" + + def __init__( + self, + *, + workspace_id: builtins.str = ..., + name: builtins.str = ..., + slug: builtins.str | None = ..., + description: builtins.str | None = ..., + settings: Global___ProjectSettingsProto | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_description", b"_description", "_settings", b"_settings", "_slug", b"_slug", "description", b"description", "settings", b"settings", "slug", b"slug"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_description", b"_description", "_settings", b"_settings", "_slug", b"_slug", "description", b"description", "name", b"name", "settings", b"settings", "slug", b"slug", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__description: typing_extensions.TypeAlias = typing.Literal["description"] + _WhichOneofArgType__description: typing_extensions.TypeAlias = typing.Literal["_description", b"_description"] + _WhichOneofReturnType__settings: typing_extensions.TypeAlias = typing.Literal["settings"] + _WhichOneofArgType__settings: typing_extensions.TypeAlias = typing.Literal["_settings", b"_settings"] + _WhichOneofReturnType__slug: typing_extensions.TypeAlias = typing.Literal["slug"] + _WhichOneofArgType__slug: typing_extensions.TypeAlias = typing.Literal["_slug", b"_slug"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__description) -> _WhichOneofReturnType__description | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__settings) -> _WhichOneofReturnType__settings | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__slug) -> _WhichOneofReturnType__slug | None: ... + +Global___CreateProjectRequest: typing_extensions.TypeAlias = CreateProjectRequest + +@typing.final +class GetProjectRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID to retrieve""" + def __init__( + self, + *, + project_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetProjectRequest: typing_extensions.TypeAlias = GetProjectRequest + +@typing.final +class GetProjectBySlugRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + SLUG_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace ID""" + slug: builtins.str + """Project slug""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + slug: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["slug", b"slug", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetProjectBySlugRequest: typing_extensions.TypeAlias = GetProjectBySlugRequest + +@typing.final +class ListProjectsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + INCLUDE_ARCHIVED_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace to list projects for""" + include_archived: builtins.bool + """Whether to include archived projects (default: false)""" + limit: builtins.int + """Maximum projects to return (default: 50)""" + offset: builtins.int + """Pagination offset""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + include_archived: builtins.bool = ..., + limit: builtins.int = ..., + offset: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["include_archived", b"include_archived", "limit", b"limit", "offset", b"offset", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListProjectsRequest: typing_extensions.TypeAlias = ListProjectsRequest + +@typing.final +class ListProjectsResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECTS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total count (for pagination)""" + @property + def projects(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ProjectProto]: + """Projects in the workspace""" + + def __init__( + self, + *, + projects: collections.abc.Iterable[Global___ProjectProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["projects", b"projects", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListProjectsResponse: typing_extensions.TypeAlias = ListProjectsResponse + +@typing.final +class UpdateProjectRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SLUG_FIELD_NUMBER: builtins.int + DESCRIPTION_FIELD_NUMBER: builtins.int + SETTINGS_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID to update""" + name: builtins.str + """Updated name (optional)""" + slug: builtins.str + """Updated slug (optional)""" + description: builtins.str + """Updated description (optional)""" + @property + def settings(self) -> Global___ProjectSettingsProto: + """Updated settings (optional, replaces existing)""" + + def __init__( + self, + *, + project_id: builtins.str = ..., + name: builtins.str | None = ..., + slug: builtins.str | None = ..., + description: builtins.str | None = ..., + settings: Global___ProjectSettingsProto | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_description", b"_description", "_name", b"_name", "_settings", b"_settings", "_slug", b"_slug", "description", b"description", "name", b"name", "settings", b"settings", "slug", b"slug"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_description", b"_description", "_name", b"_name", "_settings", b"_settings", "_slug", b"_slug", "description", b"description", "name", b"name", "project_id", b"project_id", "settings", b"settings", "slug", b"slug"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__description: typing_extensions.TypeAlias = typing.Literal["description"] + _WhichOneofArgType__description: typing_extensions.TypeAlias = typing.Literal["_description", b"_description"] + _WhichOneofReturnType__name: typing_extensions.TypeAlias = typing.Literal["name"] + _WhichOneofArgType__name: typing_extensions.TypeAlias = typing.Literal["_name", b"_name"] + _WhichOneofReturnType__settings: typing_extensions.TypeAlias = typing.Literal["settings"] + _WhichOneofArgType__settings: typing_extensions.TypeAlias = typing.Literal["_settings", b"_settings"] + _WhichOneofReturnType__slug: typing_extensions.TypeAlias = typing.Literal["slug"] + _WhichOneofArgType__slug: typing_extensions.TypeAlias = typing.Literal["_slug", b"_slug"] + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__description) -> _WhichOneofReturnType__description | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__name) -> _WhichOneofReturnType__name | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__settings) -> _WhichOneofReturnType__settings | None: ... + @typing.overload + def WhichOneof(self, oneof_group: _WhichOneofArgType__slug) -> _WhichOneofReturnType__slug | None: ... + +Global___UpdateProjectRequest: typing_extensions.TypeAlias = UpdateProjectRequest + +@typing.final +class ArchiveProjectRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID to archive""" + def __init__( + self, + *, + project_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ArchiveProjectRequest: typing_extensions.TypeAlias = ArchiveProjectRequest + +@typing.final +class RestoreProjectRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID to restore""" + def __init__( + self, + *, + project_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RestoreProjectRequest: typing_extensions.TypeAlias = RestoreProjectRequest + +@typing.final +class DeleteProjectRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID to delete""" + def __init__( + self, + *, + project_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteProjectRequest: typing_extensions.TypeAlias = DeleteProjectRequest + +@typing.final +class DeleteProjectResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether deletion succeeded""" + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___DeleteProjectResponse: typing_extensions.TypeAlias = DeleteProjectResponse + +@typing.final +class SetActiveProjectRequest(google.protobuf.message.Message): + """----------------------------------------------------------------------------- + Active Project Request/Response Messages + ----------------------------------------------------------------------------- + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + PROJECT_ID_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace scope""" + project_id: builtins.str + """Project ID to set as active (empty to clear)""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + project_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SetActiveProjectRequest: typing_extensions.TypeAlias = SetActiveProjectRequest + +@typing.final +class SetActiveProjectResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___SetActiveProjectResponse: typing_extensions.TypeAlias = SetActiveProjectResponse + +@typing.final +class GetActiveProjectRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace scope""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetActiveProjectRequest: typing_extensions.TypeAlias = GetActiveProjectRequest + +@typing.final +class GetActiveProjectResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + PROJECT_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Active project ID (unset if workspace default is used)""" + @property + def project(self) -> Global___ProjectProto: + """Resolved project (default if none set)""" + + def __init__( + self, + *, + project_id: builtins.str | None = ..., + project: Global___ProjectProto | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "project", b"project", "project_id", b"project_id"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id", "project", b"project", "project_id", b"project_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + _WhichOneofReturnType__project_id: typing_extensions.TypeAlias = typing.Literal["project_id"] + _WhichOneofArgType__project_id: typing_extensions.TypeAlias = typing.Literal["_project_id", b"_project_id"] + def WhichOneof(self, oneof_group: _WhichOneofArgType__project_id) -> _WhichOneofReturnType__project_id | None: ... + +Global___GetActiveProjectResponse: typing_extensions.TypeAlias = GetActiveProjectResponse + +@typing.final +class AddProjectMemberRequest(google.protobuf.message.Message): + """----------------------------------------------------------------------------- + Project Membership Request/Response Messages + ----------------------------------------------------------------------------- + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + USER_ID_FIELD_NUMBER: builtins.int + ROLE_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID""" + user_id: builtins.str + """User ID to add""" + role: Global___ProjectRoleProto.ValueType + """Role to assign""" + def __init__( + self, + *, + project_id: builtins.str = ..., + user_id: builtins.str = ..., + role: Global___ProjectRoleProto.ValueType = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id", "role", b"role", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___AddProjectMemberRequest: typing_extensions.TypeAlias = AddProjectMemberRequest + +@typing.final +class UpdateProjectMemberRoleRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + USER_ID_FIELD_NUMBER: builtins.int + ROLE_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID""" + user_id: builtins.str + """User ID""" + role: Global___ProjectRoleProto.ValueType + """New role""" + def __init__( + self, + *, + project_id: builtins.str = ..., + user_id: builtins.str = ..., + role: Global___ProjectRoleProto.ValueType = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id", "role", b"role", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___UpdateProjectMemberRoleRequest: typing_extensions.TypeAlias = UpdateProjectMemberRoleRequest + +@typing.final +class RemoveProjectMemberRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + USER_ID_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID""" + user_id: builtins.str + """User ID to remove""" + def __init__( + self, + *, + project_id: builtins.str = ..., + user_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["project_id", b"project_id", "user_id", b"user_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RemoveProjectMemberRequest: typing_extensions.TypeAlias = RemoveProjectMemberRequest + +@typing.final +class RemoveProjectMemberResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether removal succeeded""" + def __init__( + self, + *, + success: builtins.bool = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["success", b"success"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___RemoveProjectMemberResponse: typing_extensions.TypeAlias = RemoveProjectMemberResponse + +@typing.final +class ListProjectMembersRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + PROJECT_ID_FIELD_NUMBER: builtins.int + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + project_id: builtins.str + """Project ID""" + limit: builtins.int + """Maximum members to return (default: 100)""" + offset: builtins.int + """Pagination offset""" + def __init__( + self, + *, + project_id: builtins.str = ..., + limit: builtins.int = ..., + offset: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["limit", b"limit", "offset", b"offset", "project_id", b"project_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListProjectMembersRequest: typing_extensions.TypeAlias = ListProjectMembersRequest + +@typing.final +class ListProjectMembersResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + MEMBERS_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total count""" + @property + def members(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___ProjectMembershipProto]: + """Project members""" + + def __init__( + self, + *, + members: collections.abc.Iterable[Global___ProjectMembershipProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["members", b"members", "total_count", b"total_count"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListProjectMembersResponse: typing_extensions.TypeAlias = ListProjectMembersResponse + +@typing.final +class GetCurrentUserRequest(google.protobuf.message.Message): + """============================================================================= + Identity Management Messages (Sprint 16+) + ============================================================================= + + Empty - user ID comes from request headers + """ + + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + def __init__( + self, + ) -> None: ... + +Global___GetCurrentUserRequest: typing_extensions.TypeAlias = GetCurrentUserRequest + +@typing.final +class GetCurrentUserResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + USER_ID_FIELD_NUMBER: builtins.int + WORKSPACE_ID_FIELD_NUMBER: builtins.int + DISPLAY_NAME_FIELD_NUMBER: builtins.int + EMAIL_FIELD_NUMBER: builtins.int + IS_AUTHENTICATED_FIELD_NUMBER: builtins.int + AUTH_PROVIDER_FIELD_NUMBER: builtins.int + WORKSPACE_NAME_FIELD_NUMBER: builtins.int + ROLE_FIELD_NUMBER: builtins.int + user_id: builtins.str + """User ID (UUID string)""" + workspace_id: builtins.str + """Current workspace ID (UUID string)""" + display_name: builtins.str + """User display name""" + email: builtins.str + """User email (optional)""" + is_authenticated: builtins.bool + """Whether user is authenticated (vs local mode)""" + auth_provider: builtins.str + """OAuth provider if authenticated (google, outlook, etc.)""" + workspace_name: builtins.str + """Workspace name""" + role: builtins.str + """User's role in workspace""" + def __init__( + self, + *, + user_id: builtins.str = ..., + workspace_id: builtins.str = ..., + display_name: builtins.str = ..., + email: builtins.str = ..., + is_authenticated: builtins.bool = ..., + auth_provider: builtins.str = ..., + workspace_name: builtins.str = ..., + role: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["auth_provider", b"auth_provider", "display_name", b"display_name", "email", b"email", "is_authenticated", b"is_authenticated", "role", b"role", "user_id", b"user_id", "workspace_id", b"workspace_id", "workspace_name", b"workspace_name"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetCurrentUserResponse: typing_extensions.TypeAlias = GetCurrentUserResponse + +@typing.final +class WorkspaceProto(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + ID_FIELD_NUMBER: builtins.int + NAME_FIELD_NUMBER: builtins.int + SLUG_FIELD_NUMBER: builtins.int + IS_DEFAULT_FIELD_NUMBER: builtins.int + ROLE_FIELD_NUMBER: builtins.int + id: builtins.str + """Workspace ID (UUID string)""" + name: builtins.str + """Workspace name""" + slug: builtins.str + """URL slug""" + is_default: builtins.bool + """Whether this is the default workspace""" + role: builtins.str + """User's role in this workspace""" + def __init__( + self, + *, + id: builtins.str = ..., + name: builtins.str = ..., + slug: builtins.str = ..., + is_default: builtins.bool = ..., + role: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["id", b"id", "is_default", b"is_default", "name", b"name", "role", b"role", "slug", b"slug"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___WorkspaceProto: typing_extensions.TypeAlias = WorkspaceProto + +@typing.final +class ListWorkspacesRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + LIMIT_FIELD_NUMBER: builtins.int + OFFSET_FIELD_NUMBER: builtins.int + limit: builtins.int + """Maximum workspaces to return (default: 50)""" + offset: builtins.int + """Pagination offset""" + def __init__( + self, + *, + limit: builtins.int = ..., + offset: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["limit", b"limit", "offset", b"offset"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListWorkspacesRequest: typing_extensions.TypeAlias = ListWorkspacesRequest + +@typing.final +class ListWorkspacesResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACES_FIELD_NUMBER: builtins.int + TOTAL_COUNT_FIELD_NUMBER: builtins.int + total_count: builtins.int + """Total count""" + @property + def workspaces(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[Global___WorkspaceProto]: + """User's workspaces""" + + def __init__( + self, + *, + workspaces: collections.abc.Iterable[Global___WorkspaceProto] | None = ..., + total_count: builtins.int = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["total_count", b"total_count", "workspaces", b"workspaces"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___ListWorkspacesResponse: typing_extensions.TypeAlias = ListWorkspacesResponse + +@typing.final +class SwitchWorkspaceRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace ID to switch to""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SwitchWorkspaceRequest: typing_extensions.TypeAlias = SwitchWorkspaceRequest + +@typing.final +class SwitchWorkspaceResponse(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + SUCCESS_FIELD_NUMBER: builtins.int + WORKSPACE_FIELD_NUMBER: builtins.int + ERROR_MESSAGE_FIELD_NUMBER: builtins.int + success: builtins.bool + """Whether switch succeeded""" + error_message: builtins.str + """Error message if failed""" + @property + def workspace(self) -> Global___WorkspaceProto: + """New current workspace info""" + + def __init__( + self, + *, + success: builtins.bool = ..., + workspace: Global___WorkspaceProto | None = ..., + error_message: builtins.str = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["workspace", b"workspace"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["error_message", b"error_message", "success", b"success", "workspace", b"workspace"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___SwitchWorkspaceResponse: typing_extensions.TypeAlias = SwitchWorkspaceResponse + +@typing.final +class GetWorkspaceSettingsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace ID to fetch settings for""" + def __init__( + self, + *, + workspace_id: builtins.str = ..., + ) -> None: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___GetWorkspaceSettingsRequest: typing_extensions.TypeAlias = GetWorkspaceSettingsRequest + +@typing.final +class UpdateWorkspaceSettingsRequest(google.protobuf.message.Message): + DESCRIPTOR: google.protobuf.descriptor.Descriptor + + WORKSPACE_ID_FIELD_NUMBER: builtins.int + SETTINGS_FIELD_NUMBER: builtins.int + workspace_id: builtins.str + """Workspace ID to update settings for""" + @property + def settings(self) -> Global___WorkspaceSettingsProto: + """Updated settings (optional fields are merged)""" + + def __init__( + self, + *, + workspace_id: builtins.str = ..., + settings: Global___WorkspaceSettingsProto | None = ..., + ) -> None: ... + _HasFieldArgType: typing_extensions.TypeAlias = typing.Literal["settings", b"settings"] + def HasField(self, field_name: _HasFieldArgType) -> builtins.bool: ... + _ClearFieldArgType: typing_extensions.TypeAlias = typing.Literal["settings", b"settings", "workspace_id", b"workspace_id"] + def ClearField(self, field_name: _ClearFieldArgType) -> None: ... + +Global___UpdateWorkspaceSettingsRequest: typing_extensions.TypeAlias = UpdateWorkspaceSettingsRequest diff --git a/src/noteflow/grpc/proto/noteflow_pb2_grpc.py b/src/noteflow/grpc/proto/noteflow_pb2_grpc.py index 16a9467..e8e8e91 100644 --- a/src/noteflow/grpc/proto/noteflow_pb2_grpc.py +++ b/src/noteflow/grpc/proto/noteflow_pb2_grpc.py @@ -168,6 +168,21 @@ class NoteFlowServiceStub(object): request_serializer=noteflow__pb2.ServerInfoRequest.SerializeToString, response_deserializer=noteflow__pb2.ServerInfo.FromString, _registered_method=True) + self.GetAsrConfiguration = channel.unary_unary( + '/noteflow.NoteFlowService/GetAsrConfiguration', + request_serializer=noteflow__pb2.GetAsrConfigurationRequest.SerializeToString, + response_deserializer=noteflow__pb2.GetAsrConfigurationResponse.FromString, + _registered_method=True) + self.UpdateAsrConfiguration = channel.unary_unary( + '/noteflow.NoteFlowService/UpdateAsrConfiguration', + request_serializer=noteflow__pb2.UpdateAsrConfigurationRequest.SerializeToString, + response_deserializer=noteflow__pb2.UpdateAsrConfigurationResponse.FromString, + _registered_method=True) + self.GetAsrConfigurationJobStatus = channel.unary_unary( + '/noteflow.NoteFlowService/GetAsrConfigurationJobStatus', + request_serializer=noteflow__pb2.GetAsrConfigurationJobStatusRequest.SerializeToString, + response_deserializer=noteflow__pb2.AsrConfigurationJobStatus.FromString, + _registered_method=True) self.ExtractEntities = channel.unary_unary( '/noteflow.NoteFlowService/ExtractEntities', request_serializer=noteflow__pb2.ExtractEntitiesRequest.SerializeToString, @@ -253,6 +268,26 @@ class NoteFlowServiceStub(object): request_serializer=noteflow__pb2.GetCloudConsentStatusRequest.SerializeToString, response_deserializer=noteflow__pb2.GetCloudConsentStatusResponse.FromString, _registered_method=True) + self.SetHuggingFaceToken = channel.unary_unary( + '/noteflow.NoteFlowService/SetHuggingFaceToken', + request_serializer=noteflow__pb2.SetHuggingFaceTokenRequest.SerializeToString, + response_deserializer=noteflow__pb2.SetHuggingFaceTokenResponse.FromString, + _registered_method=True) + self.GetHuggingFaceTokenStatus = channel.unary_unary( + '/noteflow.NoteFlowService/GetHuggingFaceTokenStatus', + request_serializer=noteflow__pb2.GetHuggingFaceTokenStatusRequest.SerializeToString, + response_deserializer=noteflow__pb2.GetHuggingFaceTokenStatusResponse.FromString, + _registered_method=True) + self.DeleteHuggingFaceToken = channel.unary_unary( + '/noteflow.NoteFlowService/DeleteHuggingFaceToken', + request_serializer=noteflow__pb2.DeleteHuggingFaceTokenRequest.SerializeToString, + response_deserializer=noteflow__pb2.DeleteHuggingFaceTokenResponse.FromString, + _registered_method=True) + self.ValidateHuggingFaceToken = channel.unary_unary( + '/noteflow.NoteFlowService/ValidateHuggingFaceToken', + request_serializer=noteflow__pb2.ValidateHuggingFaceTokenRequest.SerializeToString, + response_deserializer=noteflow__pb2.ValidateHuggingFaceTokenResponse.FromString, + _registered_method=True) self.GetPreferences = channel.unary_unary( '/noteflow.NoteFlowService/GetPreferences', request_serializer=noteflow__pb2.GetPreferencesRequest.SerializeToString, @@ -596,6 +631,25 @@ class NoteFlowServiceServicer(object): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def GetAsrConfiguration(self, request, context): + """ASR Configuration Management (Sprint 19) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UpdateAsrConfiguration(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetAsrConfigurationJobStatus(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def ExtractEntities(self, request, context): """Named entity extraction (Sprint 4) + mutations (Sprint 8) """ @@ -703,6 +757,31 @@ class NoteFlowServiceServicer(object): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def SetHuggingFaceToken(self, request, context): + """HuggingFace Token Management (Sprint 19) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def GetHuggingFaceTokenStatus(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def DeleteHuggingFaceToken(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def ValidateHuggingFaceToken(self, request, context): + """Missing associated documentation comment in .proto file.""" + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + def GetPreferences(self, request, context): """User preferences sync (Sprint 14) """ @@ -1049,6 +1128,21 @@ def add_NoteFlowServiceServicer_to_server(servicer, server): request_deserializer=noteflow__pb2.ServerInfoRequest.FromString, response_serializer=noteflow__pb2.ServerInfo.SerializeToString, ), + 'GetAsrConfiguration': grpc.unary_unary_rpc_method_handler( + servicer.GetAsrConfiguration, + request_deserializer=noteflow__pb2.GetAsrConfigurationRequest.FromString, + response_serializer=noteflow__pb2.GetAsrConfigurationResponse.SerializeToString, + ), + 'UpdateAsrConfiguration': grpc.unary_unary_rpc_method_handler( + servicer.UpdateAsrConfiguration, + request_deserializer=noteflow__pb2.UpdateAsrConfigurationRequest.FromString, + response_serializer=noteflow__pb2.UpdateAsrConfigurationResponse.SerializeToString, + ), + 'GetAsrConfigurationJobStatus': grpc.unary_unary_rpc_method_handler( + servicer.GetAsrConfigurationJobStatus, + request_deserializer=noteflow__pb2.GetAsrConfigurationJobStatusRequest.FromString, + response_serializer=noteflow__pb2.AsrConfigurationJobStatus.SerializeToString, + ), 'ExtractEntities': grpc.unary_unary_rpc_method_handler( servicer.ExtractEntities, request_deserializer=noteflow__pb2.ExtractEntitiesRequest.FromString, @@ -1134,6 +1228,26 @@ def add_NoteFlowServiceServicer_to_server(servicer, server): request_deserializer=noteflow__pb2.GetCloudConsentStatusRequest.FromString, response_serializer=noteflow__pb2.GetCloudConsentStatusResponse.SerializeToString, ), + 'SetHuggingFaceToken': grpc.unary_unary_rpc_method_handler( + servicer.SetHuggingFaceToken, + request_deserializer=noteflow__pb2.SetHuggingFaceTokenRequest.FromString, + response_serializer=noteflow__pb2.SetHuggingFaceTokenResponse.SerializeToString, + ), + 'GetHuggingFaceTokenStatus': grpc.unary_unary_rpc_method_handler( + servicer.GetHuggingFaceTokenStatus, + request_deserializer=noteflow__pb2.GetHuggingFaceTokenStatusRequest.FromString, + response_serializer=noteflow__pb2.GetHuggingFaceTokenStatusResponse.SerializeToString, + ), + 'DeleteHuggingFaceToken': grpc.unary_unary_rpc_method_handler( + servicer.DeleteHuggingFaceToken, + request_deserializer=noteflow__pb2.DeleteHuggingFaceTokenRequest.FromString, + response_serializer=noteflow__pb2.DeleteHuggingFaceTokenResponse.SerializeToString, + ), + 'ValidateHuggingFaceToken': grpc.unary_unary_rpc_method_handler( + servicer.ValidateHuggingFaceToken, + request_deserializer=noteflow__pb2.ValidateHuggingFaceTokenRequest.FromString, + response_serializer=noteflow__pb2.ValidateHuggingFaceTokenResponse.SerializeToString, + ), 'GetPreferences': grpc.unary_unary_rpc_method_handler( servicer.GetPreferences, request_deserializer=noteflow__pb2.GetPreferencesRequest.FromString, @@ -2021,6 +2135,87 @@ class NoteFlowService(object): metadata, _registered_method=True) + @staticmethod + def GetAsrConfiguration(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/GetAsrConfiguration', + noteflow__pb2.GetAsrConfigurationRequest.SerializeToString, + noteflow__pb2.GetAsrConfigurationResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def UpdateAsrConfiguration(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/UpdateAsrConfiguration', + noteflow__pb2.UpdateAsrConfigurationRequest.SerializeToString, + noteflow__pb2.UpdateAsrConfigurationResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetAsrConfigurationJobStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/GetAsrConfigurationJobStatus', + noteflow__pb2.GetAsrConfigurationJobStatusRequest.SerializeToString, + noteflow__pb2.AsrConfigurationJobStatus.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + @staticmethod def ExtractEntities(request, target, @@ -2480,6 +2675,114 @@ class NoteFlowService(object): metadata, _registered_method=True) + @staticmethod + def SetHuggingFaceToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/SetHuggingFaceToken', + noteflow__pb2.SetHuggingFaceTokenRequest.SerializeToString, + noteflow__pb2.SetHuggingFaceTokenResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def GetHuggingFaceTokenStatus(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/GetHuggingFaceTokenStatus', + noteflow__pb2.GetHuggingFaceTokenStatusRequest.SerializeToString, + noteflow__pb2.GetHuggingFaceTokenStatusResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def DeleteHuggingFaceToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/DeleteHuggingFaceToken', + noteflow__pb2.DeleteHuggingFaceTokenRequest.SerializeToString, + noteflow__pb2.DeleteHuggingFaceTokenResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def ValidateHuggingFaceToken(request, + target, + options=(), + channel_credentials=None, + call_credentials=None, + insecure=False, + compression=None, + wait_for_ready=None, + timeout=None, + metadata=None): + return grpc.experimental.unary_unary( + request, + target, + '/noteflow.NoteFlowService/ValidateHuggingFaceToken', + noteflow__pb2.ValidateHuggingFaceTokenRequest.SerializeToString, + noteflow__pb2.ValidateHuggingFaceTokenResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + @staticmethod def GetPreferences(request, target, diff --git a/src/noteflow/grpc/proto/noteflow_pb2_grpc.pyi b/src/noteflow/grpc/proto/noteflow_pb2_grpc.pyi index 4aedcdb..314b55b 100644 --- a/src/noteflow/grpc/proto/noteflow_pb2_grpc.pyi +++ b/src/noteflow/grpc/proto/noteflow_pb2_grpc.pyi @@ -7,12 +7,10 @@ Provides real-time ASR streaming and meeting management import abc import collections.abc -import typing - import grpc import grpc.aio - import noteflow_pb2 +import typing _T = typing.TypeVar("_T") @@ -44,6 +42,14 @@ class NoteFlowServiceStub: DeleteMeeting: grpc.UnaryUnaryMultiCallable[noteflow_pb2.DeleteMeetingRequest, noteflow_pb2.DeleteMeetingResponse] GenerateSummary: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GenerateSummaryRequest, noteflow_pb2.Summary] """Summary generation""" + ListSummarizationTemplates: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ListSummarizationTemplatesRequest, noteflow_pb2.ListSummarizationTemplatesResponse] + """Summarization templates""" + GetSummarizationTemplate: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetSummarizationTemplateRequest, noteflow_pb2.GetSummarizationTemplateResponse] + CreateSummarizationTemplate: grpc.UnaryUnaryMultiCallable[noteflow_pb2.CreateSummarizationTemplateRequest, noteflow_pb2.SummarizationTemplateMutationResponse] + UpdateSummarizationTemplate: grpc.UnaryUnaryMultiCallable[noteflow_pb2.UpdateSummarizationTemplateRequest, noteflow_pb2.SummarizationTemplateMutationResponse] + ArchiveSummarizationTemplate: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ArchiveSummarizationTemplateRequest, noteflow_pb2.SummarizationTemplateProto] + ListSummarizationTemplateVersions: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ListSummarizationTemplateVersionsRequest, noteflow_pb2.ListSummarizationTemplateVersionsResponse] + RestoreSummarizationTemplateVersion: grpc.UnaryUnaryMultiCallable[noteflow_pb2.RestoreSummarizationTemplateVersionRequest, noteflow_pb2.SummarizationTemplateProto] AddAnnotation: grpc.UnaryUnaryMultiCallable[noteflow_pb2.AddAnnotationRequest, noteflow_pb2.Annotation] """Annotation management""" GetAnnotation: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetAnnotationRequest, noteflow_pb2.Annotation] @@ -60,6 +66,10 @@ class NoteFlowServiceStub: GetActiveDiarizationJobs: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetActiveDiarizationJobsRequest, noteflow_pb2.GetActiveDiarizationJobsResponse] GetServerInfo: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ServerInfoRequest, noteflow_pb2.ServerInfo] """Server health and capabilities""" + GetAsrConfiguration: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetAsrConfigurationRequest, noteflow_pb2.GetAsrConfigurationResponse] + """ASR Configuration Management (Sprint 19)""" + UpdateAsrConfiguration: grpc.UnaryUnaryMultiCallable[noteflow_pb2.UpdateAsrConfigurationRequest, noteflow_pb2.UpdateAsrConfigurationResponse] + GetAsrConfigurationJobStatus: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetAsrConfigurationJobStatusRequest, noteflow_pb2.AsrConfigurationJobStatus] ExtractEntities: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ExtractEntitiesRequest, noteflow_pb2.ExtractEntitiesResponse] """Named entity extraction (Sprint 4) + mutations (Sprint 8)""" UpdateEntity: grpc.UnaryUnaryMultiCallable[noteflow_pb2.UpdateEntityRequest, noteflow_pb2.UpdateEntityResponse] @@ -82,6 +92,11 @@ class NoteFlowServiceStub: """Cloud consent management (Sprint 7)""" RevokeCloudConsent: grpc.UnaryUnaryMultiCallable[noteflow_pb2.RevokeCloudConsentRequest, noteflow_pb2.RevokeCloudConsentResponse] GetCloudConsentStatus: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetCloudConsentStatusRequest, noteflow_pb2.GetCloudConsentStatusResponse] + SetHuggingFaceToken: grpc.UnaryUnaryMultiCallable[noteflow_pb2.SetHuggingFaceTokenRequest, noteflow_pb2.SetHuggingFaceTokenResponse] + """HuggingFace Token Management (Sprint 19)""" + GetHuggingFaceTokenStatus: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetHuggingFaceTokenStatusRequest, noteflow_pb2.GetHuggingFaceTokenStatusResponse] + DeleteHuggingFaceToken: grpc.UnaryUnaryMultiCallable[noteflow_pb2.DeleteHuggingFaceTokenRequest, noteflow_pb2.DeleteHuggingFaceTokenResponse] + ValidateHuggingFaceToken: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ValidateHuggingFaceTokenRequest, noteflow_pb2.ValidateHuggingFaceTokenResponse] GetPreferences: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetPreferencesRequest, noteflow_pb2.GetPreferencesResponse] """User preferences sync (Sprint 14)""" SetPreferences: grpc.UnaryUnaryMultiCallable[noteflow_pb2.SetPreferencesRequest, noteflow_pb2.SetPreferencesResponse] @@ -119,6 +134,12 @@ class NoteFlowServiceStub: UpdateProjectMemberRole: grpc.UnaryUnaryMultiCallable[noteflow_pb2.UpdateProjectMemberRoleRequest, noteflow_pb2.ProjectMembershipProto] RemoveProjectMember: grpc.UnaryUnaryMultiCallable[noteflow_pb2.RemoveProjectMemberRequest, noteflow_pb2.RemoveProjectMemberResponse] ListProjectMembers: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ListProjectMembersRequest, noteflow_pb2.ListProjectMembersResponse] + GetCurrentUser: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetCurrentUserRequest, noteflow_pb2.GetCurrentUserResponse] + """Identity management (Sprint 16+)""" + ListWorkspaces: grpc.UnaryUnaryMultiCallable[noteflow_pb2.ListWorkspacesRequest, noteflow_pb2.ListWorkspacesResponse] + SwitchWorkspace: grpc.UnaryUnaryMultiCallable[noteflow_pb2.SwitchWorkspaceRequest, noteflow_pb2.SwitchWorkspaceResponse] + GetWorkspaceSettings: grpc.UnaryUnaryMultiCallable[noteflow_pb2.GetWorkspaceSettingsRequest, noteflow_pb2.WorkspaceSettingsProto] + UpdateWorkspaceSettings: grpc.UnaryUnaryMultiCallable[noteflow_pb2.UpdateWorkspaceSettingsRequest, noteflow_pb2.WorkspaceSettingsProto] @typing.type_check_only class NoteFlowServiceAsyncStub(NoteFlowServiceStub): @@ -138,6 +159,14 @@ class NoteFlowServiceAsyncStub(NoteFlowServiceStub): DeleteMeeting: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.DeleteMeetingRequest, noteflow_pb2.DeleteMeetingResponse] # type: ignore[assignment] GenerateSummary: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GenerateSummaryRequest, noteflow_pb2.Summary] # type: ignore[assignment] """Summary generation""" + ListSummarizationTemplates: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ListSummarizationTemplatesRequest, noteflow_pb2.ListSummarizationTemplatesResponse] # type: ignore[assignment] + """Summarization templates""" + GetSummarizationTemplate: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetSummarizationTemplateRequest, noteflow_pb2.GetSummarizationTemplateResponse] # type: ignore[assignment] + CreateSummarizationTemplate: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.CreateSummarizationTemplateRequest, noteflow_pb2.SummarizationTemplateMutationResponse] # type: ignore[assignment] + UpdateSummarizationTemplate: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.UpdateSummarizationTemplateRequest, noteflow_pb2.SummarizationTemplateMutationResponse] # type: ignore[assignment] + ArchiveSummarizationTemplate: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ArchiveSummarizationTemplateRequest, noteflow_pb2.SummarizationTemplateProto] # type: ignore[assignment] + ListSummarizationTemplateVersions: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ListSummarizationTemplateVersionsRequest, noteflow_pb2.ListSummarizationTemplateVersionsResponse] # type: ignore[assignment] + RestoreSummarizationTemplateVersion: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.RestoreSummarizationTemplateVersionRequest, noteflow_pb2.SummarizationTemplateProto] # type: ignore[assignment] AddAnnotation: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.AddAnnotationRequest, noteflow_pb2.Annotation] # type: ignore[assignment] """Annotation management""" GetAnnotation: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetAnnotationRequest, noteflow_pb2.Annotation] # type: ignore[assignment] @@ -154,6 +183,10 @@ class NoteFlowServiceAsyncStub(NoteFlowServiceStub): GetActiveDiarizationJobs: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetActiveDiarizationJobsRequest, noteflow_pb2.GetActiveDiarizationJobsResponse] # type: ignore[assignment] GetServerInfo: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ServerInfoRequest, noteflow_pb2.ServerInfo] # type: ignore[assignment] """Server health and capabilities""" + GetAsrConfiguration: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetAsrConfigurationRequest, noteflow_pb2.GetAsrConfigurationResponse] # type: ignore[assignment] + """ASR Configuration Management (Sprint 19)""" + UpdateAsrConfiguration: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.UpdateAsrConfigurationRequest, noteflow_pb2.UpdateAsrConfigurationResponse] # type: ignore[assignment] + GetAsrConfigurationJobStatus: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetAsrConfigurationJobStatusRequest, noteflow_pb2.AsrConfigurationJobStatus] # type: ignore[assignment] ExtractEntities: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ExtractEntitiesRequest, noteflow_pb2.ExtractEntitiesResponse] # type: ignore[assignment] """Named entity extraction (Sprint 4) + mutations (Sprint 8)""" UpdateEntity: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.UpdateEntityRequest, noteflow_pb2.UpdateEntityResponse] # type: ignore[assignment] @@ -176,6 +209,11 @@ class NoteFlowServiceAsyncStub(NoteFlowServiceStub): """Cloud consent management (Sprint 7)""" RevokeCloudConsent: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.RevokeCloudConsentRequest, noteflow_pb2.RevokeCloudConsentResponse] # type: ignore[assignment] GetCloudConsentStatus: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetCloudConsentStatusRequest, noteflow_pb2.GetCloudConsentStatusResponse] # type: ignore[assignment] + SetHuggingFaceToken: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.SetHuggingFaceTokenRequest, noteflow_pb2.SetHuggingFaceTokenResponse] # type: ignore[assignment] + """HuggingFace Token Management (Sprint 19)""" + GetHuggingFaceTokenStatus: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetHuggingFaceTokenStatusRequest, noteflow_pb2.GetHuggingFaceTokenStatusResponse] # type: ignore[assignment] + DeleteHuggingFaceToken: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.DeleteHuggingFaceTokenRequest, noteflow_pb2.DeleteHuggingFaceTokenResponse] # type: ignore[assignment] + ValidateHuggingFaceToken: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ValidateHuggingFaceTokenRequest, noteflow_pb2.ValidateHuggingFaceTokenResponse] # type: ignore[assignment] GetPreferences: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetPreferencesRequest, noteflow_pb2.GetPreferencesResponse] # type: ignore[assignment] """User preferences sync (Sprint 14)""" SetPreferences: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.SetPreferencesRequest, noteflow_pb2.SetPreferencesResponse] # type: ignore[assignment] @@ -213,6 +251,12 @@ class NoteFlowServiceAsyncStub(NoteFlowServiceStub): UpdateProjectMemberRole: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.UpdateProjectMemberRoleRequest, noteflow_pb2.ProjectMembershipProto] # type: ignore[assignment] RemoveProjectMember: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.RemoveProjectMemberRequest, noteflow_pb2.RemoveProjectMemberResponse] # type: ignore[assignment] ListProjectMembers: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ListProjectMembersRequest, noteflow_pb2.ListProjectMembersResponse] # type: ignore[assignment] + GetCurrentUser: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetCurrentUserRequest, noteflow_pb2.GetCurrentUserResponse] # type: ignore[assignment] + """Identity management (Sprint 16+)""" + ListWorkspaces: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.ListWorkspacesRequest, noteflow_pb2.ListWorkspacesResponse] # type: ignore[assignment] + SwitchWorkspace: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.SwitchWorkspaceRequest, noteflow_pb2.SwitchWorkspaceResponse] # type: ignore[assignment] + GetWorkspaceSettings: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.GetWorkspaceSettingsRequest, noteflow_pb2.WorkspaceSettingsProto] # type: ignore[assignment] + UpdateWorkspaceSettings: grpc.aio.UnaryUnaryMultiCallable[noteflow_pb2.UpdateWorkspaceSettingsRequest, noteflow_pb2.WorkspaceSettingsProto] # type: ignore[assignment] class NoteFlowServiceServicer(metaclass=abc.ABCMeta): """============================================================================= @@ -225,7 +269,7 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request_iterator: _MaybeAsyncIterator[noteflow_pb2.AudioChunk], context: _ServicerContext, - ) -> collections.abc.Iterator[noteflow_pb2.TranscriptUpdate] | collections.abc.AsyncIterator[noteflow_pb2.TranscriptUpdate]: + ) -> typing.Union[collections.abc.Iterator[noteflow_pb2.TranscriptUpdate], collections.abc.AsyncIterator[noteflow_pb2.TranscriptUpdate]]: """Bidirectional streaming: client sends audio chunks, server returns transcripts""" @abc.abstractmethod @@ -233,7 +277,7 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.CreateMeetingRequest, context: _ServicerContext, - ) -> noteflow_pb2.Meeting | collections.abc.Awaitable[noteflow_pb2.Meeting]: + ) -> typing.Union[noteflow_pb2.Meeting, collections.abc.Awaitable[noteflow_pb2.Meeting]]: """Meeting lifecycle management""" @abc.abstractmethod @@ -241,43 +285,93 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.StopMeetingRequest, context: _ServicerContext, - ) -> noteflow_pb2.Meeting | collections.abc.Awaitable[noteflow_pb2.Meeting]: ... + ) -> typing.Union[noteflow_pb2.Meeting, collections.abc.Awaitable[noteflow_pb2.Meeting]]: ... @abc.abstractmethod def ListMeetings( self, request: noteflow_pb2.ListMeetingsRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListMeetingsResponse | collections.abc.Awaitable[noteflow_pb2.ListMeetingsResponse]: ... + ) -> typing.Union[noteflow_pb2.ListMeetingsResponse, collections.abc.Awaitable[noteflow_pb2.ListMeetingsResponse]]: ... @abc.abstractmethod def GetMeeting( self, request: noteflow_pb2.GetMeetingRequest, context: _ServicerContext, - ) -> noteflow_pb2.Meeting | collections.abc.Awaitable[noteflow_pb2.Meeting]: ... + ) -> typing.Union[noteflow_pb2.Meeting, collections.abc.Awaitable[noteflow_pb2.Meeting]]: ... @abc.abstractmethod def DeleteMeeting( self, request: noteflow_pb2.DeleteMeetingRequest, context: _ServicerContext, - ) -> noteflow_pb2.DeleteMeetingResponse | collections.abc.Awaitable[noteflow_pb2.DeleteMeetingResponse]: ... + ) -> typing.Union[noteflow_pb2.DeleteMeetingResponse, collections.abc.Awaitable[noteflow_pb2.DeleteMeetingResponse]]: ... @abc.abstractmethod def GenerateSummary( self, request: noteflow_pb2.GenerateSummaryRequest, context: _ServicerContext, - ) -> noteflow_pb2.Summary | collections.abc.Awaitable[noteflow_pb2.Summary]: + ) -> typing.Union[noteflow_pb2.Summary, collections.abc.Awaitable[noteflow_pb2.Summary]]: """Summary generation""" + @abc.abstractmethod + def ListSummarizationTemplates( + self, + request: noteflow_pb2.ListSummarizationTemplatesRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.ListSummarizationTemplatesResponse, collections.abc.Awaitable[noteflow_pb2.ListSummarizationTemplatesResponse]]: + """Summarization templates""" + + @abc.abstractmethod + def GetSummarizationTemplate( + self, + request: noteflow_pb2.GetSummarizationTemplateRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.GetSummarizationTemplateResponse, collections.abc.Awaitable[noteflow_pb2.GetSummarizationTemplateResponse]]: ... + + @abc.abstractmethod + def CreateSummarizationTemplate( + self, + request: noteflow_pb2.CreateSummarizationTemplateRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.SummarizationTemplateMutationResponse, collections.abc.Awaitable[noteflow_pb2.SummarizationTemplateMutationResponse]]: ... + + @abc.abstractmethod + def UpdateSummarizationTemplate( + self, + request: noteflow_pb2.UpdateSummarizationTemplateRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.SummarizationTemplateMutationResponse, collections.abc.Awaitable[noteflow_pb2.SummarizationTemplateMutationResponse]]: ... + + @abc.abstractmethod + def ArchiveSummarizationTemplate( + self, + request: noteflow_pb2.ArchiveSummarizationTemplateRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.SummarizationTemplateProto, collections.abc.Awaitable[noteflow_pb2.SummarizationTemplateProto]]: ... + + @abc.abstractmethod + def ListSummarizationTemplateVersions( + self, + request: noteflow_pb2.ListSummarizationTemplateVersionsRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.ListSummarizationTemplateVersionsResponse, collections.abc.Awaitable[noteflow_pb2.ListSummarizationTemplateVersionsResponse]]: ... + + @abc.abstractmethod + def RestoreSummarizationTemplateVersion( + self, + request: noteflow_pb2.RestoreSummarizationTemplateVersionRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.SummarizationTemplateProto, collections.abc.Awaitable[noteflow_pb2.SummarizationTemplateProto]]: ... + @abc.abstractmethod def AddAnnotation( self, request: noteflow_pb2.AddAnnotationRequest, context: _ServicerContext, - ) -> noteflow_pb2.Annotation | collections.abc.Awaitable[noteflow_pb2.Annotation]: + ) -> typing.Union[noteflow_pb2.Annotation, collections.abc.Awaitable[noteflow_pb2.Annotation]]: """Annotation management""" @abc.abstractmethod @@ -285,35 +379,35 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetAnnotationRequest, context: _ServicerContext, - ) -> noteflow_pb2.Annotation | collections.abc.Awaitable[noteflow_pb2.Annotation]: ... + ) -> typing.Union[noteflow_pb2.Annotation, collections.abc.Awaitable[noteflow_pb2.Annotation]]: ... @abc.abstractmethod def ListAnnotations( self, request: noteflow_pb2.ListAnnotationsRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListAnnotationsResponse | collections.abc.Awaitable[noteflow_pb2.ListAnnotationsResponse]: ... + ) -> typing.Union[noteflow_pb2.ListAnnotationsResponse, collections.abc.Awaitable[noteflow_pb2.ListAnnotationsResponse]]: ... @abc.abstractmethod def UpdateAnnotation( self, request: noteflow_pb2.UpdateAnnotationRequest, context: _ServicerContext, - ) -> noteflow_pb2.Annotation | collections.abc.Awaitable[noteflow_pb2.Annotation]: ... + ) -> typing.Union[noteflow_pb2.Annotation, collections.abc.Awaitable[noteflow_pb2.Annotation]]: ... @abc.abstractmethod def DeleteAnnotation( self, request: noteflow_pb2.DeleteAnnotationRequest, context: _ServicerContext, - ) -> noteflow_pb2.DeleteAnnotationResponse | collections.abc.Awaitable[noteflow_pb2.DeleteAnnotationResponse]: ... + ) -> typing.Union[noteflow_pb2.DeleteAnnotationResponse, collections.abc.Awaitable[noteflow_pb2.DeleteAnnotationResponse]]: ... @abc.abstractmethod def ExportTranscript( self, request: noteflow_pb2.ExportTranscriptRequest, context: _ServicerContext, - ) -> noteflow_pb2.ExportTranscriptResponse | collections.abc.Awaitable[noteflow_pb2.ExportTranscriptResponse]: + ) -> typing.Union[noteflow_pb2.ExportTranscriptResponse, collections.abc.Awaitable[noteflow_pb2.ExportTranscriptResponse]]: """Export functionality""" @abc.abstractmethod @@ -321,7 +415,7 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.RefineSpeakerDiarizationRequest, context: _ServicerContext, - ) -> noteflow_pb2.RefineSpeakerDiarizationResponse | collections.abc.Awaitable[noteflow_pb2.RefineSpeakerDiarizationResponse]: + ) -> typing.Union[noteflow_pb2.RefineSpeakerDiarizationResponse, collections.abc.Awaitable[noteflow_pb2.RefineSpeakerDiarizationResponse]]: """Speaker diarization""" @abc.abstractmethod @@ -329,43 +423,65 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.RenameSpeakerRequest, context: _ServicerContext, - ) -> noteflow_pb2.RenameSpeakerResponse | collections.abc.Awaitable[noteflow_pb2.RenameSpeakerResponse]: ... + ) -> typing.Union[noteflow_pb2.RenameSpeakerResponse, collections.abc.Awaitable[noteflow_pb2.RenameSpeakerResponse]]: ... @abc.abstractmethod def GetDiarizationJobStatus( self, request: noteflow_pb2.GetDiarizationJobStatusRequest, context: _ServicerContext, - ) -> noteflow_pb2.DiarizationJobStatus | collections.abc.Awaitable[noteflow_pb2.DiarizationJobStatus]: ... + ) -> typing.Union[noteflow_pb2.DiarizationJobStatus, collections.abc.Awaitable[noteflow_pb2.DiarizationJobStatus]]: ... @abc.abstractmethod def CancelDiarizationJob( self, request: noteflow_pb2.CancelDiarizationJobRequest, context: _ServicerContext, - ) -> noteflow_pb2.CancelDiarizationJobResponse | collections.abc.Awaitable[noteflow_pb2.CancelDiarizationJobResponse]: ... + ) -> typing.Union[noteflow_pb2.CancelDiarizationJobResponse, collections.abc.Awaitable[noteflow_pb2.CancelDiarizationJobResponse]]: ... @abc.abstractmethod def GetActiveDiarizationJobs( self, request: noteflow_pb2.GetActiveDiarizationJobsRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetActiveDiarizationJobsResponse | collections.abc.Awaitable[noteflow_pb2.GetActiveDiarizationJobsResponse]: ... + ) -> typing.Union[noteflow_pb2.GetActiveDiarizationJobsResponse, collections.abc.Awaitable[noteflow_pb2.GetActiveDiarizationJobsResponse]]: ... @abc.abstractmethod def GetServerInfo( self, request: noteflow_pb2.ServerInfoRequest, context: _ServicerContext, - ) -> noteflow_pb2.ServerInfo | collections.abc.Awaitable[noteflow_pb2.ServerInfo]: + ) -> typing.Union[noteflow_pb2.ServerInfo, collections.abc.Awaitable[noteflow_pb2.ServerInfo]]: """Server health and capabilities""" + @abc.abstractmethod + def GetAsrConfiguration( + self, + request: noteflow_pb2.GetAsrConfigurationRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.GetAsrConfigurationResponse, collections.abc.Awaitable[noteflow_pb2.GetAsrConfigurationResponse]]: + """ASR Configuration Management (Sprint 19)""" + + @abc.abstractmethod + def UpdateAsrConfiguration( + self, + request: noteflow_pb2.UpdateAsrConfigurationRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.UpdateAsrConfigurationResponse, collections.abc.Awaitable[noteflow_pb2.UpdateAsrConfigurationResponse]]: ... + + @abc.abstractmethod + def GetAsrConfigurationJobStatus( + self, + request: noteflow_pb2.GetAsrConfigurationJobStatusRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.AsrConfigurationJobStatus, collections.abc.Awaitable[noteflow_pb2.AsrConfigurationJobStatus]]: ... + @abc.abstractmethod def ExtractEntities( self, request: noteflow_pb2.ExtractEntitiesRequest, context: _ServicerContext, - ) -> noteflow_pb2.ExtractEntitiesResponse | collections.abc.Awaitable[noteflow_pb2.ExtractEntitiesResponse]: + ) -> typing.Union[noteflow_pb2.ExtractEntitiesResponse, collections.abc.Awaitable[noteflow_pb2.ExtractEntitiesResponse]]: """Named entity extraction (Sprint 4) + mutations (Sprint 8)""" @abc.abstractmethod @@ -373,21 +489,21 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.UpdateEntityRequest, context: _ServicerContext, - ) -> noteflow_pb2.UpdateEntityResponse | collections.abc.Awaitable[noteflow_pb2.UpdateEntityResponse]: ... + ) -> typing.Union[noteflow_pb2.UpdateEntityResponse, collections.abc.Awaitable[noteflow_pb2.UpdateEntityResponse]]: ... @abc.abstractmethod def DeleteEntity( self, request: noteflow_pb2.DeleteEntityRequest, context: _ServicerContext, - ) -> noteflow_pb2.DeleteEntityResponse | collections.abc.Awaitable[noteflow_pb2.DeleteEntityResponse]: ... + ) -> typing.Union[noteflow_pb2.DeleteEntityResponse, collections.abc.Awaitable[noteflow_pb2.DeleteEntityResponse]]: ... @abc.abstractmethod def ListCalendarEvents( self, request: noteflow_pb2.ListCalendarEventsRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListCalendarEventsResponse | collections.abc.Awaitable[noteflow_pb2.ListCalendarEventsResponse]: + ) -> typing.Union[noteflow_pb2.ListCalendarEventsResponse, collections.abc.Awaitable[noteflow_pb2.ListCalendarEventsResponse]]: """Calendar integration (Sprint 5)""" @abc.abstractmethod @@ -395,14 +511,14 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetCalendarProvidersRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetCalendarProvidersResponse | collections.abc.Awaitable[noteflow_pb2.GetCalendarProvidersResponse]: ... + ) -> typing.Union[noteflow_pb2.GetCalendarProvidersResponse, collections.abc.Awaitable[noteflow_pb2.GetCalendarProvidersResponse]]: ... @abc.abstractmethod def InitiateOAuth( self, request: noteflow_pb2.InitiateOAuthRequest, context: _ServicerContext, - ) -> noteflow_pb2.InitiateOAuthResponse | collections.abc.Awaitable[noteflow_pb2.InitiateOAuthResponse]: + ) -> typing.Union[noteflow_pb2.InitiateOAuthResponse, collections.abc.Awaitable[noteflow_pb2.InitiateOAuthResponse]]: """OAuth integration (generic for calendar, email, PKM, etc.)""" @abc.abstractmethod @@ -410,28 +526,28 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.CompleteOAuthRequest, context: _ServicerContext, - ) -> noteflow_pb2.CompleteOAuthResponse | collections.abc.Awaitable[noteflow_pb2.CompleteOAuthResponse]: ... + ) -> typing.Union[noteflow_pb2.CompleteOAuthResponse, collections.abc.Awaitable[noteflow_pb2.CompleteOAuthResponse]]: ... @abc.abstractmethod def GetOAuthConnectionStatus( self, request: noteflow_pb2.GetOAuthConnectionStatusRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetOAuthConnectionStatusResponse | collections.abc.Awaitable[noteflow_pb2.GetOAuthConnectionStatusResponse]: ... + ) -> typing.Union[noteflow_pb2.GetOAuthConnectionStatusResponse, collections.abc.Awaitable[noteflow_pb2.GetOAuthConnectionStatusResponse]]: ... @abc.abstractmethod def DisconnectOAuth( self, request: noteflow_pb2.DisconnectOAuthRequest, context: _ServicerContext, - ) -> noteflow_pb2.DisconnectOAuthResponse | collections.abc.Awaitable[noteflow_pb2.DisconnectOAuthResponse]: ... + ) -> typing.Union[noteflow_pb2.DisconnectOAuthResponse, collections.abc.Awaitable[noteflow_pb2.DisconnectOAuthResponse]]: ... @abc.abstractmethod def RegisterWebhook( self, request: noteflow_pb2.RegisterWebhookRequest, context: _ServicerContext, - ) -> noteflow_pb2.WebhookConfigProto | collections.abc.Awaitable[noteflow_pb2.WebhookConfigProto]: + ) -> typing.Union[noteflow_pb2.WebhookConfigProto, collections.abc.Awaitable[noteflow_pb2.WebhookConfigProto]]: """Webhook management (Sprint 6)""" @abc.abstractmethod @@ -439,35 +555,35 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.ListWebhooksRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListWebhooksResponse | collections.abc.Awaitable[noteflow_pb2.ListWebhooksResponse]: ... + ) -> typing.Union[noteflow_pb2.ListWebhooksResponse, collections.abc.Awaitable[noteflow_pb2.ListWebhooksResponse]]: ... @abc.abstractmethod def UpdateWebhook( self, request: noteflow_pb2.UpdateWebhookRequest, context: _ServicerContext, - ) -> noteflow_pb2.WebhookConfigProto | collections.abc.Awaitable[noteflow_pb2.WebhookConfigProto]: ... + ) -> typing.Union[noteflow_pb2.WebhookConfigProto, collections.abc.Awaitable[noteflow_pb2.WebhookConfigProto]]: ... @abc.abstractmethod def DeleteWebhook( self, request: noteflow_pb2.DeleteWebhookRequest, context: _ServicerContext, - ) -> noteflow_pb2.DeleteWebhookResponse | collections.abc.Awaitable[noteflow_pb2.DeleteWebhookResponse]: ... + ) -> typing.Union[noteflow_pb2.DeleteWebhookResponse, collections.abc.Awaitable[noteflow_pb2.DeleteWebhookResponse]]: ... @abc.abstractmethod def GetWebhookDeliveries( self, request: noteflow_pb2.GetWebhookDeliveriesRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetWebhookDeliveriesResponse | collections.abc.Awaitable[noteflow_pb2.GetWebhookDeliveriesResponse]: ... + ) -> typing.Union[noteflow_pb2.GetWebhookDeliveriesResponse, collections.abc.Awaitable[noteflow_pb2.GetWebhookDeliveriesResponse]]: ... @abc.abstractmethod def GrantCloudConsent( self, request: noteflow_pb2.GrantCloudConsentRequest, context: _ServicerContext, - ) -> noteflow_pb2.GrantCloudConsentResponse | collections.abc.Awaitable[noteflow_pb2.GrantCloudConsentResponse]: + ) -> typing.Union[noteflow_pb2.GrantCloudConsentResponse, collections.abc.Awaitable[noteflow_pb2.GrantCloudConsentResponse]]: """Cloud consent management (Sprint 7)""" @abc.abstractmethod @@ -475,21 +591,50 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.RevokeCloudConsentRequest, context: _ServicerContext, - ) -> noteflow_pb2.RevokeCloudConsentResponse | collections.abc.Awaitable[noteflow_pb2.RevokeCloudConsentResponse]: ... + ) -> typing.Union[noteflow_pb2.RevokeCloudConsentResponse, collections.abc.Awaitable[noteflow_pb2.RevokeCloudConsentResponse]]: ... @abc.abstractmethod def GetCloudConsentStatus( self, request: noteflow_pb2.GetCloudConsentStatusRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetCloudConsentStatusResponse | collections.abc.Awaitable[noteflow_pb2.GetCloudConsentStatusResponse]: ... + ) -> typing.Union[noteflow_pb2.GetCloudConsentStatusResponse, collections.abc.Awaitable[noteflow_pb2.GetCloudConsentStatusResponse]]: ... + + @abc.abstractmethod + def SetHuggingFaceToken( + self, + request: noteflow_pb2.SetHuggingFaceTokenRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.SetHuggingFaceTokenResponse, collections.abc.Awaitable[noteflow_pb2.SetHuggingFaceTokenResponse]]: + """HuggingFace Token Management (Sprint 19)""" + + @abc.abstractmethod + def GetHuggingFaceTokenStatus( + self, + request: noteflow_pb2.GetHuggingFaceTokenStatusRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.GetHuggingFaceTokenStatusResponse, collections.abc.Awaitable[noteflow_pb2.GetHuggingFaceTokenStatusResponse]]: ... + + @abc.abstractmethod + def DeleteHuggingFaceToken( + self, + request: noteflow_pb2.DeleteHuggingFaceTokenRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.DeleteHuggingFaceTokenResponse, collections.abc.Awaitable[noteflow_pb2.DeleteHuggingFaceTokenResponse]]: ... + + @abc.abstractmethod + def ValidateHuggingFaceToken( + self, + request: noteflow_pb2.ValidateHuggingFaceTokenRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.ValidateHuggingFaceTokenResponse, collections.abc.Awaitable[noteflow_pb2.ValidateHuggingFaceTokenResponse]]: ... @abc.abstractmethod def GetPreferences( self, request: noteflow_pb2.GetPreferencesRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetPreferencesResponse | collections.abc.Awaitable[noteflow_pb2.GetPreferencesResponse]: + ) -> typing.Union[noteflow_pb2.GetPreferencesResponse, collections.abc.Awaitable[noteflow_pb2.GetPreferencesResponse]]: """User preferences sync (Sprint 14)""" @abc.abstractmethod @@ -497,14 +642,14 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.SetPreferencesRequest, context: _ServicerContext, - ) -> noteflow_pb2.SetPreferencesResponse | collections.abc.Awaitable[noteflow_pb2.SetPreferencesResponse]: ... + ) -> typing.Union[noteflow_pb2.SetPreferencesResponse, collections.abc.Awaitable[noteflow_pb2.SetPreferencesResponse]]: ... @abc.abstractmethod def StartIntegrationSync( self, request: noteflow_pb2.StartIntegrationSyncRequest, context: _ServicerContext, - ) -> noteflow_pb2.StartIntegrationSyncResponse | collections.abc.Awaitable[noteflow_pb2.StartIntegrationSyncResponse]: + ) -> typing.Union[noteflow_pb2.StartIntegrationSyncResponse, collections.abc.Awaitable[noteflow_pb2.StartIntegrationSyncResponse]]: """Integration sync orchestration (Sprint 9)""" @abc.abstractmethod @@ -512,21 +657,21 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetSyncStatusRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetSyncStatusResponse | collections.abc.Awaitable[noteflow_pb2.GetSyncStatusResponse]: ... + ) -> typing.Union[noteflow_pb2.GetSyncStatusResponse, collections.abc.Awaitable[noteflow_pb2.GetSyncStatusResponse]]: ... @abc.abstractmethod def ListSyncHistory( self, request: noteflow_pb2.ListSyncHistoryRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListSyncHistoryResponse | collections.abc.Awaitable[noteflow_pb2.ListSyncHistoryResponse]: ... + ) -> typing.Union[noteflow_pb2.ListSyncHistoryResponse, collections.abc.Awaitable[noteflow_pb2.ListSyncHistoryResponse]]: ... @abc.abstractmethod def GetUserIntegrations( self, request: noteflow_pb2.GetUserIntegrationsRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetUserIntegrationsResponse | collections.abc.Awaitable[noteflow_pb2.GetUserIntegrationsResponse]: + ) -> typing.Union[noteflow_pb2.GetUserIntegrationsResponse, collections.abc.Awaitable[noteflow_pb2.GetUserIntegrationsResponse]]: """Integration cache validation (Sprint 18.1)""" @abc.abstractmethod @@ -534,7 +679,7 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetRecentLogsRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetRecentLogsResponse | collections.abc.Awaitable[noteflow_pb2.GetRecentLogsResponse]: + ) -> typing.Union[noteflow_pb2.GetRecentLogsResponse, collections.abc.Awaitable[noteflow_pb2.GetRecentLogsResponse]]: """Observability (Sprint 9)""" @abc.abstractmethod @@ -542,14 +687,14 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetPerformanceMetricsRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetPerformanceMetricsResponse | collections.abc.Awaitable[noteflow_pb2.GetPerformanceMetricsResponse]: ... + ) -> typing.Union[noteflow_pb2.GetPerformanceMetricsResponse, collections.abc.Awaitable[noteflow_pb2.GetPerformanceMetricsResponse]]: ... @abc.abstractmethod def RegisterOidcProvider( self, request: noteflow_pb2.RegisterOidcProviderRequest, context: _ServicerContext, - ) -> noteflow_pb2.OidcProviderProto | collections.abc.Awaitable[noteflow_pb2.OidcProviderProto]: + ) -> typing.Union[noteflow_pb2.OidcProviderProto, collections.abc.Awaitable[noteflow_pb2.OidcProviderProto]]: """OIDC Provider Management (Sprint 17)""" @abc.abstractmethod @@ -557,49 +702,49 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.ListOidcProvidersRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListOidcProvidersResponse | collections.abc.Awaitable[noteflow_pb2.ListOidcProvidersResponse]: ... + ) -> typing.Union[noteflow_pb2.ListOidcProvidersResponse, collections.abc.Awaitable[noteflow_pb2.ListOidcProvidersResponse]]: ... @abc.abstractmethod def GetOidcProvider( self, request: noteflow_pb2.GetOidcProviderRequest, context: _ServicerContext, - ) -> noteflow_pb2.OidcProviderProto | collections.abc.Awaitable[noteflow_pb2.OidcProviderProto]: ... + ) -> typing.Union[noteflow_pb2.OidcProviderProto, collections.abc.Awaitable[noteflow_pb2.OidcProviderProto]]: ... @abc.abstractmethod def UpdateOidcProvider( self, request: noteflow_pb2.UpdateOidcProviderRequest, context: _ServicerContext, - ) -> noteflow_pb2.OidcProviderProto | collections.abc.Awaitable[noteflow_pb2.OidcProviderProto]: ... + ) -> typing.Union[noteflow_pb2.OidcProviderProto, collections.abc.Awaitable[noteflow_pb2.OidcProviderProto]]: ... @abc.abstractmethod def DeleteOidcProvider( self, request: noteflow_pb2.DeleteOidcProviderRequest, context: _ServicerContext, - ) -> noteflow_pb2.DeleteOidcProviderResponse | collections.abc.Awaitable[noteflow_pb2.DeleteOidcProviderResponse]: ... + ) -> typing.Union[noteflow_pb2.DeleteOidcProviderResponse, collections.abc.Awaitable[noteflow_pb2.DeleteOidcProviderResponse]]: ... @abc.abstractmethod def RefreshOidcDiscovery( self, request: noteflow_pb2.RefreshOidcDiscoveryRequest, context: _ServicerContext, - ) -> noteflow_pb2.RefreshOidcDiscoveryResponse | collections.abc.Awaitable[noteflow_pb2.RefreshOidcDiscoveryResponse]: ... + ) -> typing.Union[noteflow_pb2.RefreshOidcDiscoveryResponse, collections.abc.Awaitable[noteflow_pb2.RefreshOidcDiscoveryResponse]]: ... @abc.abstractmethod def ListOidcPresets( self, request: noteflow_pb2.ListOidcPresetsRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListOidcPresetsResponse | collections.abc.Awaitable[noteflow_pb2.ListOidcPresetsResponse]: ... + ) -> typing.Union[noteflow_pb2.ListOidcPresetsResponse, collections.abc.Awaitable[noteflow_pb2.ListOidcPresetsResponse]]: ... @abc.abstractmethod def CreateProject( self, request: noteflow_pb2.CreateProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectProto | collections.abc.Awaitable[noteflow_pb2.ProjectProto]: + ) -> typing.Union[noteflow_pb2.ProjectProto, collections.abc.Awaitable[noteflow_pb2.ProjectProto]]: """Project management (Sprint 18)""" @abc.abstractmethod @@ -607,56 +752,56 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectProto | collections.abc.Awaitable[noteflow_pb2.ProjectProto]: ... + ) -> typing.Union[noteflow_pb2.ProjectProto, collections.abc.Awaitable[noteflow_pb2.ProjectProto]]: ... @abc.abstractmethod def GetProjectBySlug( self, request: noteflow_pb2.GetProjectBySlugRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectProto | collections.abc.Awaitable[noteflow_pb2.ProjectProto]: ... + ) -> typing.Union[noteflow_pb2.ProjectProto, collections.abc.Awaitable[noteflow_pb2.ProjectProto]]: ... @abc.abstractmethod def ListProjects( self, request: noteflow_pb2.ListProjectsRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListProjectsResponse | collections.abc.Awaitable[noteflow_pb2.ListProjectsResponse]: ... + ) -> typing.Union[noteflow_pb2.ListProjectsResponse, collections.abc.Awaitable[noteflow_pb2.ListProjectsResponse]]: ... @abc.abstractmethod def UpdateProject( self, request: noteflow_pb2.UpdateProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectProto | collections.abc.Awaitable[noteflow_pb2.ProjectProto]: ... + ) -> typing.Union[noteflow_pb2.ProjectProto, collections.abc.Awaitable[noteflow_pb2.ProjectProto]]: ... @abc.abstractmethod def ArchiveProject( self, request: noteflow_pb2.ArchiveProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectProto | collections.abc.Awaitable[noteflow_pb2.ProjectProto]: ... + ) -> typing.Union[noteflow_pb2.ProjectProto, collections.abc.Awaitable[noteflow_pb2.ProjectProto]]: ... @abc.abstractmethod def RestoreProject( self, request: noteflow_pb2.RestoreProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectProto | collections.abc.Awaitable[noteflow_pb2.ProjectProto]: ... + ) -> typing.Union[noteflow_pb2.ProjectProto, collections.abc.Awaitable[noteflow_pb2.ProjectProto]]: ... @abc.abstractmethod def DeleteProject( self, request: noteflow_pb2.DeleteProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.DeleteProjectResponse | collections.abc.Awaitable[noteflow_pb2.DeleteProjectResponse]: ... + ) -> typing.Union[noteflow_pb2.DeleteProjectResponse, collections.abc.Awaitable[noteflow_pb2.DeleteProjectResponse]]: ... @abc.abstractmethod def SetActiveProject( self, request: noteflow_pb2.SetActiveProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.SetActiveProjectResponse | collections.abc.Awaitable[noteflow_pb2.SetActiveProjectResponse]: + ) -> typing.Union[noteflow_pb2.SetActiveProjectResponse, collections.abc.Awaitable[noteflow_pb2.SetActiveProjectResponse]]: """Active project (Sprint 18)""" @abc.abstractmethod @@ -664,14 +809,14 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.GetActiveProjectRequest, context: _ServicerContext, - ) -> noteflow_pb2.GetActiveProjectResponse | collections.abc.Awaitable[noteflow_pb2.GetActiveProjectResponse]: ... + ) -> typing.Union[noteflow_pb2.GetActiveProjectResponse, collections.abc.Awaitable[noteflow_pb2.GetActiveProjectResponse]]: ... @abc.abstractmethod def AddProjectMember( self, request: noteflow_pb2.AddProjectMemberRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectMembershipProto | collections.abc.Awaitable[noteflow_pb2.ProjectMembershipProto]: + ) -> typing.Union[noteflow_pb2.ProjectMembershipProto, collections.abc.Awaitable[noteflow_pb2.ProjectMembershipProto]]: """Project membership management (Sprint 18)""" @abc.abstractmethod @@ -679,20 +824,56 @@ class NoteFlowServiceServicer(metaclass=abc.ABCMeta): self, request: noteflow_pb2.UpdateProjectMemberRoleRequest, context: _ServicerContext, - ) -> noteflow_pb2.ProjectMembershipProto | collections.abc.Awaitable[noteflow_pb2.ProjectMembershipProto]: ... + ) -> typing.Union[noteflow_pb2.ProjectMembershipProto, collections.abc.Awaitable[noteflow_pb2.ProjectMembershipProto]]: ... @abc.abstractmethod def RemoveProjectMember( self, request: noteflow_pb2.RemoveProjectMemberRequest, context: _ServicerContext, - ) -> noteflow_pb2.RemoveProjectMemberResponse | collections.abc.Awaitable[noteflow_pb2.RemoveProjectMemberResponse]: ... + ) -> typing.Union[noteflow_pb2.RemoveProjectMemberResponse, collections.abc.Awaitable[noteflow_pb2.RemoveProjectMemberResponse]]: ... @abc.abstractmethod def ListProjectMembers( self, request: noteflow_pb2.ListProjectMembersRequest, context: _ServicerContext, - ) -> noteflow_pb2.ListProjectMembersResponse | collections.abc.Awaitable[noteflow_pb2.ListProjectMembersResponse]: ... + ) -> typing.Union[noteflow_pb2.ListProjectMembersResponse, collections.abc.Awaitable[noteflow_pb2.ListProjectMembersResponse]]: ... -def add_NoteFlowServiceServicer_to_server(servicer: NoteFlowServiceServicer, server: grpc.Server | grpc.aio.Server) -> None: ... + @abc.abstractmethod + def GetCurrentUser( + self, + request: noteflow_pb2.GetCurrentUserRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.GetCurrentUserResponse, collections.abc.Awaitable[noteflow_pb2.GetCurrentUserResponse]]: + """Identity management (Sprint 16+)""" + + @abc.abstractmethod + def ListWorkspaces( + self, + request: noteflow_pb2.ListWorkspacesRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.ListWorkspacesResponse, collections.abc.Awaitable[noteflow_pb2.ListWorkspacesResponse]]: ... + + @abc.abstractmethod + def SwitchWorkspace( + self, + request: noteflow_pb2.SwitchWorkspaceRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.SwitchWorkspaceResponse, collections.abc.Awaitable[noteflow_pb2.SwitchWorkspaceResponse]]: ... + + @abc.abstractmethod + def GetWorkspaceSettings( + self, + request: noteflow_pb2.GetWorkspaceSettingsRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.WorkspaceSettingsProto, collections.abc.Awaitable[noteflow_pb2.WorkspaceSettingsProto]]: ... + + @abc.abstractmethod + def UpdateWorkspaceSettings( + self, + request: noteflow_pb2.UpdateWorkspaceSettingsRequest, + context: _ServicerContext, + ) -> typing.Union[noteflow_pb2.WorkspaceSettingsProto, collections.abc.Awaitable[noteflow_pb2.WorkspaceSettingsProto]]: ... + +def add_NoteFlowServiceServicer_to_server(servicer: NoteFlowServiceServicer, server: typing.Union[grpc.Server, grpc.aio.Server]) -> None: ... diff --git a/src/noteflow/grpc/service.py b/src/noteflow/grpc/service.py index d62f971..7c7eecb 100644 --- a/src/noteflow/grpc/service.py +++ b/src/noteflow/grpc/service.py @@ -23,11 +23,13 @@ from ._config import ServicesConfig from ._identity_singleton import default_identity_service from ._mixins import ( AnnotationMixin, + AsrConfigMixin, CalendarMixin, DiarizationJobMixin, DiarizationMixin, EntitiesMixin, ExportMixin, + HfTokenMixin, IdentityMixin, MeetingMixin, ObservabilityMixin, @@ -56,6 +58,8 @@ from .stream_state import MeetingStreamState if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker + from noteflow.application.services.asr_config_service import AsrConfigService + from noteflow.application.services.hf_token_service import HfTokenService from noteflow.infrastructure.asr import FasterWhisperEngine from noteflow.infrastructure.auth.oidc_registry import OidcAuthService @@ -88,6 +92,8 @@ class NoteFlowServicer( IdentityMixin, ProjectMixin, ProjectMembershipMixin, + AsrConfigMixin, + HfTokenMixin, NoteFlowServicerStubs, GrpcBaseServicer, ): @@ -159,6 +165,13 @@ class NoteFlowServicer( session_factory: async_sessionmaker[AsyncSession] | None, ) -> None: """Initialize audio recording infrastructure.""" + from noteflow.application.services.asr_config_service import ( + AsrConfigService as AsrConfigServiceImpl, + ) + from noteflow.application.services.hf_token_service import ( + HfTokenService as HfTokenServiceImpl, + ) + self.memory_store: MeetingStore | None = ( MeetingStore() if session_factory is None else None ) @@ -167,6 +180,26 @@ class NoteFlowServicer( self.crypto = AesGcmCryptoBox(self._keystore) self.audio_writers: dict[str, MeetingAudioWriter] = {} + # Initialize ASR configuration service + self.asr_config_service: AsrConfigService | None = ( + AsrConfigServiceImpl( + self.asr_engine, + on_engine_update=self._set_asr_engine, + ) + if self.asr_engine + else None + ) + + # Initialize HuggingFace token service (requires UoW factory and crypto) + self.hf_token_service: HfTokenService | None = HfTokenServiceImpl( + uow_factory=self.create_uow, + crypto=self.crypto, + ) + + def _set_asr_engine(self, engine: FasterWhisperEngine) -> None: + """Update the active ASR engine reference for streaming.""" + self.asr_engine = engine + def _init_streaming_state(self) -> None: """Initialize per-meeting streaming state containers.""" self.vad_instances: dict[str, StreamingVad] = {} diff --git a/src/noteflow/infrastructure/asr/__init__.py b/src/noteflow/infrastructure/asr/__init__.py index 7470772..848a24d 100644 --- a/src/noteflow/infrastructure/asr/__init__.py +++ b/src/noteflow/infrastructure/asr/__init__.py @@ -10,7 +10,7 @@ from noteflow.infrastructure.asr.dto import ( VadEventType, WordTiming, ) -from noteflow.infrastructure.asr.engine import FasterWhisperEngine +from noteflow.infrastructure.asr.engine import FasterWhisperEngine, VALID_MODEL_SIZES from noteflow.infrastructure.asr.protocols import AsrEngine from noteflow.infrastructure.asr.segmenter import ( AudioSegment, @@ -37,6 +37,7 @@ __all__ = [ "SegmenterConfig", "SegmenterState", "StreamingVad", + "VALID_MODEL_SIZES", "VadEngine", "VadEvent", "VadEventType", diff --git a/tests/application/test_asr_config_service.py b/tests/application/test_asr_config_service.py new file mode 100644 index 0000000..e6a94b1 --- /dev/null +++ b/tests/application/test_asr_config_service.py @@ -0,0 +1,414 @@ +"""Unit tests for AsrConfigService. + +Tests cover: +- get_capabilities: Returns current ASR configuration and available options +- validate_configuration: Validates model size, device, and compute type +- start_reconfiguration: Starts background reconfiguration job +- get_job_status: Returns status of reconfiguration jobs +""" + +from __future__ import annotations + +import asyncio +import contextlib +from unittest.mock import MagicMock, patch +from uuid import UUID + +import pytest + +from noteflow.application.services.asr_config_service import ( + AsrComputeType, + AsrConfigJob, + AsrConfigService, + AsrDevice, +) +from noteflow.domain.constants.fields import ( + JOB_STATUS_COMPLETED, + JOB_STATUS_FAILED, +) + +# ============================================================================= +# Fixtures +# ============================================================================= + + +@pytest.fixture +def mock_asr_engine() -> MagicMock: + """Create mock ASR engine for testing.""" + engine = MagicMock() + engine.model_size = "base" + engine.device = "cpu" + engine.compute_type = "int8" + engine.is_loaded = True + engine.unload = MagicMock() + engine.load_model = MagicMock() + return engine + + +@pytest.fixture +def asr_config_service(mock_asr_engine: MagicMock) -> AsrConfigService: + """Create AsrConfigService with mock engine.""" + return AsrConfigService(asr_engine=mock_asr_engine) + + +@pytest.fixture +def asr_config_service_no_engine() -> AsrConfigService: + """Create AsrConfigService without engine.""" + return AsrConfigService(asr_engine=None) + + +# ============================================================================= +# get_capabilities tests +# ============================================================================= + + +def test_get_capabilities_returns_current_config( + asr_config_service: AsrConfigService, +) -> None: + """get_capabilities returns current ASR configuration.""" + with patch.object(asr_config_service, "detect_cuda_available", return_value=False): + caps = asr_config_service.get_capabilities() + + assert caps.model_size == "base", "model_size should be 'base' from engine" + assert caps.device == AsrDevice.CPU, "device should be CPU" + assert caps.compute_type == AsrComputeType.INT8, "compute_type should be INT8" + assert caps.is_ready is True, "is_ready should be True when engine is loaded" + assert caps.cuda_available is False, "cuda_available should be False" + assert "base" in caps.available_model_sizes, "available_model_sizes should include 'base'" + assert AsrComputeType.INT8 in caps.available_compute_types, "INT8 should be available" + + +def test_get_capabilities_no_engine_returns_defaults( + asr_config_service_no_engine: AsrConfigService, +) -> None: + """get_capabilities returns defaults when no engine.""" + with patch.object(asr_config_service_no_engine, "detect_cuda_available", return_value=False): + caps = asr_config_service_no_engine.get_capabilities() + + assert caps.model_size is None, "model_size should be None without engine" + assert caps.device == AsrDevice.CPU, "device should default to CPU" + assert caps.is_ready is False, "is_ready should be False without engine" + + +def test_get_capabilities_with_cuda_available( + asr_config_service: AsrConfigService, + mock_asr_engine: MagicMock, +) -> None: + """get_capabilities includes CUDA compute types when available.""" + mock_asr_engine.device = "cuda" + with patch.object(asr_config_service, "detect_cuda_available", return_value=True): + caps = asr_config_service.get_capabilities() + + assert caps.cuda_available is True, "cuda_available should be True when CUDA detected" + assert caps.device == AsrDevice.CUDA, "device should be CUDA" + assert AsrComputeType.FLOAT16 in caps.available_compute_types, ( + "FLOAT16 should be available for CUDA" + ) + + +# ============================================================================= +# validate_configuration tests +# ============================================================================= + + +def test_validate_configuration_valid_cpu_config( + asr_config_service: AsrConfigService, +) -> None: + """validate_configuration accepts valid CPU configuration.""" + with patch.object(asr_config_service, "detect_cuda_available", return_value=False): + error = asr_config_service.validate_configuration( + model_size="small", + device=AsrDevice.CPU, + compute_type=AsrComputeType.INT8, + ) + + assert error is None, "valid CPU configuration should not return an error" + + +def test_validate_configuration_invalid_model_size( + asr_config_service: AsrConfigService, +) -> None: + """validate_configuration rejects invalid model size.""" + error = asr_config_service.validate_configuration( + model_size="invalid-model", + device=None, + compute_type=None, + ) + + assert error is not None, "error should be set for invalid model" + assert "Invalid model size" in error, "error should mention invalid model size" + + +def test_validate_configuration_cuda_unavailable( + asr_config_service: AsrConfigService, +) -> None: + """validate_configuration rejects CUDA when unavailable.""" + with patch.object(asr_config_service, "detect_cuda_available", return_value=False): + error = asr_config_service.validate_configuration( + model_size=None, + device=AsrDevice.CUDA, + compute_type=None, + ) + + assert error is not None, "error should be set when CUDA unavailable" + assert "CUDA" in error, "error should mention CUDA" + + +def test_validate_configuration_invalid_compute_for_device( + asr_config_service: AsrConfigService, +) -> None: + """validate_configuration rejects invalid compute type for device.""" + error = asr_config_service.validate_configuration( + model_size=None, + device=AsrDevice.CPU, + compute_type=AsrComputeType.FLOAT16, # FLOAT16 not available for CPU + ) + + assert error is not None, "error should be set for invalid compute type" + assert "not available" in error, "error should mention unavailability" + + +def test_validate_configuration_none_values_accepted( + asr_config_service: AsrConfigService, +) -> None: + """validate_configuration accepts None values (keep current).""" + error = asr_config_service.validate_configuration( + model_size=None, + device=None, + compute_type=None, + ) + + assert error is None, "None values should be accepted for validation" + + +# ============================================================================= +# start_reconfiguration tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_start_reconfiguration_returns_job_id( + asr_config_service: AsrConfigService, +) -> None: + """start_reconfiguration returns job ID on success.""" + with patch.object(asr_config_service, "detect_cuda_available", return_value=False): + job_id, error = await asr_config_service.start_reconfiguration( + model_size="small", + device=None, + compute_type=None, + has_active_recordings=False, + ) + + assert job_id is not None, "job_id should be returned on success" + assert isinstance(job_id, UUID), "job_id should be a UUID" + assert error is None, "error should be None on success" + + # Clean up background task + job = asr_config_service.get_job_status(job_id) + assert job is not None, "job should exist after start_reconfiguration" + assert job.task is not None, "job task should be created" + job.task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await job.task + + +@pytest.mark.asyncio +async def test_start_reconfiguration_blocked_during_recording( + asr_config_service: AsrConfigService, +) -> None: + """start_reconfiguration is blocked while recordings are active.""" + job_id, error = await asr_config_service.start_reconfiguration( + model_size="small", + device=None, + compute_type=None, + has_active_recordings=True, + ) + + assert job_id is None, "job_id should be None when blocked" + assert error is not None, "error should be set when recordings active" + assert "recordings are active" in error, "error should explain why blocked" + + +@pytest.mark.asyncio +async def test_start_reconfiguration_no_engine( + asr_config_service_no_engine: AsrConfigService, +) -> None: + """start_reconfiguration fails when no engine available.""" + job_id, error = await asr_config_service_no_engine.start_reconfiguration( + model_size="small", + device=None, + compute_type=None, + has_active_recordings=False, + ) + + assert job_id is None, "job_id should be None without engine" + assert error is not None, "error should be set without engine" + assert "not available" in error, "error should explain unavailability" + + +@pytest.mark.asyncio +async def test_start_reconfiguration_validation_failure( + asr_config_service: AsrConfigService, +) -> None: + """start_reconfiguration fails on invalid configuration.""" + with patch.object(asr_config_service, "detect_cuda_available", return_value=False): + job_id, error = await asr_config_service.start_reconfiguration( + model_size="invalid-model", + device=None, + compute_type=None, + has_active_recordings=False, + ) + + assert job_id is None, "job_id should be None on validation failure" + assert error is not None, "error should be set on validation failure" + assert "Invalid model size" in error, "error should mention invalid model" + + +# ============================================================================= +# get_job_status tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_get_job_status_returns_job( + asr_config_service: AsrConfigService, +) -> None: + """get_job_status returns job info for valid ID.""" + with patch.object(asr_config_service, "detect_cuda_available", return_value=False): + job_id, _ = await asr_config_service.start_reconfiguration( + model_size="small", + device=None, + compute_type=None, + has_active_recordings=False, + ) + + assert job_id is not None, "job_id should be returned" + job = asr_config_service.get_job_status(job_id) + + assert job is not None, "job should be found for valid ID" + assert isinstance(job, AsrConfigJob), "job should be AsrConfigJob type" + assert job.target_model_size == "small", "target_model_size should match request" + + # Clean up + assert job.task is not None, "job task should be created" + job.task.cancel() + with contextlib.suppress(asyncio.CancelledError): + await job.task + + +def test_get_job_status_returns_none_for_unknown_id( + asr_config_service: AsrConfigService, +) -> None: + """get_job_status returns None for unknown job ID.""" + from uuid import uuid4 + + job = asr_config_service.get_job_status(uuid4()) + assert job is None, "job should be None for unknown ID" + + +# ============================================================================= +# detect_cuda_available tests +# ============================================================================= + + +def test_detect_cuda_available_with_cuda( + asr_config_service: AsrConfigService, +) -> None: + """detect_cuda_available returns True when CUDA is available.""" + mock_torch = MagicMock() + mock_torch.cuda.is_available.return_value = True + + with patch.dict("sys.modules", {"torch": mock_torch}): + result = asr_config_service.detect_cuda_available() + + assert result is True, "detect_cuda_available should return True when CUDA available" + + +def test_detect_cuda_available_no_cuda( + asr_config_service: AsrConfigService, +) -> None: + """detect_cuda_available returns False when CUDA is not available.""" + mock_torch = MagicMock() + mock_torch.cuda.is_available.return_value = False + + with patch.dict("sys.modules", {"torch": mock_torch}): + result = asr_config_service.detect_cuda_available() + + assert result is False, "detect_cuda_available should return False when CUDA unavailable" + + +# ============================================================================= +# reconfiguration behavior tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_reconfiguration_failure_keeps_active_engine( + mock_asr_engine: MagicMock, +) -> None: + """Reconfiguration failure should not replace or unload the active engine.""" + updates: list[MagicMock] = [] + asr_config_service = AsrConfigService( + asr_engine=mock_asr_engine, + on_engine_update=updates.append, + ) + new_engine = MagicMock() + + with ( + patch.object(asr_config_service, "_build_engine_for_job", return_value=(new_engine, True)), + patch.object(asr_config_service, "_load_model", side_effect=RuntimeError("boom")), + ): + job_id, error = await asr_config_service.start_reconfiguration( + model_size="small", + device=None, + compute_type=None, + has_active_recordings=False, + ) + + assert job_id is not None, "job should be created even if load fails" + assert error is None, "start_reconfiguration should not return an error on async failure" + + job = asr_config_service.get_job_status(job_id) + assert job is not None, "job should be retrievable" + assert job.task is not None, "job task should be created" + await job.task + + assert job.status == JOB_STATUS_FAILED, "job should be marked failed on load error" + mock_asr_engine.unload.assert_not_called() + assert updates == [], "engine update callback should not fire on failure" + + +@pytest.mark.asyncio +async def test_reconfiguration_success_swaps_engine( + mock_asr_engine: MagicMock, +) -> None: + """Successful reconfiguration should swap engine and unload the old one.""" + updates: list[MagicMock] = [] + asr_config_service = AsrConfigService( + asr_engine=mock_asr_engine, + on_engine_update=updates.append, + ) + new_engine = MagicMock() + + with ( + patch.object(asr_config_service, "_build_engine_for_job", return_value=(new_engine, True)), + patch.object(asr_config_service, "_load_model", return_value=None), + ): + job_id, error = await asr_config_service.start_reconfiguration( + model_size="small", + device=None, + compute_type=None, + has_active_recordings=False, + ) + + assert job_id is not None, "job should be created" + assert error is None, "no error should be returned for successful start" + + job = asr_config_service.get_job_status(job_id) + assert job is not None, "job should be retrievable" + assert job.task is not None, "job task should be created" + await job.task + + assert job.status == JOB_STATUS_COMPLETED, "job should complete successfully" + mock_asr_engine.unload.assert_called_once() + assert updates == [new_engine], "engine update callback should fire on success" diff --git a/tests/application/test_hf_token_service.py b/tests/application/test_hf_token_service.py new file mode 100644 index 0000000..35f9338 --- /dev/null +++ b/tests/application/test_hf_token_service.py @@ -0,0 +1,546 @@ +"""Unit tests for HfTokenService. + +Tests cover: +- set_token: Store and optionally validate a HuggingFace token +- get_status: Get current token configuration status +- delete_token: Remove stored token +- validate_stored_token: Validate the stored token against HuggingFace API +- get_token: Retrieve decrypted token +- Encryption/decryption roundtrip +""" + +from __future__ import annotations + +from unittest.mock import AsyncMock, MagicMock, patch + +import pytest + +from noteflow.application.services.hf_token_service import ( + HfTokenService, + HfValidationResult, +) + +# ============================================================================= +# Constants +# ============================================================================= + +# Sample timestamp for validation tests (2023-11-15 00:00:00 UTC) +SAMPLE_VALIDATION_TIMESTAMP = 1700000000.0 + +# ============================================================================= +# Fixtures +# ============================================================================= + + +@pytest.fixture +def mock_crypto() -> MagicMock: + """Create mock crypto box for testing.""" + crypto = MagicMock() + # Mock DEK generation and wrapping + crypto.generate_dek.return_value = b"mock_dek_16bytes" + crypto.wrap_dek.return_value = b"wrapped_dek_bytes" + crypto.unwrap_dek.return_value = b"mock_dek_16bytes" + + # Mock encryption + mock_encrypted = MagicMock() + mock_encrypted.nonce = b"nonce_12_bytes" + mock_encrypted.ciphertext = b"encrypted_token_data" + mock_encrypted.tag = b"tag_16_bytes_xx" + crypto.encrypt_chunk.return_value = mock_encrypted + + # Mock decryption + crypto.decrypt_chunk.return_value = b"hf_test_token_value" + + return crypto + + +@pytest.fixture +def mock_preferences() -> MagicMock: + """Create mock preferences repository.""" + prefs = MagicMock() + prefs.get = AsyncMock(return_value=None) + prefs.set = AsyncMock() + prefs.delete = AsyncMock(return_value=True) + return prefs + + +@pytest.fixture +def prefs_mock_uow(mock_preferences: MagicMock) -> MagicMock: + """Create mock unit of work with preferences support.""" + uow = MagicMock() + uow.supports_preferences = True + uow.preferences = mock_preferences + uow.commit = AsyncMock() + uow.__aenter__ = AsyncMock(return_value=uow) + uow.__aexit__ = AsyncMock(return_value=None) + return uow + + +@pytest.fixture +def hf_token_service(prefs_mock_uow: MagicMock, mock_crypto: MagicMock) -> HfTokenService: + """Create HfTokenService with mocks.""" + + def uow_factory() -> MagicMock: + return prefs_mock_uow + + return HfTokenService(uow_factory=uow_factory, crypto=mock_crypto) + + +@pytest.fixture +def hf_token_service_no_prefs(mock_crypto: MagicMock) -> HfTokenService: + """Create HfTokenService with UoW that doesn't support preferences.""" + uow = MagicMock() + uow.supports_preferences = False + uow.__aenter__ = AsyncMock(return_value=uow) + uow.__aexit__ = AsyncMock(return_value=None) + + def uow_factory() -> MagicMock: + return uow + + return HfTokenService(uow_factory=uow_factory, crypto=mock_crypto) + + +# ============================================================================= +# set_token tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_set_token_without_validation( + hf_token_service: HfTokenService, + prefs_mock_uow: MagicMock, +) -> None: + """set_token stores token without validation when validate=False.""" + success, result = await hf_token_service.set_token( + "hf_test_token", + validate=False, + ) + + assert success is True, "set_token should succeed" + assert result is None, "result should be None when validation skipped" + prefs_mock_uow.preferences.set.assert_called() + prefs_mock_uow.commit.assert_called_once() + + +@pytest.mark.asyncio +async def test_set_token_with_successful_validation( + hf_token_service: HfTokenService, + prefs_mock_uow: MagicMock, +) -> None: + """set_token validates and stores token when validate=True.""" + with patch.object( + hf_token_service, + "validate_token_internal", + return_value=HfValidationResult( + valid=True, + username="testuser", + error_message="", + ), + ): + success, result = await hf_token_service.set_token( + "hf_valid_token", + validate=True, + ) + + assert success is True, "set_token should succeed with valid token" + assert result is not None, "result should contain validation info" + assert result.valid is True, "validation should pass" + assert result.username == "testuser", "username should match" + prefs_mock_uow.commit.assert_called_once() + + +@pytest.mark.asyncio +async def test_set_token_with_failed_validation( + hf_token_service: HfTokenService, + prefs_mock_uow: MagicMock, +) -> None: + """set_token returns failure when validation fails.""" + with patch.object( + hf_token_service, + "validate_token_internal", + return_value=HfValidationResult( + valid=False, + username="", + error_message="Invalid or expired token", + ), + ): + success, result = await hf_token_service.set_token( + "hf_invalid_token", + validate=True, + ) + + assert success is False, "set_token should fail with invalid token" + assert result is not None, "result should contain validation info" + assert result.valid is False, "validation should fail" + assert "Invalid" in result.error_message, "error should explain failure" + prefs_mock_uow.commit.assert_not_called() + + +@pytest.mark.asyncio +async def test_set_token_no_preferences_support( + hf_token_service_no_prefs: HfTokenService, +) -> None: + """set_token returns failure when preferences storage is unavailable.""" + success, result = await hf_token_service_no_prefs.set_token( + "hf_test_token", + validate=False, + ) + + assert success is False, "set_token should fail without preferences support" + assert result is not None, "result should describe storage failure" + assert "not available" in result.error_message, "error should mention storage unavailability" + + +# ============================================================================= +# get_status tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_get_status_no_token_configured( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, +) -> None: + """get_status returns not configured when no token stored.""" + mock_preferences.get.return_value = None + + status = await hf_token_service.get_status() + + assert status.is_configured is False, "is_configured should be False" + assert status.is_validated is False, "is_validated should be False" + assert status.username == "", "username should be empty" + assert status.validated_at is None, "validated_at should be None" + + +@pytest.mark.asyncio +async def test_get_status_token_configured_with_metadata( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, +) -> None: + """get_status returns correct status when token is configured.""" + mock_preferences.get.side_effect = [ + {"wrapped_dek": "abc", "nonce": "def", "ciphertext": "ghi", "tag": "jkl"}, + {"username": "testuser", "is_validated": True, "validated_at": SAMPLE_VALIDATION_TIMESTAMP}, + ] + + status = await hf_token_service.get_status() + + assert status.is_configured is True, "is_configured should be True" + assert status.is_validated is True, "is_validated should be True" + assert status.username == "testuser", "username should match stored value" + assert status.validated_at == SAMPLE_VALIDATION_TIMESTAMP, ( + "validated_at should match stored value" + ) + + +@pytest.mark.asyncio +async def test_get_status_no_preferences_support( + hf_token_service_no_prefs: HfTokenService, +) -> None: + """get_status returns not configured when preferences not supported.""" + status = await hf_token_service_no_prefs.get_status() + + assert status.is_configured is False, "is_configured should be False without prefs" + assert status.is_validated is False, "is_validated should be False without prefs" + + +# ============================================================================= +# delete_token tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_delete_token_success( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, + prefs_mock_uow: MagicMock, +) -> None: + """delete_token removes token and returns True.""" + mock_preferences.delete.return_value = True + + result = await hf_token_service.delete_token() + + assert result is True, "delete_token should return True when token deleted" + prefs_mock_uow.commit.assert_called_once() + + +@pytest.mark.asyncio +async def test_delete_token_not_found( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, + prefs_mock_uow: MagicMock, +) -> None: + """delete_token returns False when no token exists.""" + mock_preferences.delete.return_value = False + + result = await hf_token_service.delete_token() + + assert result is False, "delete_token should return False when token missing" + prefs_mock_uow.commit.assert_called_once() + + +@pytest.mark.asyncio +async def test_delete_token_no_preferences_support( + hf_token_service_no_prefs: HfTokenService, +) -> None: + """delete_token returns False when preferences not supported.""" + result = await hf_token_service_no_prefs.delete_token() + + assert result is False, "delete_token should return False without prefs support" + + +# ============================================================================= +# validate_stored_token tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_validate_stored_token_success( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, + prefs_mock_uow: MagicMock, +) -> None: + """validate_stored_token validates and updates metadata.""" + mock_preferences.get.return_value = { + "wrapped_dek": "abc", + "nonce": "def", + "ciphertext": "ghi", + "tag": "jkl", + } + + with ( + patch.object( + hf_token_service, + "decrypt_token", + return_value="hf_test_token", + ), + patch.object( + hf_token_service, + "validate_token_internal", + return_value=HfValidationResult( + valid=True, + username="validuser", + error_message="", + ), + ), + ): + result = await hf_token_service.validate_stored_token() + + assert result.valid is True, "validation should succeed" + assert result.username == "validuser", "username should match validation result" + mock_preferences.set.assert_called_once() + prefs_mock_uow.commit.assert_called_once() + + +@pytest.mark.asyncio +async def test_validate_stored_token_no_token( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, +) -> None: + """validate_stored_token returns error when no token configured.""" + mock_preferences.get.return_value = None + + result = await hf_token_service.validate_stored_token() + + assert result.valid is False, "validation should fail when no token" + assert "No token configured" in result.error_message, "error should explain missing token" + + +@pytest.mark.asyncio +async def test_validate_stored_token_no_preferences_support( + hf_token_service_no_prefs: HfTokenService, +) -> None: + """validate_stored_token returns error when preferences not supported.""" + result = await hf_token_service_no_prefs.validate_stored_token() + + assert result.valid is False, "validation should fail without prefs" + assert "not available" in result.error_message, "error should explain unavailability" + + +@pytest.mark.asyncio +async def test_validate_stored_token_decrypt_failure( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, + prefs_mock_uow: MagicMock, +) -> None: + """validate_stored_token returns error when decryption fails.""" + mock_preferences.get.return_value = { + "wrapped_dek": "abc", + "nonce": "def", + "ciphertext": "ghi", + "tag": "jkl", + } + + with patch.object( + hf_token_service, + "decrypt_token", + side_effect=ValueError("bad token"), + ): + result = await hf_token_service.validate_stored_token() + + assert result.valid is False, "validation should fail when decryption fails" + assert "decryption" in result.error_message.lower(), ( + "error should mention decryption failure" + ) + mock_preferences.set.assert_not_called() + prefs_mock_uow.commit.assert_not_called() + + +# ============================================================================= +# get_token tests +# ============================================================================= + + +@pytest.mark.asyncio +async def test_get_token_returns_decrypted( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, +) -> None: + """get_token returns decrypted token when configured.""" + mock_preferences.get.return_value = { + "wrapped_dek": "abc", + "nonce": "def", + "ciphertext": "ghi", + "tag": "jkl", + } + + with patch.object( + hf_token_service, + "decrypt_token", + return_value="hf_test_token_value", + ): + token = await hf_token_service.get_token() + + assert token == "hf_test_token_value", "get_token should return decrypted token" + + +@pytest.mark.asyncio +async def test_get_token_returns_none_when_not_configured( + hf_token_service: HfTokenService, + mock_preferences: MagicMock, +) -> None: + """get_token returns None when no token configured.""" + mock_preferences.get.return_value = None + + token = await hf_token_service.get_token() + + assert token is None, "get_token should return None when not configured" + + +@pytest.mark.asyncio +async def test_get_token_no_preferences_support( + hf_token_service_no_prefs: HfTokenService, +) -> None: + """get_token returns None when preferences not supported.""" + token = await hf_token_service_no_prefs.get_token() + + assert token is None, "get_token should return None without prefs support" + + +# ============================================================================= +# Encryption roundtrip tests +# ============================================================================= + + +def test_encrypt_token_returns_expected_keys( + hf_token_service: HfTokenService, +) -> None: + """encrypt_token returns dict with required keys.""" + result = hf_token_service.encrypt_token("test_token") + + assert "wrapped_dek" in result, "wrapped_dek should be present in encrypted output" + assert "nonce" in result, "nonce should be present in encrypted output" + assert "ciphertext" in result, "ciphertext should be present in encrypted output" + assert "tag" in result, "tag should be present in encrypted output" + + +def test_decrypt_token_invalid_format( + hf_token_service: HfTokenService, +) -> None: + """decrypt_token raises ValueError for invalid format.""" + with pytest.raises(ValueError, match="Invalid encrypted data format"): + hf_token_service.decrypt_token("not_a_dict") + + +def test_decrypt_token_missing_keys( + hf_token_service: HfTokenService, +) -> None: + """decrypt_token raises ValueError for missing keys.""" + with pytest.raises(ValueError, match="Invalid encrypted data"): + hf_token_service.decrypt_token({"wrapped_dek": "abc"}) + + +# ============================================================================= +# validate_token_internal tests (mocked HTTP) +# ============================================================================= + + +@pytest.mark.asyncio +async def test_validate_token_internal_success( + hf_token_service: HfTokenService, +) -> None: + """validate_token_internal returns success for valid token.""" + mock_response = MagicMock() + mock_response.status_code = 200 + mock_response.json.return_value = {"name": "apiuser"} + + with patch("httpx.AsyncClient") as mock_client: + mock_client.return_value.__aenter__.return_value.get = AsyncMock(return_value=mock_response) + + result = await hf_token_service.validate_token_internal("hf_valid") + + assert result.valid is True, "token should be valid" + assert result.username == "apiuser", "username should match API response" + + +@pytest.mark.asyncio +async def test_validate_token_internal_unauthorized( + hf_token_service: HfTokenService, +) -> None: + """validate_token_internal returns failure for 401 response.""" + mock_response = MagicMock() + mock_response.status_code = 401 + + with patch("httpx.AsyncClient") as mock_client: + mock_client.return_value.__aenter__.return_value.get = AsyncMock(return_value=mock_response) + + result = await hf_token_service.validate_token_internal("hf_invalid") + + assert result.valid is False, "token should be invalid for 401" + assert "Invalid or expired" in result.error_message, "error should mention invalid token" + + +@pytest.mark.asyncio +async def test_validate_token_internal_timeout( + hf_token_service: HfTokenService, +) -> None: + """validate_token_internal handles timeout gracefully.""" + import httpx + + with patch("httpx.AsyncClient") as mock_client: + mock_client.return_value.__aenter__.return_value.get = AsyncMock( + side_effect=httpx.TimeoutException("timeout") + ) + + result = await hf_token_service.validate_token_internal("hf_token") + + assert result.valid is False, "timeout should return invalid result" + assert "timeout" in result.error_message.lower(), "error should mention timeout" + + +@pytest.mark.asyncio +async def test_validate_token_internal_connection_error( + hf_token_service: HfTokenService, +) -> None: + """validate_token_internal handles connection error gracefully.""" + import httpx + + with patch("httpx.AsyncClient") as mock_client: + mock_client.return_value.__aenter__.return_value.get = AsyncMock( + side_effect=httpx.RequestError("connection failed") + ) + + result = await hf_token_service.validate_token_internal("hf_token") + + assert result.valid is False, "connection error should return invalid result" + assert "Connection error" in result.error_message, "error should mention connection error" diff --git a/tests/integration/test_asr_config_grpc.py b/tests/integration/test_asr_config_grpc.py new file mode 100644 index 0000000..eacb477 --- /dev/null +++ b/tests/integration/test_asr_config_grpc.py @@ -0,0 +1,225 @@ +"""Integration tests for ASR configuration gRPC endpoints.""" + +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING, Final +from unittest.mock import MagicMock, patch +from uuid import UUID + +import pytest + +from noteflow.grpc.proto import noteflow_pb2 +from noteflow.grpc.service import NoteFlowServicer + +if TYPE_CHECKING: + from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker + +# ============================================================================ +# Test Constants +# ============================================================================ + +MODEL_BASE: Final[str] = "base" +MODEL_SMALL: Final[str] = "small" +DEVICE_CPU: Final[str] = "cpu" +COMPUTE_INT8: Final[str] = "int8" +INVALID_JOB_ID: Final[str] = "not-a-uuid" +ACTIVE_STREAM_ID: Final[str] = "meeting-active" +ERROR_ACTIVE_RECORDINGS: Final[str] = "Cannot reconfigure ASR while recordings are active" +ERROR_INVALID_JOB_ID: Final[str] = "Invalid job ID format" +PHASE_FAILED: Final[str] = "failed" +EMPTY_JOB_ID: Final[str] = "" + + +@pytest.fixture +def asr_engine_mock() -> MagicMock: + """Create mock ASR engine with CPU defaults.""" + engine = MagicMock() + engine.model_size = MODEL_BASE + engine.device = DEVICE_CPU + engine.compute_type = COMPUTE_INT8 + engine.is_loaded = True + engine.load_model = MagicMock() + engine.unload = MagicMock() + return engine + + +@pytest.fixture +async def asr_servicer( + session_factory: async_sessionmaker[AsyncSession], + meetings_dir: Path, + asr_engine_mock: MagicMock, +) -> NoteFlowServicer: + """Create servicer with ASR engine and database backing.""" + return NoteFlowServicer( + asr_engine=asr_engine_mock, + session_factory=session_factory, + meetings_dir=meetings_dir, + ) + + +async def _run_asr_update_and_wait( + servicer: NoteFlowServicer, + model_size: str, + context: MagicMock, +) -> str: + """Start an ASR update job and wait for completion.""" + service = servicer.asr_config_service + assert service is not None, "asr_config_service should be initialized" + + async def _load_model_stub(engine: MagicMock, size: str) -> None: + engine.model_size = size + + with patch.object(service, "_load_model", new=_load_model_stub): + response = await servicer.UpdateAsrConfiguration( + noteflow_pb2.UpdateAsrConfigurationRequest(model_size=model_size), + context, + ) + + assert response.accepted is True, "update should be accepted" + assert ( + response.status == noteflow_pb2.JOB_STATUS_QUEUED + ), "initial job status should be QUEUED" + assert response.job_id, "job_id should be returned for accepted request" + + job = service.get_job_status(UUID(response.job_id)) + assert job is not None, "job should be retrievable by id" + assert job.task is not None, "job task should be created" + await job.task + + return response.job_id + + +@pytest.mark.integration +class TestAsrConfigGrpc: + """Integration tests for ASR config gRPC handlers.""" + + async def test_get_asr_configuration_returns_engine_state( + self, + asr_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """GetAsrConfiguration reflects current engine configuration.""" + service = asr_servicer.asr_config_service + assert service is not None, "asr_config_service should be initialized" + + with patch.object(service, "detect_cuda_available", return_value=False): + response = await asr_servicer.GetAsrConfiguration( + noteflow_pb2.GetAsrConfigurationRequest(), + mock_grpc_context, + ) + + config = response.configuration + assert config.model_size == MODEL_BASE, "model_size should match engine" + assert ( + config.device == noteflow_pb2.ASR_DEVICE_CPU + ), "device should map to ASR_DEVICE_CPU" + assert ( + config.compute_type == noteflow_pb2.ASR_COMPUTE_TYPE_INT8 + ), "compute_type should map to ASR_COMPUTE_TYPE_INT8" + assert config.is_ready is True, "is_ready should reflect engine readiness" + assert config.cuda_available is False, "cuda_available should reflect detection" + assert ( + MODEL_BASE in config.available_model_sizes + ), "available_model_sizes should include current model" + assert ( + noteflow_pb2.ASR_COMPUTE_TYPE_INT8 in config.available_compute_types + ), "available_compute_types should include INT8" + + async def test_update_asr_configuration_completes_job_and_returns_new_config( + self, + asr_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """UpdateAsrConfiguration starts job and returns new configuration on completion.""" + job_id = await _run_asr_update_and_wait( + asr_servicer, + MODEL_SMALL, + mock_grpc_context, + ) + status_response = await asr_servicer.GetAsrConfigurationJobStatus( + noteflow_pb2.GetAsrConfigurationJobStatusRequest(job_id=job_id), + mock_grpc_context, + ) + + assert ( + status_response.status == noteflow_pb2.JOB_STATUS_COMPLETED + ), "job status should be COMPLETED after reload" + assert status_response.HasField("new_configuration"), ( + "new_configuration should be returned on completion" + ) + assert ( + status_response.new_configuration.model_size == MODEL_SMALL + ), "new_configuration should reflect updated model size" + + async def test_update_asr_configuration_rejects_when_active_recordings( + self, + asr_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """UpdateAsrConfiguration rejects while recordings are active.""" + asr_servicer.active_streams = {ACTIVE_STREAM_ID} + + response = await asr_servicer.UpdateAsrConfiguration( + noteflow_pb2.UpdateAsrConfigurationRequest(model_size=MODEL_SMALL), + mock_grpc_context, + ) + + assert response.accepted is False, "update should be rejected when active" + assert ( + response.status == noteflow_pb2.JOB_STATUS_FAILED + ), "status should be FAILED when rejected" + assert response.error_message == ERROR_ACTIVE_RECORDINGS, ( + "error_message should explain active recording rejection" + ) + assert response.job_id == EMPTY_JOB_ID, "job_id should be empty on rejection" + + async def test_get_asr_configuration_job_status_invalid_id( + self, + asr_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """GetAsrConfigurationJobStatus returns failure for invalid job ID.""" + response = await asr_servicer.GetAsrConfigurationJobStatus( + noteflow_pb2.GetAsrConfigurationJobStatusRequest(job_id=INVALID_JOB_ID), + mock_grpc_context, + ) + + assert ( + response.status == noteflow_pb2.JOB_STATUS_FAILED + ), "invalid job id should produce FAILED status" + assert response.phase == PHASE_FAILED, "phase should be failed for invalid job id" + assert response.error_message == ERROR_INVALID_JOB_ID, ( + "error_message should explain invalid job id format" + ) + + async def test_get_asr_configuration_when_service_unavailable( + self, + session_factory: async_sessionmaker[AsyncSession], + meetings_dir: Path, + mock_grpc_context: MagicMock, + ) -> None: + """GetAsrConfiguration returns empty configuration when ASR is unavailable.""" + servicer = NoteFlowServicer(session_factory=session_factory, meetings_dir=meetings_dir) + + response = await servicer.GetAsrConfiguration( + noteflow_pb2.GetAsrConfigurationRequest(), + mock_grpc_context, + ) + + config = response.configuration + assert config.model_size == "", "model_size should be empty when ASR unavailable" + assert ( + config.device == noteflow_pb2.ASR_DEVICE_UNSPECIFIED + ), "device should be unspecified when ASR unavailable" + assert ( + config.compute_type == noteflow_pb2.ASR_COMPUTE_TYPE_UNSPECIFIED + ), "compute_type should be unspecified when ASR unavailable" + assert config.is_ready is False, "is_ready should be False when ASR unavailable" + assert config.cuda_available is False, "cuda_available should be False by default" + assert ( + config.available_model_sizes == [] + ), "available_model_sizes should be empty when ASR unavailable" + assert ( + config.available_compute_types == [] + ), "available_compute_types should be empty when ASR unavailable" diff --git a/tests/integration/test_hf_token_grpc.py b/tests/integration/test_hf_token_grpc.py new file mode 100644 index 0000000..e3fe49c --- /dev/null +++ b/tests/integration/test_hf_token_grpc.py @@ -0,0 +1,259 @@ +"""Integration tests for HuggingFace token gRPC endpoints.""" + +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING, Final +from unittest.mock import MagicMock, patch + +import pytest + +from noteflow.application.services.hf_token_service import HfTokenService, HfValidationResult +from noteflow.grpc.proto import noteflow_pb2 +from noteflow.grpc.service import NoteFlowServicer +from noteflow.infrastructure.security.crypto import AesGcmCryptoBox + +if TYPE_CHECKING: + from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker + +# ============================================================================ +# Test Constants +# ============================================================================ + +TOKEN_VALUE: Final[str] = "hf_test_token" +TOKEN_VALUE_SECOND: Final[str] = "hf_second_token" +USERNAME_PRIMARY: Final[str] = "primary-user" +USERNAME_VALIDATED: Final[str] = "validated-user" +EMPTY_TOKEN: Final[str] = "" +EMPTY_USERNAME: Final[str] = "" +ERROR_EMPTY_TOKEN: Final[str] = "Token cannot be empty" +ZERO_FLOAT: Final[float] = 0.0 + + +@pytest.fixture +async def hf_token_servicer( + session_factory: async_sessionmaker[AsyncSession], + meetings_dir: Path, + crypto: AesGcmCryptoBox, +) -> NoteFlowServicer: + """Create servicer with HuggingFace token service using in-memory crypto.""" + servicer = NoteFlowServicer(session_factory=session_factory, meetings_dir=meetings_dir) + servicer.crypto = crypto + servicer.hf_token_service = HfTokenService(uow_factory=servicer.create_uow, crypto=crypto) + return servicer + + +async def _set_hf_token( + servicer: NoteFlowServicer, + token: str, + validate: bool, + context: MagicMock, +) -> noteflow_pb2.SetHuggingFaceTokenResponse: + """Invoke SetHuggingFaceToken for test helpers.""" + return await servicer.SetHuggingFaceToken( + noteflow_pb2.SetHuggingFaceTokenRequest(token=token, validate=validate), + context, + ) + + +async def _get_hf_status( + servicer: NoteFlowServicer, + context: MagicMock, +) -> noteflow_pb2.GetHuggingFaceTokenStatusResponse: + """Invoke GetHuggingFaceTokenStatus for test helpers.""" + return await servicer.GetHuggingFaceTokenStatus( + noteflow_pb2.GetHuggingFaceTokenStatusRequest(), + context, + ) + + +async def _validate_hf_token( + servicer: NoteFlowServicer, + context: MagicMock, +) -> noteflow_pb2.ValidateHuggingFaceTokenResponse: + """Invoke ValidateHuggingFaceToken for test helpers.""" + return await servicer.ValidateHuggingFaceToken( + noteflow_pb2.ValidateHuggingFaceTokenRequest(), + context, + ) + + +async def _delete_hf_token( + servicer: NoteFlowServicer, + context: MagicMock, +) -> noteflow_pb2.DeleteHuggingFaceTokenResponse: + """Invoke DeleteHuggingFaceToken for test helpers.""" + return await servicer.DeleteHuggingFaceToken( + noteflow_pb2.DeleteHuggingFaceTokenRequest(), + context, + ) + + +async def _set_unvalidated_token_and_assert( + servicer: NoteFlowServicer, + context: MagicMock, +) -> None: + """Set a token without validation and assert initial status.""" + set_response = await _set_hf_token( + servicer, + TOKEN_VALUE_SECOND, + False, + context, + ) + + assert set_response.success is True, "set token without validation should succeed" + + status_before = await _get_hf_status(servicer, context) + + assert status_before.is_configured is True, "token should be configured after set" + assert status_before.is_validated is False, "token should be unvalidated before validate" + assert status_before.username == EMPTY_USERNAME, "username should be empty before validate" + assert status_before.validated_at == ZERO_FLOAT, "validated_at should be unset before validate" + + +@pytest.mark.integration +class TestHuggingFaceTokenGrpc: + """Integration tests for HuggingFace token gRPC handlers.""" + + async def test_set_token_returns_validated_response( + self, + hf_token_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """SetHuggingFaceToken returns validated response when validation succeeds.""" + service = hf_token_servicer.hf_token_service + assert service is not None, "hf_token_service should be initialized" + + with patch.object( + service, + "validate_token_internal", + return_value=HfValidationResult( + valid=True, + username=USERNAME_PRIMARY, + error_message="", + ), + ): + response = await _set_hf_token( + hf_token_servicer, + TOKEN_VALUE, + True, + mock_grpc_context, + ) + + assert response.success is True, "set token should succeed" + assert response.valid is True, "validated token should return valid=True" + assert response.username == USERNAME_PRIMARY, "username should match validation" + + async def test_get_status_reflects_validated_token( + self, + hf_token_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """GetHuggingFaceTokenStatus reflects validated token metadata.""" + service = hf_token_servicer.hf_token_service + assert service is not None, "hf_token_service should be initialized" + + with patch.object( + service, + "validate_token_internal", + return_value=HfValidationResult( + valid=True, + username=USERNAME_PRIMARY, + error_message="", + ), + ): + set_response = await _set_hf_token( + hf_token_servicer, + TOKEN_VALUE, + True, + mock_grpc_context, + ) + + assert set_response.success is True, "set token should succeed" + + status = await _get_hf_status(hf_token_servicer, mock_grpc_context) + + assert status.is_configured is True, "status should indicate token configured" + assert status.is_validated is True, "status should indicate token validated" + assert status.username == USERNAME_PRIMARY, "status username should match" + assert status.validated_at > ZERO_FLOAT, "validated_at should be set" + + async def test_validate_stored_token_updates_status( + self, + hf_token_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """ValidateHuggingFaceToken updates status for stored token.""" + service = hf_token_servicer.hf_token_service + assert service is not None, "hf_token_service should be initialized" + await _set_unvalidated_token_and_assert(hf_token_servicer, mock_grpc_context) + + with patch.object( + service, + "validate_token_internal", + return_value=HfValidationResult( + valid=True, + username=USERNAME_VALIDATED, + error_message="", + ), + ): + validate_response = await _validate_hf_token( + hf_token_servicer, + mock_grpc_context, + ) + + assert validate_response.valid is True, "validate token should succeed" + assert validate_response.username == USERNAME_VALIDATED, "validated username should match" + + status_after = await _get_hf_status(hf_token_servicer, mock_grpc_context) + + assert status_after.is_validated is True, "status should be validated after validation" + assert status_after.username == USERNAME_VALIDATED, "status username should update" + assert status_after.validated_at > ZERO_FLOAT, "validated_at should be set after validate" + + async def test_delete_token_clears_status( + self, + hf_token_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """DeleteHuggingFaceToken removes token and resets status.""" + set_response = await _set_hf_token( + hf_token_servicer, + TOKEN_VALUE, + False, + mock_grpc_context, + ) + + assert set_response.success is True, "set token should succeed before delete" + + delete_response = await _delete_hf_token( + hf_token_servicer, + mock_grpc_context, + ) + + assert delete_response.success is True, "delete token should succeed" + + status = await _get_hf_status(hf_token_servicer, mock_grpc_context) + + assert status.is_configured is False, "token should be cleared after delete" + assert status.is_validated is False, "validation should reset after delete" + assert status.username == EMPTY_USERNAME, "username should be empty after delete" + assert status.validated_at == ZERO_FLOAT, "validated_at should reset after delete" + + async def test_set_token_rejects_empty_value( + self, + hf_token_servicer: NoteFlowServicer, + mock_grpc_context: MagicMock, + ) -> None: + """SetHuggingFaceToken rejects empty token values.""" + response = await _set_hf_token( + hf_token_servicer, + EMPTY_TOKEN, + True, + mock_grpc_context, + ) + + assert response.success is False, "empty token should be rejected" + assert response.validation_error == ERROR_EMPTY_TOKEN, ( + "validation_error should explain empty token rejection" + )