From 0c1dbb362f69ba381c17db1cade31d61cc0bb9d4 Mon Sep 17 00:00:00 2001 From: Travis Vasceannie Date: Wed, 14 Jan 2026 01:18:44 +0000 Subject: [PATCH] feat: add structured logging for persistence and export operations - Introduced logging for CRUD operations in repositories to enhance visibility into database interactions. - Implemented timing logs for BaseRepository and UnitOfWork lifecycle events to track performance. - Added export logging for size and duration without exposing sensitive content. - Promoted logging levels for specific operations to improve clarity and reduce noise in logs. - Established a framework for consistent logging practices across persistence and export functionalities. --- client | 2 +- .../sprint_logging_gap_remediation_p1.md | 168 + .../sprint_logging_gap_remediation_p2.md | 144 + docs/triage.md | 612 +- repomix.config.json | 2 +- scripts/ab_streaming_harness.py | 451 + .../services/streaming_config_persistence.py | 192 + src/noteflow/config/constants/__init__.py | 2 + src/noteflow/config/constants/domain.py | 3 + src/noteflow/config/settings/_main.py | 20 + src/noteflow/grpc/_mixins/__init__.py | 2 + src/noteflow/grpc/_mixins/_servicer_state.py | 4 + .../grpc/_mixins/meeting/_post_processing.py | 205 + .../grpc/_mixins/meeting/meeting_mixin.py | 103 +- .../grpc/_mixins/streaming/_partials.py | 7 +- src/noteflow/grpc/_mixins/streaming_config.py | 144 + src/noteflow/grpc/_service_mixins.py | 24 +- src/noteflow/grpc/proto/noteflow.proto | 59 + src/noteflow/grpc/proto/noteflow_pb2.py | 632 +- src/noteflow/grpc/proto/noteflow_pb2.pyi | 7792 +++++------------ src/noteflow/grpc/proto/noteflow_pb2_grpc.py | 89 +- src/noteflow/grpc/server/__init__.py | 25 +- src/noteflow/grpc/server/_services.py | 6 +- src/noteflow/grpc/server/_streaming_config.py | 65 + src/noteflow/grpc/server/_types.py | 2 + src/noteflow/grpc/service.py | 11 + tests/grpc/test_meeting_mixin.py | 1 + tests/grpc/test_sprint_15_1_critical_bugs.py | 27 +- 28 files changed, 4650 insertions(+), 6144 deletions(-) create mode 100644 docs/sprints/sprint_logging_gap_remediation_p1.md create mode 100644 docs/sprints/sprint_logging_gap_remediation_p2.md create mode 100644 scripts/ab_streaming_harness.py create mode 100644 src/noteflow/application/services/streaming_config_persistence.py create mode 100644 src/noteflow/grpc/_mixins/meeting/_post_processing.py create mode 100644 src/noteflow/grpc/_mixins/streaming_config.py create mode 100644 src/noteflow/grpc/server/_streaming_config.py diff --git a/client b/client index c1ebe8c..2a2449b 160000 --- a/client +++ b/client @@ -1 +1 @@ -Subproject commit c1ebe8cb53904505bb5dde1e82cf722c24b58191 +Subproject commit 2a2449be305321df5c52216af09f752f40ee1cf5 diff --git a/docs/sprints/sprint_logging_gap_remediation_p1.md b/docs/sprints/sprint_logging_gap_remediation_p1.md new file mode 100644 index 0000000..8457903 --- /dev/null +++ b/docs/sprints/sprint_logging_gap_remediation_p1.md @@ -0,0 +1,168 @@ +# Sprint: Logging Gap Remediation (P1 - Runtime/Inputs) + +> **Size**: M | **Owner**: Platform | **Prerequisites**: log_timing + get_logger already in place +> **Phase**: Observability - Runtime Diagnostics + +--- + +## Open Issues & Prerequisites + +> ⚠️ **Review Date**: 2026-01-03 — Verification complete, scope needs owner/priority confirmation. + +### Blocking Issues + +| ID | Issue | Status | Resolution | +|----|-------|--------|------------| +| **B1** | Log level policy for invalid input (warn vs info vs debug) | ✅ | WARN with redaction | +| **B2** | PII redaction rules for UUIDs and URLs in logs | Pending | Align with security guidance | + +### Design Gaps to Address + +| ID | Gap | Resolution | +|----|-----|------------| +| G1 | Stub-missing logs could be noisy in gRPC client mixins | Add rate-limited or once-per-session logging | +| G2 | Timing vs. count metrics for long-running CPU tasks | Standardize on `log_timing` + optional result_count | + +### Prerequisite Verification + +| Prerequisite | Status | Notes | +|--------------|--------|-------| +| `log_timing` helper available | ✅ | `src/noteflow/infrastructure/logging/timing.py` | +| `log_state_transition` available | ✅ | `src/noteflow/infrastructure/logging/transitions.py` | + +--- + +## Validation Status (2026-01-03) + +### RESOLVED SINCE TRIAGE + +| Component | Status | Notes | +|-----------|--------|-------| +| Ollama availability logging | Resolved | `src/noteflow/infrastructure/summarization/ollama_provider.py` uses `log_timing` | +| Cloud LLM API timing/logging | Resolved | `src/noteflow/infrastructure/summarization/cloud_provider.py` uses `log_timing` | +| Google Calendar request timing | Resolved | `src/noteflow/infrastructure/calendar/google_adapter.py` uses `log_timing` | +| OAuth refresh timing | Resolved | `src/noteflow/infrastructure/calendar/oauth_manager.py` uses `log_timing` | +| Webhook delivery start/finish | Resolved | `src/noteflow/infrastructure/webhooks/executor.py` info logs | +| Database engine + migrations | Resolved | `src/noteflow/infrastructure/persistence/database.py` info logs | +| Diarization full timing | Resolved | `src/noteflow/infrastructure/diarization/engine.py` uses `log_timing` | +| Diarization job timeout logging | Resolved | `src/noteflow/grpc/_mixins/diarization/_status.py` | +| Meeting state transitions | Resolved | `src/noteflow/application/services/meeting_service.py` | +| Streaming cleanup | Resolved | `src/noteflow/grpc/_mixins/streaming/_cleanup.py` | + +### NOT IMPLEMENTED + +| Component | Status | Notes | +|-----------|--------|-------| +| NER warmup timing/logs | Not implemented | `src/noteflow/application/services/ner_service.py` uses `run_in_executor` without logs | +| ASR `transcribe_async` timing | Not implemented | `src/noteflow/infrastructure/asr/engine.py` lacks duration/RTF logs | +| Segmenter state transitions | Not implemented | `src/noteflow/infrastructure/asr/segmenter.py` no transition logs | +| Silent UUID parsing (workspace) | Not implemented | `src/noteflow/grpc/_mixins/meeting.py` returns None on ValueError | +| Silent meeting-id parsing | Not implemented | `src/noteflow/grpc/_mixins/converters/_id_parsing.py` returns None on ValueError | +| Silent calendar datetime parsing | Not implemented | `src/noteflow/infrastructure/triggers/calendar.py` returns None on ValueError | +| Settings fallback logging | Not implemented | `_get_llm_settings`, `_get_webhook_settings`, `diarization_job_ttl_seconds` | +| gRPC client stub missing logs | Not implemented | `src/noteflow/grpc/_client_mixins/*.py` return None silently | +| Rust gRPC connection tracing | Not implemented | `client/src-tauri/src/grpc/client/core.rs` no start/finish timing | + +**Downstream impact**: Runtime visibility gaps for user-facing latency, failure diagnosis, and client connection issues. + +--- + +## Objective + +Close remaining high-impact logging gaps for runtime operations and input validation to reduce debugging time and improve failure diagnosis across Python gRPC services and the Tauri client. + +--- + +## Key Decisions + +| Decision | Choice | Rationale | +|----------|--------|-----------| +| **Timing utility** | Use `log_timing` | Consistent duration metrics and structured fields | +| **Invalid input logging** | Warn-level with redaction | Catch client errors without leaking sensitive data | +| **Stub-missing logging** | Rate-limited (once per client instance) | Avoid log spam while preserving visibility | + +--- + +## What Already Exists + +| Asset | Location | Implication | +|-------|----------|-------------| +| `log_timing` helper | `src/noteflow/infrastructure/logging/timing.py` | Use for executor + network timing | +| `log_state_transition` | `src/noteflow/infrastructure/logging/transitions.py` | Reuse for state-machine transitions | +| Existing log_timing usage | `ollama_provider.py`, `cloud_provider.py`, `google_adapter.py` | Follow established patterns | + +--- + +## Scope + +| Task | Effort | Notes | +|------|--------|-------| +| **Application Layer** | | | +| Add NER warmup + extraction timing logs | S | Use `log_timing` around `run_in_executor` | +| **Infrastructure Layer** | | | +| Add ASR `transcribe_async` duration + RTF logging | M | Include audio duration and model size | +| Add segmenter state transition logs | S | Use `log_state_transition` or structured info logs | +| Add settings fallback warning logs | S | `_get_llm_settings`, `_get_webhook_settings`, `diarization_job_ttl_seconds` | +| **API Layer** | | | +| Log invalid workspace UUID parsing (WARN + redaction) | S | `src/noteflow/grpc/_mixins/meeting.py` | +| Log invalid meeting_id parsing (WARN + redaction) | S | `src/noteflow/grpc/_mixins/converters/_id_parsing.py` | +| Log calendar datetime parse failures (WARN + redaction) | S | `src/noteflow/infrastructure/triggers/calendar.py` | +| gRPC client mixins log missing stub (rate-limited) | S | `src/noteflow/grpc/_client_mixins/*.py` | +| **Client Layer** | | | +| Add tracing for gRPC connect attempts | S | `client/src-tauri/src/grpc/client/core.rs` | + +**Total Effort**: M (2-4 hours) + +--- + +## Deliverables + +### Backend + +**Application Layer**: +- [ ] `src/noteflow/application/services/ner_service.py` — add warmup/extraction timing logs + +**Infrastructure Layer**: +- [ ] `src/noteflow/infrastructure/asr/engine.py` — log transcription duration + RTF +- [ ] `src/noteflow/infrastructure/asr/segmenter.py` — log state transitions +- [ ] `src/noteflow/infrastructure/summarization/cloud_provider.py` — log settings fallback +- [ ] `src/noteflow/infrastructure/webhooks/executor.py` — log settings fallback + +**API Layer**: +- [ ] `src/noteflow/grpc/_mixins/meeting.py` — log invalid workspace UUID parse (WARN + redaction) +- [ ] `src/noteflow/grpc/_mixins/converters/_id_parsing.py` — log invalid meeting_id parse (WARN + redaction) +- [ ] `src/noteflow/infrastructure/triggers/calendar.py` — log datetime parse errors (WARN + redaction) +- [ ] `src/noteflow/grpc/_client_mixins/*.py` — log missing stub (rate-limited) +- [ ] `src/noteflow/grpc/_mixins/diarization_job.py` — log settings fallback + +### Client + +- [ ] `client/src-tauri/src/grpc/client/core.rs` — log connection attempt duration + endpoint + +--- + +## Test Strategy + +### Core test cases + +- **Application**: `caplog` validates NER warmup logs appear when lazy-load path is taken +- **Infrastructure**: `caplog` validates ASR timing log fields include duration and audio length +- **API**: invalid UUID parsing emits warning and aborts/returns safely +- **Client**: basic unit test or log snapshot for connection start/failure paths + +--- + +## Quality Gates + +- [ ] Added logs use structured fields and follow existing logging patterns +- [ ] No new `# type: ignore` or `Any` introduced +- [ ] Targeted tests for new logging paths where practical +- [ ] `ruff check` + `mypy` pass (backend) +- [ ] `npm run lint:rs` pass (client) + +--- + +## Post-Sprint + +- [ ] Evaluate if logging should be sampled for high-frequency segmenter transitions +- [ ] Consider centralized log suppression for repeated invalid client inputs diff --git a/docs/sprints/sprint_logging_gap_remediation_p2.md b/docs/sprints/sprint_logging_gap_remediation_p2.md new file mode 100644 index 0000000..5317738 --- /dev/null +++ b/docs/sprints/sprint_logging_gap_remediation_p2.md @@ -0,0 +1,144 @@ +# Sprint: Logging Gap Remediation (P2 - Persistence/Exports) + +> **Size**: L | **Owner**: Platform | **Prerequisites**: P1 logging gaps resolved +> **Phase**: Observability - Data & Lifecycle + +--- + +## Open Issues & Prerequisites + +> ⚠️ **Review Date**: 2026-01-03 — Verification complete, scope needs prioritization. + +### Blocking Issues + +| ID | Issue | Status | Resolution | +|----|-------|--------|------------| +| **B1** | Log volume for repository CRUD operations | Pending | Decide sampling/level policy | +| **B2** | Sensitive data in repository logs | Pending | Redaction and field allowlist | + +### Design Gaps to Address + +| ID | Gap | Resolution | +|----|-----|------------| +| G1 | Consistent DB timing strategy across BaseRepository and UoW | Add `log_timing` helpers or per-method timing | +| G2 | Export logs should include size without dumping content | Log byte count + segment count only | + +### Prerequisite Verification + +| Prerequisite | Status | Notes | +|--------------|--------|-------| +| Logging helpers available | ✅ | `log_timing`, `get_logger` | +| State transition logger | ✅ | `log_state_transition` | + +--- + +## Validation Status (2026-01-03) + +### PARTIALLY IMPLEMENTED + +| Component | Status | Notes | +|-----------|--------|-------| +| DB migrations lifecycle logs | Partial | Migration start/end logged; repo/UoW still silent | +| Audio writer open logging | Partial | Open/flush errors logged, but thread lifecycle unlogged | + +### NOT IMPLEMENTED + +| Component | Status | Notes | +|-----------|--------|-------| +| BaseRepository query timing | Not implemented | `src/noteflow/infrastructure/persistence/repositories/_base.py` | +| UnitOfWork lifecycle logs | Not implemented | `src/noteflow/infrastructure/persistence/unit_of_work.py` | +| Repository CRUD logging | Not implemented | `meeting_repo.py`, `segment_repo.py`, `summary_repo.py`, etc. | +| Asset deletion no-op logging | Not implemented | `src/noteflow/infrastructure/persistence/repositories/asset_repo.py` | +| Export timing/logging | Not implemented | `pdf.py`, `markdown.py`, `html.py` | +| Diarization session close log level | Not implemented | `src/noteflow/infrastructure/diarization/session.py` uses debug | +| Background task lifecycle logs | Not implemented | `src/noteflow/grpc/_mixins/diarization/_jobs.py` task creation missing | + +**Downstream impact**: Limited visibility into DB performance, export latency, and lifecycle cleanup. + +--- + +## Objective + +Add structured logging for persistence, export, and lifecycle operations so DB performance issues and long-running exports are diagnosable without ad-hoc debugging. + +--- + +## Key Decisions + +| Decision | Choice | Rationale | +|----------|--------|-----------| +| **Repository logging level** | INFO for mutations, DEBUG for reads | Avoid log noise while capturing state changes | +| **Timing strategy** | `log_timing` around DB write batches | Consistent duration metrics without per-row spam | +| **Export logging** | Log sizes and durations only | Avoid dumping user content | + +--- + +## What Already Exists + +| Asset | Location | Implication | +|-------|----------|-------------| +| Migration logging | `src/noteflow/infrastructure/persistence/database.py` | Reuse for DB lifecycle logs | +| Log helpers | `src/noteflow/infrastructure/logging/*` | Standardize on structured logging | + +--- + +## Scope + +| Task | Effort | Notes | +|------|--------|-------| +| **Infrastructure Layer** | | | +| Add BaseRepository timing wrappers | M | `_execute_*` methods emit duration | +| Add UnitOfWork lifecycle logs | S | __aenter__/commit/rollback/exit | +| Add CRUD mutation logs in repositories | L | Create/Update/Delete summary logs | +| Add asset deletion no-op log | S | log when directory missing | +| Add export timing logs | M | PDF/Markdown/HTML export duration + size | +| Promote diarization session close to INFO | S | `session.py` | +| Log diarization job task creation | S | `grpc/_mixins/diarization/_jobs.py` | +| Add audio flush thread lifecycle logs | S | `infrastructure/audio/writer.py` | + +**Total Effort**: L (4-8 hours) + +--- + +## Deliverables + +### Backend + +**Infrastructure Layer**: +- [ ] `src/noteflow/infrastructure/persistence/repositories/_base.py` — timing logs for DB operations +- [ ] `src/noteflow/infrastructure/persistence/unit_of_work.py` — session/commit/rollback logs +- [ ] `src/noteflow/infrastructure/persistence/repositories/*_repo.py` — mutation logging +- [ ] `src/noteflow/infrastructure/persistence/repositories/asset_repo.py` — no-op delete log +- [ ] `src/noteflow/infrastructure/export/pdf.py` — duration + byte-size log +- [ ] `src/noteflow/infrastructure/export/markdown.py` — export count log +- [ ] `src/noteflow/infrastructure/export/html.py` — export count log +- [ ] `src/noteflow/infrastructure/diarization/session.py` — info-level close log +- [ ] `src/noteflow/grpc/_mixins/diarization/_jobs.py` — background task creation log +- [ ] `src/noteflow/infrastructure/audio/writer.py` — flush thread lifecycle logs + +--- + +## Test Strategy + +### Core test cases + +- **Repositories**: `caplog` validates mutation logging for create/update/delete +- **UnitOfWork**: log emitted on commit/rollback paths +- **Exports**: ensure logs include duration and output size (bytes/segments) +- **Lifecycle**: diarization session close emits info log + +--- + +## Quality Gates + +- [ ] Logging includes structured fields and avoids payload content +- [ ] No new `# type: ignore` or `Any` introduced +- [ ] `pytest` passes for touched modules +- [ ] `ruff check` + `mypy` pass + +--- + +## Post-Sprint + +- [ ] Assess performance impact of repo timing logs +- [ ] Consider opt-in logging for high-volume read paths diff --git a/docs/triage.md b/docs/triage.md index 034d7c4..d4cb9b0 100644 --- a/docs/triage.md +++ b/docs/triage.md @@ -1,165 +1,555 @@ -According to a document from **January 3, 2026** (your `repomix-output.md` snapshot), there are several concrete places where your **Python gRPC backend (`src/`)** and your **frontend (React `client/src` + Tauri `client/src-tauri`)** can be “correct but not actually wired together,” which would exactly match your symptom: *the Docker backend never shows logs that look like they were triggered by the Tauri client*. +# Technical Debt Triage -Below is a “where it breaks / why / what to fix” checklist, with the most likely root causes first. +This document tracks known issues, technical debt, and areas needing improvement. --- -## 1) Your Tauri recording pipeline can start without ever connecting to the backend +## Insufficient Logging - Comprehensive Audit -### What I see +**Discovered:** 2025-12-31 +**Last Verified:** 2026-01-03 +**Sprint Docs:** +- `docs/sprints/sprint_logging_gap_remediation_p1.md` +- `docs/sprints/sprint_logging_gap_remediation_p2.md` -* The Tauri command `start_recording` calls `stream_manager.start_streaming(meeting_id, app)` but does **not** ensure a gRPC connection exists before doing so. There is no `grpc_client.connect(...)` in that visible code path. -* `StreamManager::setup_streaming` immediately does `let mut grpc_client = self.client.get_client()?;` and then calls `.stream_transcription(...)` on it. -* `GrpcClient::get_client()` returns `Error::NotConnected` if there is no internal client/channel. - -### Why that explains “no backend logs” - -If the React side doesn’t explicitly call the Tauri `connect` command *before* starting a recording, the streaming setup fails locally with `NotConnected` and **no TCP connection is ever attempted**, so your Docker backend sees nothing (therefore no logs). - -### Fix - -Pick one (I’d do both #1 + #2): - -1. **Frontend guarantee:** In the UI flow where you start recording, force an `await api.connect(serverUrl)` (or connect-on-startup), and block recording UI until connected. - -2. **Backend guarantee in Rust:** Make `start_recording` auto-connect if needed: - -* If `!state.grpc_client.is_connected()`, call `state.grpc_client.connect(None).await?` before `start_streaming`. - -Also ensure you surface the Tauri connect error event in the UI (see #4). The connect command emits error info when it fails. +**Impact:** Caused ~1 hour of debugging when Ollama 120s timeout appeared as migration hang +**Total Issues Found:** 100+ --- -## 2) You have mock/simulated paths that can completely bypass the backend +## 1. Network/External Service Connections -### What I see +### 1.1 CRITICAL: Ollama Availability Check - Silent 120s Timeout -* `initializeAPI` imports both `cachedAPI` and `mockAPI`. -* Your preferences model includes `simulate_transcription?: boolean`. -* There is a `MockTranscriptionStream` whose `send(_chunk)` is literally a no-op (so audio you “send” goes nowhere). +**File:** `src/noteflow/infrastructure/summarization/ollama_provider.py:101-115` -### Why that explains “no backend logs” +```python +@property +def is_available(self) -> bool: + try: + client = self._get_client() + client.list() # Silent 120-second timeout! + return True + except (ConnectionError, TimeoutError, ...): + return False +``` -If your Tauri build ever selects `mockAPI` (or a simulated transcription mode) instead of the real Tauri→Rust→gRPC flow, the UI can appear to function while **never touching the Docker backend**. +**Status (2026-01-03):** Resolved — `log_timing` added around availability check. -### Fix - -* Make the active API implementation extremely explicit at runtime (log it in the UI console + show a dev badge). -* In Tauri builds, ensure `initializeAPI` never picks `mockAPI` unless you intentionally enable it. -* Default `simulate_transcription` to `false` in production builds, and make it obvious when enabled. +**Fix:** +```python +@property +def is_available(self) -> bool: + try: + logger.info("Checking Ollama availability at %s (timeout: %.0fs)...", self._host, self._timeout) + client = self._get_client() + client.list() + logger.info("Ollama server is available") + return True + except TimeoutError: + logger.warning("Ollama server timeout at %s after %.0fs", self._host, self._timeout) + return False + except (ConnectionError, RuntimeError, OSError) as e: + logger.debug("Ollama server unreachable at %s: %s", self._host, e) + return False +``` --- -## 3) Your “source of truth” for server host/port is scattered and easy to mis-point +### 1.2 Cloud Summarization API Calls - No Request Logging -### What I see (multiple defaults) +**File:** `src/noteflow/infrastructure/summarization/cloud_provider.py:238-282` -Backend/Python side: +```python +def _call_openai(self, user_prompt: str, system_prompt: str) -> tuple[str, int | None]: + try: + response = client.chat.completions.create(...) # No timing logged + except TimeoutError as e: + raise SummarizationTimeoutError(...) # No duration logged +``` -* Default host/port are `"localhost"` and `50051`. -* The server binds to an IPv6-any address: `address = f"[::]:{self._port}"` (and `add_insecure_port(address)`). +**Status (2026-01-03):** Resolved — `log_timing` wraps OpenAI/Anthropic calls and response logging added. -Tauri/Rust side: - -* Default saved preferences are `server_host: "localhost"`, `server_port: "50051"`. -* There’s also an env-var override `NOTEFLOW_SERVER_ADDRESS`. -* There is a test that expects the normalized default URL `http://localhost:50051`. - -### Where this breaks in Docker + desktop apps - -* **Docker port publish:** `localhost:50051` only works if your container publishes that port to the host (`-p 50051:50051`). -* **IPv6 “localhost” gotcha:** Many systems resolve `localhost` to `::1` first. Docker port publishing is not consistently reachable over IPv6 on all platforms/configs. Your backend binding is IPv6-friendly inside the container, but the *host-side published port* may still be IPv4-only depending on OS/Docker. (This is a common “it works in one place but not another” cause.) - -### Fix - -* For debugging, set the client host explicitly to **`127.0.0.1`** instead of `localhost` (or try both). -* Consider changing the Python server bind from `[::]:port` to `0.0.0.0:port` for simpler cross-platform Docker port publishing. -* Make the Tauri UI show the exact URL it is attempting and whether it’s coming from preferences vs env var. +**Fix:** Add `logger.info("Initiating OpenAI API call: model=%s", self._model)` before call, log duration after. --- -## 4) Connection and streaming events must match *exactly*, or the UI won’t reflect reality +### 1.3 Google Calendar API - No Request Logging -### What I see +**File:** `src/noteflow/infrastructure/calendar/google_adapter.py:76-91` -* The connect command emits a connection change event and emits error info on failure. -* Streaming emits events using **string literals** `"transcript_update"` and `"stream_health"`. -* The JS side has a Tauri adapter that imports `TauriCommands` and `TauriEvents` from `tauri-constants`. -* The cached adapter references a `startTauriEventBridge` and checks `isTauriEnvironment`. +```python +async with httpx.AsyncClient() as client: + response = await client.get(url, params=params, headers=headers) # No logging +``` -### Why that matters +**Status (2026-01-03):** Resolved — request timing logged via `log_timing`. -Even if gRPC is working, if your frontend isn’t listening to the *actual* event names being emitted, you’ll see “nothing happens,” and you’ll likely never trigger downstream actions that depend on “connected/streaming” state. - -### Fix - -* Start the Tauri event bridge **immediately** on app boot in Tauri mode (not lazily after some UI action). -* Put all event names in one canonical place and generate them (avoid “string literal in Rust” vs “enum in TS”). +**Fix:** Log request start, duration, and response status. --- -## 5) Some “expected backend activity” won’t exist because identity/workspace is local-only +### 1.4 OAuth Token Refresh - Missing Timing -### What I see +**File:** `src/noteflow/infrastructure/calendar/oauth_manager.py:211-222` -Your Tauri identity/workspace commands do not call the backend; they read/write local state: +```python +async def refresh_tokens(...) -> OAuthTokens: + response = await client.post(token_url, data=data) # No timing +``` -* `get_current_user`, `list_workspaces`, `switch_workspace` are local to Tauri state. - -### Why that matters - -If you’re using UI actions like “switch workspace” as your “did the backend get hit?” indicator: it won’t. Those actions never touch Docker. +**Status (2026-01-03):** Resolved — refresh timing logged via `log_timing`. --- -## 6) Backend identity interceptor expects metadata your Rust client may not send +### 1.5 Webhook Delivery - Missing Initial Request Log -### What I see +**File:** `src/noteflow/infrastructure/webhooks/executor.py:107-237` -Backend interceptor looks for metadata keys like: +```python +async def deliver(...) -> WebhookDelivery: + for attempt in range(1, max_retries + 1): + _logger.debug("Webhook delivery attempt %d/%d", attempt, max_retries) # DEBUG only +``` -* `"x-user-id"`, `"x-workspace-id"`, `"x-request-id"` - -### Why it matters - -If your backend’s logging or routing relies on those headers, and the Tauri client never attaches them, you could end up with: - -* missing context in logs, or -* backend rejecting calls (depending on how the interceptor/handlers behave beyond the snippet). - -### Fix - -If you intend to use those headers: - -* Add a tonic interceptor on the Rust client to inject them into every request (from the local identity/workspace state). +**Status (2026-01-03):** Resolved — info log at delivery start + completion. --- -## 7) You may be expecting “per-RPC logs” that the backend simply doesn’t emit +### 1.6 Database Connection Creation - No Logging -From the Python server snippet we can see it binds and starts, but nothing shown indicates a “log each RPC method call” interceptor. +**File:** `src/noteflow/infrastructure/persistence/database.py:85-116` -So it’s possible your Tauri app *is* hitting the backend and you still see “no logs,” unless your service methods log. +```python +def create_engine_and_session_factory(...): + engine = sa_create_async_engine(database_url, pool_size=pool_size, ...) + # No logging of connection parameters +``` -### Fix - -Temporarily add a server interceptor that logs: - -* method name -* peer address -* status code -* duration - -That’s the fastest way to confirm traffic. +**Status (2026-01-03):** Resolved — engine creation logged with masked URL. --- -## The “most likely” single root cause given your symptom +### 1.7 Rust gRPC Client Connection - No Tracing -If I had to bet based strictly on the code: **you’re starting recording/streaming without ever calling `connect` first**, and because `get_client()` hard-fails with `NotConnected`, the backend never sees any traffic. +**File:** `client/src-tauri/src/grpc/client/core.rs:174-197` -The second most likely is: **your Tauri app is using `mockAPI` / simulated transcription** (or something like `cachedAPI` in a mode that doesn’t actually call into the Rust commands), so there’s simply nothing to log. +```rust +async fn perform_connect(&self) -> Result { + let channel = endpoint.connect().await // No tracing before/after + .map_err(|e| Error::Connection(...))?; +``` + +**Status (2026-01-03):** Not implemented — see P1 sprint. --- -If you want, I can also produce a **concrete “call graph”** from “User clicks Start Recording” → TS API method → Tauri invoke command string → Rust command → gRPC RPC name, but your repomix snapshot elides large bodies of the TS adapters (so I can’t see the actual `invoke(...)` command strings). The big wiring issues above are still valid and are enough to explain “no backend logs” by themselves. +## 2. Blocking/Long-Running Operations + +### 2.1 NER Service - Silent Model Warmup + +**File:** `src/noteflow/application/services/ner_service.py:185-197` + +```python +await loop.run_in_executor( + None, + lambda: self._ner_engine.extract("warm up"), # No logging +) +``` + +**Status (2026-01-03):** Not implemented — see P1 sprint. + +--- + +### 2.2 ASR Transcription - No Duration Logging + +**File:** `src/noteflow/infrastructure/asr/engine.py:156-177` + +```python +async def transcribe_async(...) -> list[AsrResult]: + return await loop.run_in_executor(None, ...) # No timing +``` + +**Status (2026-01-03):** Not implemented — see P1 sprint. + +--- + +### 2.3 Diarization - Missing Blocking Operation Logging + +**File:** `src/noteflow/infrastructure/diarization/engine.py:299-347` + +```python +def diarize_full(...) -> Sequence[SpeakerTurn]: + logger.debug("Running offline diarization on %.2fs audio", ...) # DEBUG only + annotation = self._offline_pipeline(waveform, ...) # No end logging +``` + +**Status (2026-01-03):** Resolved — `log_timing` wraps diarization. + +--- + +### 2.4 Diarization Job Timeout - No Pre-Timeout Context + +**File:** `src/noteflow/grpc/_mixins/diarization/_jobs.py:173-186` + +```python +async with asyncio.timeout(DIARIZATION_TIMEOUT_SECONDS): + updated_count = await self.refine_speaker_diarization(...) +# No logging of timeout value before entering block +``` + +**Status (2026-01-03):** Resolved — timeout value logged in job handler. + +--- + +## 3. Error Handling - Silent Failures + +### 3.1 Silent ValueError Returns + +**Files:** +- `src/noteflow/grpc/_mixins/meeting.py:64-67` - workspace UUID parse +- `src/noteflow/grpc/_mixins/converters.py:76-79` - meeting ID parse +- `src/noteflow/grpc/_mixins/diarization/_jobs.py:84-87` - meeting ID validation +- `src/noteflow/infrastructure/triggers/calendar.py:141-144` - datetime parse + +```python +try: + UUID(workspace_id) +except ValueError: + return None # Silent failure, no logging +``` + +**Status (2026-01-03):** Not implemented — add WARN + redaction (P1 sprint). + +--- + +### 3.2 Silent Settings Fallbacks + +**Files:** +- `src/noteflow/infrastructure/webhooks/executor.py:56-65` +- `src/noteflow/infrastructure/summarization/ollama_provider.py:44-48` +- `src/noteflow/infrastructure/summarization/cloud_provider.py:48-52` +- `src/noteflow/grpc/_mixins/diarization_job.py:63-66` + +```python +except Exception: + return DEFAULT_VALUES # No logging that fallback occurred +``` + +**Status (2026-01-03):** Not implemented — add warning logs (P1 sprint). + +--- + +### 3.3 gRPC Client Stub Unavailable - Silent Returns + +**Files:** `src/noteflow/grpc/_client_mixins/*.py` (multiple locations) + +```python +if not self._stub: + return None # No logging of connection issue +``` + +**Status (2026-01-03):** Not implemented — add rate-limited warn log (P1 sprint). + +--- + +## 4. State Transitions and Lifecycle + +### 4.1 Meeting State Changes Not Logged + +**Status (2026-01-03):** Resolved — meeting service logs transitions. + +--- + +### 4.2 Diarization Job State - Missing Previous State + +**File:** `src/noteflow/grpc/_mixins/diarization/_jobs.py:147-171` + +```python +await repo.diarization_jobs.update_status(job_id, JOB_STATUS_RUNNING, ...) +**Status (2026-01-03):** Resolved — state transitions logged. +``` + +--- + +### 4.3 Segmenter State Machine - No Transition Logging + +**File:** `src/noteflow/infrastructure/asr/segmenter.py:121-127` + +```python +if is_speech: + self._state = SegmenterState.SPEECH # No logging of IDLE -> SPEECH +``` + +**Status (2026-01-03):** Not implemented — see P1 sprint. + +--- + +### 4.4 Stream Cleanup - No Logging + +**File:** `src/noteflow/grpc/_mixins/streaming/_cleanup.py:14-34` + +```python +def cleanup_stream_resources(host, meeting_id): + # Multiple cleanup operations, no completion log + host._active_streams.discard(meeting_id) +``` + +--- + +### 4.5 Diarization Session Close - DEBUG Only + +**File:** `src/noteflow/infrastructure/diarization/session.py:145-159` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +```python +def close(self) -> None: + logger.debug("Session %s closed", self.meeting_id) # Should be INFO +``` + +--- + +### 4.6 Background Task Spawning - No Task ID + +**File:** `src/noteflow/grpc/_mixins/diarization/_jobs.py:130-132` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +```python +task = asyncio.create_task(self._run_diarization_job(job_id, num_speakers)) +self._diarization_tasks[job_id] = task # No logging of task creation +``` + +--- + +### 4.7 Audio Flush Thread - No Start/End Logging + +**File:** `src/noteflow/infrastructure/audio/writer.py:135-157` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +```python +self._flush_thread.start() # No logging +# ... +def _periodic_flush_loop(self): + while not self._stop_flush.wait(...): + # No entry/exit logging for loop +``` + +--- + +## 5. Database Operations + +### 5.1 BaseRepository - No Query Timing + +**File:** `src/noteflow/infrastructure/persistence/repositories/_base.py` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +All methods (`_execute_scalar`, `_execute_scalars`, `_add_and_flush`, `_delete_and_flush`, `_add_all_and_flush`, `_execute_update`, `_execute_delete`) have no timing or logging. + +--- + +### 5.2 Unit of Work - No Transaction Logging + +**File:** `src/noteflow/infrastructure/persistence/unit_of_work.py:220-296` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + + +--- + +### 5.3 Repository CRUD Operations - No Logging + +**Files:** +- `meeting_repo.py` - create, update, delete, list_all +- `segment_repo.py` - add_batch, update_embedding, update_speaker +- `summary_repo.py` - save (upsert with cascades) +- `diarization_job_repo.py` - create, mark_running_as_failed, prune_completed +- `entity_repo.py` - save_batch, delete_by_meeting +- `webhook_repo.py` - create, add_delivery +- `integration_repo.py` - set_secrets +- `usage_event_repo.py` - add_batch, delete_before +- `preferences_repo.py` - set_bulk + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +--- + +## 6. File System Operations + +### 6.1 Meeting Directory Creation - Not Logged + +**File:** `src/noteflow/infrastructure/audio/writer.py:109-111` + +**Status (2026-01-03):** Resolved — audio writer open logs meeting and dir. + +```python +self._meeting_dir.mkdir(parents=True, exist_ok=True) # No logging +``` + +--- + +### 6.2 Manifest Read/Write - Not Logged + +**File:** `src/noteflow/infrastructure/audio/writer.py:122-123` + +**Status (2026-01-03):** Partially implemented — open logged, manifest write still unlogged (P2 sprint). + +```python +manifest_path.write_text(json.dumps(manifest, indent=2)) # No logging +``` + +--- + +### 6.3 Asset Deletion - Silent No-Op + +**File:** `src/noteflow/infrastructure/persistence/repositories/asset_repo.py:49-51` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +```python +if meeting_dir.exists(): + shutil.rmtree(meeting_dir) + logger.info("Deleted meeting assets at %s", meeting_dir) +# No log when directory doesn't exist +``` + +--- + +## 7. Export Operations + +### 7.1 PDF Export - No Timing + +**File:** `src/noteflow/infrastructure/export/pdf.py:161-186` + +```python +def export(self, meeting, segments) -> bytes: + pdf_bytes = weasy_html(string=html_content).write_pdf() # No timing + return pdf_bytes +``` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +--- + +### 7.2 Markdown/HTML Export - No Logging + +**Files:** `markdown.py:37-89`, `html.py:158-187` + +**Status (2026-01-03):** Not implemented — see P2 sprint. + +No logging of export operations. + +--- + +## 8. Initialization Sequences + +### 8.1 Lazy Model Loading - Not Logged at Load Time + +**Files:** +- `NerEngine._ensure_loaded()` - spaCy model load +- `DiarizationEngine` - pyannote model load +- `OllamaSummarizer._get_client()` - client creation + +**Status (2026-01-03):** Partially implemented — some model loads logged, NER warmup not logged (P1 sprint). + +--- + +### 8.2 Singleton Creation - Silent + +**File:** `src/noteflow/infrastructure/metrics/collector.py:168-178` + +**Status (2026-01-03):** Not implemented — out of P1/P2 scope unless needed. + +```python +def get_metrics_collector() -> MetricsCollector: + global _metrics_collector + if _metrics_collector is None: + _metrics_collector = MetricsCollector() # No logging + return _metrics_collector +``` + +--- + +### 8.3 Provider Registration - DEBUG Level + +**File:** `src/noteflow/application/services/summarization_service.py:119-127` + +**Status (2026-01-03):** Partially implemented — still debug in factory registration; consider if INFO needed. + +```python +def register_provider(self, mode, provider): + logger.debug("Registered %s provider", mode.value) # Should be INFO at startup +``` + +--- + +## Summary Statistics + +| Category | Issue Count | Severity | +|----------|-------------|----------| +| Network/External Services | 7 | CRITICAL (mostly resolved) | +| Blocking/Long-Running | 4 | HIGH (partially unresolved) | +| Error Handling | 10+ | HIGH (partially unresolved) | +| State Transitions | 7 | MEDIUM (partially unresolved) | +| Database Operations | 30+ | MEDIUM (unresolved) | +| File System | 3 | LOW (partially unresolved) | +| Export | 3 | LOW (unresolved) | +| Initialization | 5 | MEDIUM (partially unresolved) | +| **Total** | **100+** | - | + +--- + +## Recommended Logging Pattern + +For all async/blocking operations: + +```python +logger.info("Starting : context=%s", context) +start = time.perf_counter() +try: + result = await some_operation() + elapsed_ms = (time.perf_counter() - start) * 1000 + logger.info(" completed: result_count=%d, duration_ms=%.2f", len(result), elapsed_ms) +except TimeoutError: + elapsed_ms = (time.perf_counter() - start) * 1000 + logger.error(" timeout after %.2fms", elapsed_ms) + raise +except Exception as e: + elapsed_ms = (time.perf_counter() - start) * 1000 + logger.error(" failed after %.2fms: %s", elapsed_ms, e) + raise +``` + +--- + +## Priority Fixes + +### P0 - Fix Immediately +1. (Resolved) Ollama `is_available` timeout logging +2. (Resolved) Summarization factory timing +3. (Resolved) Database migration progress logging + +### P1 - Fix This Sprint +4. (Resolved) All external HTTP calls (calendar, OAuth, webhooks) +5. All `run_in_executor` calls (ASR, NER, diarization) +6. Silent ValueError returns + +### P2 - Fix Next Sprint +7. Repository CRUD logging +8. State transition logging (segmenter + diarization session) +9. Background task lifecycle logging + +--- + +## Resolved Issues + +- ~~Server-side state volatility~~ → Diarization jobs persisted to DB +- ~~Hardcoded directory paths~~ → `asset_path` column added to meetings +- ~~Synchronous blocking in async gRPC~~ → `run_in_executor` for diarization +- ~~Summarization consent not persisted~~ → Stored in `user_preferences` table +- ~~VU meter update throttling~~ → 20fps throttle implemented +- ~~Webhook infrastructure missing~~ → Full webhook subsystem implemented +- ~~Integration/OAuth token storage~~ → `IntegrationSecretModel` for secure storage diff --git a/repomix.config.json b/repomix.config.json index 078eb9a..02b1de1 100644 --- a/repomix.config.json +++ b/repomix.config.json @@ -12,7 +12,7 @@ "files": true, "removeComments": true, "removeEmptyLines": true, - "compress": false, + "compress": true, "topFilesLength": 5, "showLineNumbers": true, "truncateBase64": false, diff --git a/scripts/ab_streaming_harness.py b/scripts/ab_streaming_harness.py new file mode 100644 index 0000000..5c59031 --- /dev/null +++ b/scripts/ab_streaming_harness.py @@ -0,0 +1,451 @@ +#!/usr/bin/env python3 +"""A/B harness for streaming configuration latency and WER comparisons.""" + +from __future__ import annotations + +import argparse +import json +import re +import threading +import time +import wave +from dataclasses import dataclass +from pathlib import Path +from typing import TYPE_CHECKING, Iterable, Protocol, cast + +import numpy as np +from numpy.typing import NDArray + +from noteflow.config.settings import get_settings +from noteflow.grpc.client import NoteFlowClient +from noteflow.grpc.proto import noteflow_pb2 +from noteflow.infrastructure.audio.reader import MeetingAudioReader +from noteflow.infrastructure.logging import LoggingConfig, configure_logging +from noteflow.infrastructure.security.crypto import AesGcmCryptoBox +from noteflow.infrastructure.security.keystore import KeyringKeyStore + +if TYPE_CHECKING: + from noteflow.grpc._types import TranscriptSegment + +PRESETS: dict[str, dict[str, float]] = { + "responsive": { + "partial_cadence_seconds": 0.8, + "min_partial_audio_seconds": 0.3, + "max_segment_duration_seconds": 15.0, + "min_speech_duration_seconds": 0.2, + "trailing_silence_seconds": 0.3, + "leading_buffer_seconds": 0.1, + }, + "balanced": { + "partial_cadence_seconds": 1.5, + "min_partial_audio_seconds": 0.5, + "max_segment_duration_seconds": 30.0, + "min_speech_duration_seconds": 0.3, + "trailing_silence_seconds": 0.5, + "leading_buffer_seconds": 0.2, + }, + "accurate": { + "partial_cadence_seconds": 2.5, + "min_partial_audio_seconds": 0.8, + "max_segment_duration_seconds": 45.0, + "min_speech_duration_seconds": 0.4, + "trailing_silence_seconds": 0.8, + "leading_buffer_seconds": 0.25, + }, +} + + +@dataclass(frozen=True) +class AudioCase: + label: str + audio: NDArray[np.float32] + sample_rate: int + reference: str | None + + +@dataclass +class StreamingStats: + first_partial_at: float | None = None + first_final_at: float | None = None + partial_count: int = 0 + final_count: int = 0 + + +@dataclass +class RunResult: + label: str + meeting_id: str + audio_duration_s: float + wall_time_s: float + first_partial_latency_s: float | None + first_final_latency_s: float | None + transcript: str + wer: float | None + segments: int + + +class StreamingConfigStub(Protocol): + def GetStreamingConfiguration( + self, + request: noteflow_pb2.GetStreamingConfigurationRequest, + ) -> noteflow_pb2.GetStreamingConfigurationResponse: ... + + def UpdateStreamingConfiguration( + self, + request: noteflow_pb2.UpdateStreamingConfigurationRequest, + ) -> noteflow_pb2.UpdateStreamingConfigurationResponse: ... + + +def _normalize_text(text: str) -> list[str]: + cleaned = re.sub(r"[^a-z0-9']+", " ", text.lower()) + return [token for token in cleaned.split() if token] + + +def _word_error_rate(reference: str, hypothesis: str) -> float: + ref_tokens = _normalize_text(reference) + hyp_tokens = _normalize_text(hypothesis) + if not ref_tokens: + return 0.0 if not hyp_tokens else 1.0 + + rows = len(ref_tokens) + 1 + cols = len(hyp_tokens) + 1 + dp = [[0] * cols for _ in range(rows)] + for i in range(rows): + dp[i][0] = i + for j in range(cols): + dp[0][j] = j + for i in range(1, rows): + for j in range(1, cols): + cost = 0 if ref_tokens[i - 1] == hyp_tokens[j - 1] else 1 + dp[i][j] = min( + dp[i - 1][j] + 1, + dp[i][j - 1] + 1, + dp[i - 1][j - 1] + cost, + ) + return dp[-1][-1] / len(ref_tokens) + + +def _load_wav(path: Path) -> tuple[NDArray[np.float32], int]: + with wave.open(str(path), "rb") as wav_file: + channels = wav_file.getnchannels() + sample_rate = wav_file.getframerate() + sample_width = wav_file.getsampwidth() + frame_count = wav_file.getnframes() + raw = wav_file.readframes(frame_count) + + if sample_width != 2: + raise ValueError("Only 16-bit PCM WAV files are supported") + + pcm16 = np.frombuffer(raw, dtype=np.int16) + if channels > 1: + pcm16 = pcm16.reshape(-1, channels).mean(axis=1).astype(np.int16) + audio = pcm16.astype(np.float32) / 32767.0 + return audio, sample_rate + + +def _load_meeting_audio( + meeting_id: str, + asset_path: str | None, + meetings_dir: Path, +) -> tuple[NDArray[np.float32], int]: + crypto = AesGcmCryptoBox(KeyringKeyStore()) + reader = MeetingAudioReader(crypto, meetings_dir) + chunks = reader.load_meeting_audio(meeting_id, asset_path) + if not chunks: + return np.array([], dtype=np.float32), reader.sample_rate + audio = np.concatenate([chunk.frames for chunk in chunks]).astype(np.float32) + return audio, reader.sample_rate + + +def _chunk_audio( + audio: NDArray[np.float32], + sample_rate: int, + chunk_ms: int, +) -> Iterable[NDArray[np.float32]]: + chunk_size = max(1, int(sample_rate * (chunk_ms / 1000))) + for start in range(0, audio.shape[0], chunk_size): + yield audio[start : start + chunk_size] + + +def _get_streaming_config(stub: StreamingConfigStub) -> dict[str, float]: + response = stub.GetStreamingConfiguration(noteflow_pb2.GetStreamingConfigurationRequest()) + config = response.configuration + return { + "partial_cadence_seconds": config.partial_cadence_seconds, + "min_partial_audio_seconds": config.min_partial_audio_seconds, + "max_segment_duration_seconds": config.max_segment_duration_seconds, + "min_speech_duration_seconds": config.min_speech_duration_seconds, + "trailing_silence_seconds": config.trailing_silence_seconds, + "leading_buffer_seconds": config.leading_buffer_seconds, + } + + +def _apply_streaming_config( + stub: StreamingConfigStub, + config: dict[str, float], +) -> None: + request = noteflow_pb2.UpdateStreamingConfigurationRequest(**config) + stub.UpdateStreamingConfiguration(request) + + +def _read_reference(reference_path: str | None) -> str | None: + if not reference_path: + return None + path = Path(reference_path) + if not path.exists(): + raise FileNotFoundError(f"Reference file not found: {path}") + return path.read_text(encoding="utf-8") + + +def _make_case( + label: str, + meeting_id: str | None, + asset_path: str | None, + wav_path: str | None, + reference_path: str | None, +) -> AudioCase: + settings = get_settings() + reference = _read_reference(reference_path) + if meeting_id: + audio, sample_rate = _load_meeting_audio( + meeting_id, + asset_path, + Path(settings.meetings_dir), + ) + elif wav_path: + audio, sample_rate = _load_wav(Path(wav_path)) + else: + raise ValueError("Either meeting_id or wav_path must be provided.") + + return AudioCase( + label=label, + audio=audio, + sample_rate=sample_rate, + reference=reference, + ) + + +def _run_streaming_case( + client: NoteFlowClient, + case: AudioCase, + config_label: str, + config: dict[str, float], + chunk_ms: int, + realtime: bool, + final_wait_seconds: float, +) -> RunResult: + stub = client.require_connection() + _apply_streaming_config(stub, config) + + meeting_title = f"AB {case.label} [{config_label}]" + meeting = client.create_meeting(meeting_title) + if meeting is None: + raise RuntimeError("Failed to create meeting") + + stats = StreamingStats() + lock = threading.Lock() + + def on_transcript(segment: TranscriptSegment) -> None: + now = time.time() + with lock: + if segment.is_final: + stats.final_count += 1 + if stats.first_final_at is None: + stats.first_final_at = now + else: + stats.partial_count += 1 + if stats.first_partial_at is None: + stats.first_partial_at = now + + client.on_transcript = on_transcript + if not client.start_streaming(meeting.id): + raise RuntimeError("Failed to start streaming") + + start_time = time.time() + sent_samples = 0 + + try: + for chunk in _chunk_audio(case.audio, case.sample_rate, chunk_ms): + if realtime: + target_time = start_time + (sent_samples / case.sample_rate) + sleep_for = target_time - time.time() + if sleep_for > 0: + time.sleep(sleep_for) + + while not client.send_audio(chunk, timestamp=time.time()): + time.sleep(0.01) + + sent_samples += chunk.shape[0] + finally: + time.sleep(final_wait_seconds) + client.stop_streaming() + client.stop_meeting(meeting.id) + + segments = client.get_meeting_segments(meeting.id) + transcript = " ".join(seg.text.strip() for seg in segments if seg.text.strip()) + end_time = time.time() + audio_duration = case.audio.shape[0] / case.sample_rate if case.sample_rate else 0.0 + + first_partial_latency = ( + (stats.first_partial_at - start_time) if stats.first_partial_at else None + ) + first_final_latency = ( + (stats.first_final_at - start_time) if stats.first_final_at else None + ) + wer = _word_error_rate(case.reference, transcript) if case.reference else None + + return RunResult( + label=f"{case.label}:{config_label}", + meeting_id=meeting.id, + audio_duration_s=audio_duration, + wall_time_s=end_time - start_time, + first_partial_latency_s=first_partial_latency, + first_final_latency_s=first_final_latency, + transcript=transcript, + wer=wer, + segments=len(segments), + ) + + +def _load_cases_from_json(path: str) -> list[AudioCase]: + raw = json.loads(Path(path).read_text(encoding="utf-8")) + if not isinstance(raw, list): + raise ValueError("Cases JSON must be a list of case objects.") + payload = cast(list[object], raw) + entries: list[dict[str, object]] = [] + for item in payload: + if not isinstance(item, dict): + raise ValueError("Each case must be an object.") + entries.append(cast(dict[str, object], item)) + cases: list[AudioCase] = [] + for entry_dict in entries: + cases.append( + _make_case( + label=str(entry_dict.get("label", "case")), + meeting_id=cast(str | None, entry_dict.get("meeting_id")), + asset_path=cast(str | None, entry_dict.get("asset_path")), + wav_path=cast(str | None, entry_dict.get("wav_path")), + reference_path=cast(str | None, entry_dict.get("reference_path")), + ) + ) + return cases + + +def _format_latency(value: float | None) -> str: + if value is None: + return "n/a" + return f"{value:.2f}s" + + +def _print_results(results: list[RunResult]) -> None: + for result in results: + print("") + print(f"Case {result.label}") + print(f" meeting_id: {result.meeting_id}") + print(f" audio_duration_s: {result.audio_duration_s:.2f}") + print(f" wall_time_s: {result.wall_time_s:.2f}") + print(f" first_partial_latency: {_format_latency(result.first_partial_latency_s)}") + print(f" first_final_latency: {_format_latency(result.first_final_latency_s)}") + print(f" segments: {result.segments}") + if result.wer is not None: + print(f" WER: {result.wer:.3f}") + + +def _build_config(value: str | None, label: str) -> dict[str, float]: + if value is None: + raise ValueError(f"Missing config for {label}") + if value in PRESETS: + return PRESETS[value] + path = Path(value) + if path.exists(): + data = json.loads(path.read_text(encoding="utf-8")) + if not isinstance(data, dict): + raise ValueError(f"Config file must be an object: {path}") + payload = cast(dict[str, object], data) + config: dict[str, float] = {} + for key, raw_value in payload.items(): + if isinstance(raw_value, (int, float)): + config[str(key)] = float(raw_value) + if not config: + raise ValueError(f"Config file has no numeric values: {path}") + return config + raise ValueError(f"Unknown preset or config path: {value}") + + +def main() -> None: + parser = argparse.ArgumentParser(description="A/B harness for streaming config.") + parser.add_argument("--server", default="localhost:50051") + parser.add_argument("--meeting-id", help="Meeting ID to replay audio from.") + parser.add_argument("--asset-path", help="Override meeting asset path.") + parser.add_argument("--wav", help="WAV file to stream instead of a meeting.") + parser.add_argument("--reference", help="Reference transcript text file.") + parser.add_argument( + "--cases", + help="JSON file describing multiple cases (label, meeting_id/wav_path, reference_path).", + ) + parser.add_argument("--preset-a", default="responsive") + parser.add_argument("--preset-b", default="balanced") + parser.add_argument("--chunk-ms", type=int, default=200) + parser.add_argument("--realtime", action="store_true") + parser.add_argument("--final-wait", type=float, default=2.0) + args = parser.parse_args() + + configure_logging(LoggingConfig(level="INFO")) + + if args.cases: + cases = _load_cases_from_json(args.cases) + else: + cases = [ + _make_case( + label="sample", + meeting_id=args.meeting_id, + asset_path=args.asset_path, + wav_path=args.wav, + reference_path=args.reference, + ) + ] + + config_a = _build_config(args.preset_a, "A") + config_b = _build_config(args.preset_b, "B") + + client = NoteFlowClient(server_address=args.server) + if not client.connect(): + raise RuntimeError(f"Unable to connect to server at {args.server}") + + stub = cast(StreamingConfigStub, client.require_connection()) + original_config = _get_streaming_config(stub) + + results: list[RunResult] = [] + try: + for case in cases: + results.append( + _run_streaming_case( + client, + case, + "A", + config_a, + args.chunk_ms, + args.realtime, + args.final_wait, + ) + ) + results.append( + _run_streaming_case( + client, + case, + "B", + config_b, + args.chunk_ms, + args.realtime, + args.final_wait, + ) + ) + finally: + _apply_streaming_config(stub, original_config) + client.disconnect() + + _print_results(results) + + +if __name__ == "__main__": + main() diff --git a/src/noteflow/application/services/streaming_config_persistence.py b/src/noteflow/application/services/streaming_config_persistence.py new file mode 100644 index 0000000..2a38dbc --- /dev/null +++ b/src/noteflow/application/services/streaming_config_persistence.py @@ -0,0 +1,192 @@ +"""Helpers for persisting streaming configuration selections.""" + +from __future__ import annotations + +from dataclasses import dataclass +from typing import TYPE_CHECKING, Final, TypedDict, cast + +from noteflow.infrastructure.logging import get_logger + +if TYPE_CHECKING: + from noteflow.config.settings import Settings + +logger = get_logger(__name__) + +STREAMING_CONFIG_PARTIAL_CADENCE_KEY: Final[str] = "partial_cadence_seconds" +STREAMING_CONFIG_MIN_PARTIAL_AUDIO_KEY: Final[str] = "min_partial_audio_seconds" +STREAMING_CONFIG_MAX_SEGMENT_DURATION_KEY: Final[str] = "max_segment_duration_seconds" +STREAMING_CONFIG_MIN_SPEECH_DURATION_KEY: Final[str] = "min_speech_duration_seconds" +STREAMING_CONFIG_TRAILING_SILENCE_KEY: Final[str] = "trailing_silence_seconds" +STREAMING_CONFIG_LEADING_BUFFER_KEY: Final[str] = "leading_buffer_seconds" + +STREAMING_CONFIG_KEYS: Final[tuple[str, ...]] = ( + STREAMING_CONFIG_PARTIAL_CADENCE_KEY, + STREAMING_CONFIG_MIN_PARTIAL_AUDIO_KEY, + STREAMING_CONFIG_MAX_SEGMENT_DURATION_KEY, + STREAMING_CONFIG_MIN_SPEECH_DURATION_KEY, + STREAMING_CONFIG_TRAILING_SILENCE_KEY, + STREAMING_CONFIG_LEADING_BUFFER_KEY, +) + +STREAMING_CONFIG_RANGES: Final[dict[str, tuple[float, float]]] = { + STREAMING_CONFIG_PARTIAL_CADENCE_KEY: (0.5, 10.0), + STREAMING_CONFIG_MIN_PARTIAL_AUDIO_KEY: (0.1, 5.0), + STREAMING_CONFIG_MAX_SEGMENT_DURATION_KEY: (5.0, 180.0), + STREAMING_CONFIG_MIN_SPEECH_DURATION_KEY: (0.1, 2.0), + STREAMING_CONFIG_TRAILING_SILENCE_KEY: (0.1, 2.0), + STREAMING_CONFIG_LEADING_BUFFER_KEY: (0.05, 1.0), +} + + +class StreamingConfigPreference(TypedDict, total=False): + partial_cadence_seconds: float + min_partial_audio_seconds: float + max_segment_duration_seconds: float + min_speech_duration_seconds: float + trailing_silence_seconds: float + leading_buffer_seconds: float + + +class StreamingConfigValues(TypedDict): + partial_cadence_seconds: float + min_partial_audio_seconds: float + max_segment_duration_seconds: float + min_speech_duration_seconds: float + trailing_silence_seconds: float + leading_buffer_seconds: float + + +@dataclass(frozen=True, slots=True) +class StreamingConfig: + """Runtime streaming configuration values.""" + + partial_cadence_seconds: float + min_partial_audio_seconds: float + max_segment_duration_seconds: float + min_speech_duration_seconds: float + trailing_silence_seconds: float + leading_buffer_seconds: float + + +@dataclass(frozen=True, slots=True) +class StreamingConfigResolution: + config: StreamingConfig + used_preferences: bool + had_fallback: bool + + +def build_default_streaming_config(settings: Settings) -> StreamingConfig: + """Build default streaming configuration from settings.""" + raw = StreamingConfig( + partial_cadence_seconds=settings.grpc_partial_cadence_seconds, + min_partial_audio_seconds=settings.grpc_min_partial_audio_seconds, + max_segment_duration_seconds=settings.grpc_max_segment_duration_seconds, + min_speech_duration_seconds=settings.grpc_min_speech_duration_seconds, + trailing_silence_seconds=settings.grpc_trailing_silence_seconds, + leading_buffer_seconds=settings.grpc_leading_buffer_seconds, + ) + resolved, had_fallback = _resolve_config(_build_values_dict(raw), raw) + if had_fallback: + logger.warning("streaming_config_defaults_clamped") + return resolved + + +def build_streaming_config_preference( + config: StreamingConfig, +) -> StreamingConfigPreference: + """Build a preference payload for streaming config persistence.""" + values = _build_values_dict(config) + preference: dict[str, float] = {} + for key, value in values.items(): + min_val, max_val = STREAMING_CONFIG_RANGES[key] + preference[key] = _clamp(value, min_val, max_val) + return cast(StreamingConfigPreference, preference) + + +def resolve_streaming_config_preference( + raw_value: object, + fallback: StreamingConfig, +) -> StreamingConfigResolution | None: + """Resolve a stored streaming config preference into safe runtime values.""" + parsed = _parse_preference(raw_value) + if parsed is None: + return None + + resolved, had_fallback = _resolve_config(parsed, fallback) + return StreamingConfigResolution( + config=resolved, + used_preferences=True, + had_fallback=had_fallback, + ) + + +def _parse_preference(raw_value: object) -> StreamingConfigPreference | None: + if not isinstance(raw_value, dict): + return None + + raw_dict = cast(dict[str, object], raw_value) + preference: StreamingConfigPreference = {} + + for key in STREAMING_CONFIG_KEYS: + value = _read_float(raw_dict.get(key)) + if value is not None: + preference[key] = value + + return preference if preference else None + + +def _resolve_config( + preference: StreamingConfigPreference, + fallback: StreamingConfig, +) -> tuple[StreamingConfig, bool]: + values: dict[str, float] = {} + had_fallback = False + + for key in STREAMING_CONFIG_KEYS: + fallback_value = _get_fallback_value(fallback, key) + resolved, used_fallback = _resolve_value( + key, + preference.get(key), + fallback_value, + ) + values[key] = resolved + had_fallback = had_fallback or used_fallback + + return StreamingConfig(**cast(StreamingConfigValues, values)), had_fallback + + +def _build_values_dict(config: StreamingConfig) -> StreamingConfigValues: + values = {key: _get_fallback_value(config, key) for key in STREAMING_CONFIG_KEYS} + return cast(StreamingConfigValues, values) + + +def _get_fallback_value(config: StreamingConfig, key: str) -> float: + return cast(float, getattr(config, key)) + + +def _resolve_value( + key: str, + preferred: float | None, + fallback: float, +) -> tuple[float, bool]: + min_val, max_val = STREAMING_CONFIG_RANGES[key] + if preferred is not None and min_val <= preferred <= max_val: + return preferred, False + + resolved = _clamp(fallback, min_val, max_val) + if preferred is not None: + return resolved, True + if resolved != fallback: + logger.warning("streaming_config_fallback_out_of_range", key=key, value=fallback) + return resolved, True + return resolved, False + + +def _clamp(value: float, min_val: float, max_val: float) -> float: + return min(max(value, min_val), max_val) + + +def _read_float(value: object) -> float | None: + if isinstance(value, (float, int)): + return float(value) + return None diff --git a/src/noteflow/config/constants/__init__.py b/src/noteflow/config/constants/__init__.py index 0cb08bf..d8de52e 100644 --- a/src/noteflow/config/constants/__init__.py +++ b/src/noteflow/config/constants/__init__.py @@ -49,6 +49,7 @@ from noteflow.config.constants.domain import ( SCHEMA_TYPE_STRING, SETTING_ASR_CONFIG, SETTING_CLOUD_CONSENT_GRANTED, + SETTING_STREAMING_CONFIG, SPACY_MODEL_LG, SPACY_MODEL_MD, SPACY_MODEL_SM, @@ -196,6 +197,7 @@ __all__ = [ "SECONDS_PER_HOUR", "SETTING_ASR_CONFIG", "SETTING_CLOUD_CONSENT_GRANTED", + "SETTING_STREAMING_CONFIG", "SPACY_MODEL_LG", "SPACY_MODEL_MD", "SPACY_MODEL_SM", diff --git a/src/noteflow/config/constants/domain.py b/src/noteflow/config/constants/domain.py index 2cf9dcf..92257c2 100644 --- a/src/noteflow/config/constants/domain.py +++ b/src/noteflow/config/constants/domain.py @@ -78,6 +78,9 @@ SETTING_CLOUD_CONSENT_GRANTED: Final[str] = "cloud_consent_granted" SETTING_ASR_CONFIG: Final[str] = "asr_config" """Settings field name for persisted ASR configuration.""" +SETTING_STREAMING_CONFIG: Final[str] = "streaming_config" +"""Settings field name for persisted streaming configuration.""" + # ============================================================================= # Trigger Actions # ============================================================================= diff --git a/src/noteflow/config/settings/_main.py b/src/noteflow/config/settings/_main.py index 0eb31b7..69b2044 100644 --- a/src/noteflow/config/settings/_main.py +++ b/src/noteflow/config/settings/_main.py @@ -39,6 +39,10 @@ class Settings(TriggerSettings): NOTEFLOW_RETENTION_ENABLED: Enable automatic retention policy (default: False) NOTEFLOW_RETENTION_DAYS: Days to retain completed meetings (default: 90) NOTEFLOW_RETENTION_CHECK_INTERVAL_HOURS: Hours between retention checks (default: 24) + NOTEFLOW_GRPC_MAX_SEGMENT_DURATION_SECONDS: Max segment duration (default: 30.0) + NOTEFLOW_GRPC_MIN_SPEECH_DURATION_SECONDS: Min speech duration (default: 0.3) + NOTEFLOW_GRPC_TRAILING_SILENCE_SECONDS: Trailing silence duration (default: 0.5) + NOTEFLOW_GRPC_LEADING_BUFFER_SECONDS: Leading buffer duration (default: 0.2) """ model_config = SettingsConfigDict( @@ -181,6 +185,22 @@ class Settings(TriggerSettings): float, Field(default=0.5, ge=0.1, le=5.0, description="Minimum audio for partial inference"), ] + grpc_max_segment_duration_seconds: Annotated[ + float, + Field(default=30.0, ge=5.0, le=180.0, description="Maximum segment duration in seconds"), + ] + grpc_min_speech_duration_seconds: Annotated[ + float, + Field(default=0.3, ge=0.1, le=2.0, description="Minimum speech duration in seconds"), + ] + grpc_trailing_silence_seconds: Annotated[ + float, + Field(default=0.5, ge=0.1, le=2.0, description="Trailing silence duration in seconds"), + ] + grpc_leading_buffer_seconds: Annotated[ + float, + Field(default=0.2, ge=0.05, le=1.0, description="Leading buffer duration in seconds"), + ] # Webhook settings webhook_timeout_seconds: Annotated[ diff --git a/src/noteflow/grpc/_mixins/__init__.py b/src/noteflow/grpc/_mixins/__init__.py index 2567884..77699ab 100644 --- a/src/noteflow/grpc/_mixins/__init__.py +++ b/src/noteflow/grpc/_mixins/__init__.py @@ -3,6 +3,7 @@ from ._types import GrpcContext, GrpcStatusContext from .annotation import AnnotationMixin from .asr_config import AsrConfigMixin +from .streaming_config import StreamingConfigMixin from .calendar import CalendarMixin from .diarization import DiarizationMixin from .diarization_job import DiarizationJobMixin @@ -27,6 +28,7 @@ from .webhooks import WebhooksMixin __all__ = [ "AnnotationMixin", "AsrConfigMixin", + "StreamingConfigMixin", "CalendarMixin", "DiarizationJobMixin", "DiarizationMixin", diff --git a/src/noteflow/grpc/_mixins/_servicer_state.py b/src/noteflow/grpc/_mixins/_servicer_state.py index cc5b4d5..12758ae 100644 --- a/src/noteflow/grpc/_mixins/_servicer_state.py +++ b/src/noteflow/grpc/_mixins/_servicer_state.py @@ -22,6 +22,7 @@ if TYPE_CHECKING: from noteflow.application.services.summarization import SummarizationService from noteflow.application.services.webhook_service import WebhookService from noteflow.domain.entities import SyncRun + from noteflow.application.services.streaming_config_persistence import StreamingConfig from noteflow.infrastructure.asr import FasterWhisperEngine, Segmenter, StreamingVad from noteflow.infrastructure.audio.writer import MeetingAudioWriter from noteflow.infrastructure.auth.oidc_registry import OidcAuthService @@ -67,6 +68,9 @@ class ServicerState(Protocol): active_streams: set[str] stop_requested: set[str] # Meeting IDs with pending stop requests + # Streaming tuning configuration + streaming_config: StreamingConfig + # Chunk sequence tracking for acknowledgments chunk_sequences: dict[str, int] # Highest received sequence per meeting chunk_counts: dict[str, int] # Chunks since last ack (emit ack every 5) diff --git a/src/noteflow/grpc/_mixins/meeting/_post_processing.py b/src/noteflow/grpc/_mixins/meeting/_post_processing.py new file mode 100644 index 0000000..a3c8510 --- /dev/null +++ b/src/noteflow/grpc/_mixins/meeting/_post_processing.py @@ -0,0 +1,205 @@ +"""Post-meeting processing: auto-summarization and completion.""" + +from __future__ import annotations + +import asyncio +from dataclasses import dataclass +from typing import TYPE_CHECKING +from uuid import UUID + +from noteflow.domain.ports.unit_of_work import UnitOfWork +from noteflow.domain.value_objects import MeetingId, MeetingState +from noteflow.infrastructure.logging import get_logger, log_state_transition + +if TYPE_CHECKING: + from noteflow.application.services.summarization import SummarizationService + from noteflow.application.services.webhook_service import WebhookService + from noteflow.domain.entities import Meeting, Segment, Summary + + from ..protocols import ServicerHost + +logger = get_logger(__name__) + + +@dataclass(slots=True) +class _SummaryCompletionContext: + repo: UnitOfWork + meeting: Meeting + meeting_id: str + segments: list[Segment] + summary: Summary + + +async def _generate_summary_and_complete( + host: ServicerHost, + meeting_id: str, + summarization_service: SummarizationService, +) -> None: + """Generate summary for meeting and transition to COMPLETED state.""" + result = await _process_summary( + repo_provider=host, meeting_id=meeting_id, service=summarization_service + ) + if result is None: + return + meeting, saved_summary = result + await _trigger_summary_webhook(host.webhook_service, meeting, saved_summary) + + +async def _process_summary( + repo_provider: ServicerHost, + meeting_id: str, + service: SummarizationService, +) -> tuple[Meeting, Summary] | None: + from ..summarization._summary_generation import summarize_or_placeholder + + parsed_id = MeetingId(UUID(meeting_id)) + repo: UnitOfWork + async with repo_provider.create_repository_provider() as repo: + meeting = await _load_meeting(repo, parsed_id, meeting_id) + if meeting is None or not _should_process_meeting(meeting, meeting_id): + return None + + segments = await _load_segments(repo, parsed_id) + if not segments: + await _complete_without_summary(repo, meeting, meeting_id) + return None + + summary = await summarize_or_placeholder( + service, + parsed_id, + segments, + style_prompt=None, + ) + + context = _SummaryCompletionContext( + repo=repo, + meeting=meeting, + meeting_id=meeting_id, + segments=segments, + summary=summary, + ) + saved_summary = await _save_summary_and_complete(context) + + return meeting, saved_summary + + +async def _load_meeting( + repo: UnitOfWork, + meeting_id: MeetingId, + meeting_id_str: str, +) -> Meeting | None: + meeting = await repo.meetings.get(meeting_id) + if meeting is None: + logger.warning("Post-processing: meeting not found", meeting_id=meeting_id_str) + return meeting + + +def _should_process_meeting(meeting: Meeting, meeting_id: str) -> bool: + if meeting.state != MeetingState.STOPPED: + logger.debug( + "Post-processing: skipping, meeting not in STOPPED state", + meeting_id=meeting_id, + state=meeting.state.name, + ) + return False + return True + + +async def _load_segments( + repo: UnitOfWork, + meeting_id: MeetingId, +) -> list[Segment]: + return list(await repo.segments.get_by_meeting(meeting_id)) + + +async def _complete_without_summary( + repo: UnitOfWork, + meeting: Meeting, + meeting_id: str, +) -> None: + logger.info( + "Post-processing: no segments, completing without summary", + meeting_id=meeting_id, + ) + _complete_meeting(meeting, meeting_id) + await repo.meetings.update(meeting) + await repo.commit() + + +async def _save_summary_and_complete(context: _SummaryCompletionContext) -> Summary: + saved_summary = await context.repo.summaries.save(context.summary) + _complete_meeting(context.meeting, context.meeting_id) + await context.repo.meetings.update(context.meeting) + await context.repo.commit() + logger.info( + "Post-processing complete", + meeting_id=context.meeting_id, + summary_db_id=saved_summary.db_id, + segment_count=len(context.segments), + ) + return saved_summary + + +def _complete_meeting(meeting: Meeting, meeting_id: str) -> None: + """Transition meeting to COMPLETED state with logging.""" + previous_state = meeting.state + meeting.complete() + log_state_transition("meeting", meeting_id, previous_state, meeting.state) + + +async def _trigger_summary_webhook( + webhook_service: WebhookService | None, + meeting: Meeting, + summary: Summary, +) -> None: + """Trigger summary.generated webhook (fire-and-forget).""" + if webhook_service is None: + return + try: + meeting.summary = summary + await webhook_service.trigger_summary_generated(meeting) + except Exception: + logger.exception("Failed to trigger summary.generated webhook") + + +async def start_post_processing( + host: ServicerHost, + meeting_id: str, +) -> asyncio.Task[None] | None: + """Spawn background task for post-meeting processing. + + Starts auto-summarization and meeting completion as a fire-and-forget task. + Returns the task handle for testing/monitoring, or None if summarization + is not configured. + + Args: + host: The servicer host. + meeting_id: The meeting ID to process. + + Returns: + The spawned asyncio Task, or None if summarization service unavailable. + """ + service = host.summarization_service + if service is None: + logger.debug( + "Post-processing: summarization not configured, skipping", + meeting_id=meeting_id, + ) + return None + + # Capture narrowed type for closure + summarization_service: SummarizationService = service + + async def _run_with_error_handling() -> None: + """Wrapper to catch and log any errors.""" + try: + await _generate_summary_and_complete(host, meeting_id, summarization_service) + except Exception: + logger.exception( + "Post-processing failed", + meeting_id=meeting_id, + ) + + task = asyncio.create_task(_run_with_error_handling()) + logger.info("Post-processing task started", meeting_id=meeting_id) + return task diff --git a/src/noteflow/grpc/_mixins/meeting/meeting_mixin.py b/src/noteflow/grpc/_mixins/meeting/meeting_mixin.py index 53dfc5d..634eb71 100644 --- a/src/noteflow/grpc/_mixins/meeting/meeting_mixin.py +++ b/src/noteflow/grpc/_mixins/meeting/meeting_mixin.py @@ -3,6 +3,7 @@ from __future__ import annotations from collections.abc import Mapping, Sequence +from dataclasses import dataclass from typing import TYPE_CHECKING, cast from uuid import UUID @@ -10,13 +11,14 @@ from noteflow.config.constants import DEFAULT_MEETING_TITLE from noteflow.domain.entities import Meeting from noteflow.domain.entities.meeting import MeetingCreateParams from noteflow.domain.identity import OperationContext -from noteflow.domain.value_objects import MeetingState +from noteflow.domain.value_objects import MeetingId, MeetingState from noteflow.infrastructure.logging import get_logger from ...proto import noteflow_pb2 from ..converters import meeting_to_proto, parse_meeting_id_or_abort from ..errors import ENTITY_MEETING, abort_not_found from ..protocols import MeetingRepositoryProvider +from ._post_processing import start_post_processing from ._project_scope import ( parse_project_id_or_abort, parse_project_ids_or_abort, @@ -39,10 +41,75 @@ if TYPE_CHECKING: from noteflow.infrastructure.audio.writer import MeetingAudioWriter from .._types import GrpcContext + from ..protocols import ServicerHost logger = get_logger(__name__) +@dataclass(slots=True) +class _StopMeetingContext: + host: MeetingMixin + repo: MeetingRepositoryProvider + meeting: Meeting + meeting_id: str + context: GrpcContext + + +async def _load_meeting_for_stop( + repo: MeetingRepositoryProvider, + meeting_id: MeetingId, + meeting_id_str: str, + context: GrpcContext, +) -> Meeting: + meeting = await repo.meetings.get(meeting_id) + if meeting is None: + logger.warning("StopMeeting: meeting not found", meeting_id=meeting_id_str) + await abort_not_found(context, ENTITY_MEETING, meeting_id_str) + raise AssertionError("unreachable") + return meeting + + +async def _stop_meeting_and_persist(context: _StopMeetingContext) -> Meeting: + terminal_states = ( + MeetingState.STOPPED, + MeetingState.STOPPING, + MeetingState.COMPLETED, + MeetingState.ERROR, + ) + if context.meeting.state in terminal_states: + logger.debug( + "StopMeeting: already terminal", + meeting_id=context.meeting_id, + state=context.meeting.state.value, + ) + return context.meeting + + previous_state = context.meeting.state.value + await transition_to_stopped( + context.meeting, + context.meeting_id, + previous_state, + context.context, + ) + await context.repo.meetings.update(context.meeting) + + if context.repo.supports_diarization_jobs: + await context.repo.diarization_jobs.clear_streaming_turns(context.meeting_id) + + await context.repo.commit() + logger.info( + "Meeting stopped", + meeting_id=context.meeting_id, + from_state=previous_state, + to_state=context.meeting.state.value, + ) + await fire_stop_webhooks(context.host.webhook_service, context.meeting) + + host_cast = cast("ServicerHost", context.host) + await start_post_processing(host_cast, context.meeting_id) + return context.meeting + + class MeetingMixin: """Mixin providing meeting CRUD functionality. @@ -113,33 +180,15 @@ class MeetingMixin: parsed_meeting_id = await parse_meeting_id_or_abort(meeting_id, context) async with cast(MeetingRepositoryProvider, self.create_repository_provider()) as repo: - meeting = await repo.meetings.get(parsed_meeting_id) - if meeting is None: - logger.warning("StopMeeting: meeting not found", meeting_id=meeting_id) - await abort_not_found(context, ENTITY_MEETING, meeting_id) - raise # Unreachable but helps type checker - - # Idempotency: return success if already stopped/stopping/completed - terminal_states = ( - MeetingState.STOPPED, - MeetingState.STOPPING, - MeetingState.COMPLETED, - MeetingState.ERROR, + meeting = await _load_meeting_for_stop(repo, parsed_meeting_id, meeting_id, context) + stop_context = _StopMeetingContext( + host=self, + repo=repo, + meeting=meeting, + meeting_id=meeting_id, + context=context, ) - if meeting.state in terminal_states: - logger.debug("StopMeeting: already terminal", meeting_id=meeting_id, state=meeting.state.value) - return meeting_to_proto(meeting) - - previous_state = meeting.state.value - await transition_to_stopped(meeting, meeting_id, previous_state, context) - await repo.meetings.update(meeting) - - if repo.supports_diarization_jobs: - await repo.diarization_jobs.clear_streaming_turns(meeting_id) - - await repo.commit() - logger.info("Meeting stopped", meeting_id=meeting_id, from_state=previous_state, to_state=meeting.state.value) - await fire_stop_webhooks(self.webhook_service, meeting) + meeting = await _stop_meeting_and_persist(stop_context) return meeting_to_proto(meeting) async def ListMeetings( diff --git a/src/noteflow/grpc/_mixins/streaming/_partials.py b/src/noteflow/grpc/_mixins/streaming/_partials.py index 72eedd0..19e9b09 100644 --- a/src/noteflow/grpc/_mixins/streaming/_partials.py +++ b/src/noteflow/grpc/_mixins/streaming/_partials.py @@ -30,7 +30,7 @@ def _should_emit_partial( True if a partial should be emitted. """ # Check if enough time has passed since last partial - if now - state.last_partial_time < host.PARTIAL_CADENCE_SECONDS: + if now - state.last_partial_time < host.streaming_config.partial_cadence_seconds: return False # Check if we have enough audio @@ -38,7 +38,10 @@ def _should_emit_partial( return False # Check minimum audio duration before extracting - return state.partial_buffer.duration_seconds >= host.MIN_PARTIAL_AUDIO_SECONDS + return ( + state.partial_buffer.duration_seconds + >= host.streaming_config.min_partial_audio_seconds + ) async def _transcribe_partial_audio( diff --git a/src/noteflow/grpc/_mixins/streaming_config.py b/src/noteflow/grpc/_mixins/streaming_config.py new file mode 100644 index 0000000..ca82aa9 --- /dev/null +++ b/src/noteflow/grpc/_mixins/streaming_config.py @@ -0,0 +1,144 @@ +"""Streaming configuration mixin for gRPC service. + +Provides runtime tuning for partial cadence and segmentation thresholds. +""" + +from __future__ import annotations + +from dataclasses import replace +from typing import TYPE_CHECKING + +from noteflow.application.services.streaming_config_persistence import ( + STREAMING_CONFIG_KEYS, + STREAMING_CONFIG_RANGES, + StreamingConfig, + build_streaming_config_preference, +) +from noteflow.config.constants.domain import SETTING_STREAMING_CONFIG +from noteflow.infrastructure.asr import Segmenter +from noteflow.infrastructure.logging import get_logger + +from ..proto import noteflow_pb2 +from ._types import GrpcContext +from .errors import abort_invalid_argument + +if TYPE_CHECKING: + from collections.abc import Callable + + from noteflow.infrastructure.persistence.unit_of_work import SqlAlchemyUnitOfWork + +logger = get_logger(__name__) + + +def _build_configuration_proto(config: StreamingConfig) -> noteflow_pb2.StreamingConfiguration: + return noteflow_pb2.StreamingConfiguration( + partial_cadence_seconds=config.partial_cadence_seconds, + min_partial_audio_seconds=config.min_partial_audio_seconds, + max_segment_duration_seconds=config.max_segment_duration_seconds, + min_speech_duration_seconds=config.min_speech_duration_seconds, + trailing_silence_seconds=config.trailing_silence_seconds, + leading_buffer_seconds=config.leading_buffer_seconds, + ) + + +def _parse_update_request( + request: noteflow_pb2.UpdateStreamingConfigurationRequest, +) -> dict[str, float]: + updates: dict[str, float] = {} + + for field in STREAMING_CONFIG_KEYS: + if request.HasField(field): + updates[field] = getattr(request, field) + + return updates + + +def _validate_update(update: dict[str, float]) -> str | None: + for key, value in update.items(): + min_val, max_val = STREAMING_CONFIG_RANGES.get(key, (None, None)) + if min_val is None or max_val is None: + continue + if not (min_val <= value <= max_val): + return f"{key} must be between {min_val} and {max_val} seconds" + return None + + +class StreamingConfigMixin: + """Mixin providing streaming configuration management functionality.""" + + streaming_config: StreamingConfig + segmenters: dict[str, Segmenter] + create_uow: Callable[..., SqlAlchemyUnitOfWork] + + async def GetStreamingConfiguration( + self, + request: noteflow_pb2.GetStreamingConfigurationRequest, + context: GrpcContext, + ) -> noteflow_pb2.GetStreamingConfigurationResponse: + config_proto = _build_configuration_proto(self.streaming_config) + return noteflow_pb2.GetStreamingConfigurationResponse(configuration=config_proto) + + async def UpdateStreamingConfiguration( + self, + request: noteflow_pb2.UpdateStreamingConfigurationRequest, + context: GrpcContext, + ) -> noteflow_pb2.UpdateStreamingConfigurationResponse: + updates = _parse_update_request(request) + if not updates: + config_proto = _build_configuration_proto(self.streaming_config) + return noteflow_pb2.UpdateStreamingConfigurationResponse(configuration=config_proto) + + if error := _validate_update(updates): + await abort_invalid_argument(context, error) + raise AssertionError("unreachable") # abort is NoReturn + + current = self.streaming_config + updated = StreamingConfig( + partial_cadence_seconds=updates.get("partial_cadence_seconds", current.partial_cadence_seconds), + min_partial_audio_seconds=updates.get("min_partial_audio_seconds", current.min_partial_audio_seconds), + max_segment_duration_seconds=updates.get( + "max_segment_duration_seconds", current.max_segment_duration_seconds + ), + min_speech_duration_seconds=updates.get( + "min_speech_duration_seconds", current.min_speech_duration_seconds + ), + trailing_silence_seconds=updates.get( + "trailing_silence_seconds", current.trailing_silence_seconds + ), + leading_buffer_seconds=updates.get( + "leading_buffer_seconds", current.leading_buffer_seconds + ), + ) + + self.apply_streaming_config(updated) + await self._persist_streaming_config(updated) + + config_proto = _build_configuration_proto(updated) + return noteflow_pb2.UpdateStreamingConfigurationResponse(configuration=config_proto) + + def apply_streaming_config(self, config: StreamingConfig) -> None: + self.streaming_config = config + for segmenter in self.segmenters.values(): + current_config = segmenter.config + segmenter.config = replace( + current_config, + min_speech_duration=config.min_speech_duration_seconds, + max_segment_duration=config.max_segment_duration_seconds, + trailing_silence=config.trailing_silence_seconds, + leading_buffer=config.leading_buffer_seconds, + ) + + async def _persist_streaming_config(self, config: StreamingConfig) -> None: + try: + uow = self.create_uow() + except RuntimeError: + logger.debug("streaming_config_persist_skipped_no_db") + return + + async with uow: + if not uow.supports_preferences: + logger.debug("streaming_config_persist_skipped_no_preferences") + return + preference = build_streaming_config_preference(config) + await uow.preferences.set(SETTING_STREAMING_CONFIG, preference) + await uow.commit() diff --git a/src/noteflow/grpc/_service_mixins.py b/src/noteflow/grpc/_service_mixins.py index 9591b36..7884b9a 100644 --- a/src/noteflow/grpc/_service_mixins.py +++ b/src/noteflow/grpc/_service_mixins.py @@ -1,6 +1,4 @@ """Mixin classes for NoteFlowServicer.""" - - from __future__ import annotations import time @@ -15,6 +13,7 @@ from noteflow.domain.identity.context import OperationContext, UserContext, Work from noteflow.domain.identity.roles import WorkspaceRole from noteflow.domain.value_objects import MeetingState from noteflow.grpc.meeting_store import MeetingStore +from noteflow.application.services.streaming_config_persistence import StreamingConfig from noteflow.infrastructure.asr import Segmenter, SegmenterConfig, StreamingVad from noteflow.infrastructure.audio.partial_buffer import PartialAudioBuffer from noteflow.infrastructure.audio.writer import MeetingAudioWriter @@ -51,15 +50,12 @@ if TYPE_CHECKING: from ._mixins._types import GrpcContext logger = get_logger(__name__) - - class ServicerUowMixin: """Mixin for Unit of Work operations.""" session_factory: async_sessionmaker[AsyncSession] | None meetings_dir: Path memory_store: MeetingStore | None - def use_database(self) -> bool: """Check if database persistence is configured.""" return self.session_factory is not None @@ -95,11 +91,7 @@ class ServicerContextMixin: """Mixin for operation context handling.""" def get_operation_context(self, context: GrpcContext) -> OperationContext: - """Get operation context from gRPC context variables. - - Extract user and workspace IDs from context variables set by the - identity interceptor. Falls back to domain defaults for local-first mode. - """ + """Get operation context from gRPC context variables.""" request_id = request_id_var.get() user_id_str = user_id_var.get() workspace_id_str = workspace_id_var.get() @@ -125,17 +117,25 @@ class ServicerStreamingStateMixin: vad_instances: dict[str, StreamingVad] segmenters: dict[str, Segmenter] segment_counters: dict[str, int] + streaming_config: StreamingConfig stream_formats: dict[str, tuple[int, int]] chunk_sequences: dict[str, int] chunk_counts: dict[str, int] chunk_receipt_times: dict[str, deque[float]] pending_chunks: dict[str, int] DEFAULT_SAMPLE_RATE: int - def init_streaming_state(self, meeting_id: str, next_segment_id: int) -> None: """Initialize VAD, Segmenter, speaking state, and partial buffers for a meeting.""" vad = StreamingVad() - segmenter = Segmenter(config=SegmenterConfig(sample_rate=self.DEFAULT_SAMPLE_RATE)) + segmenter = Segmenter( + config=SegmenterConfig( + min_speech_duration=self.streaming_config.min_speech_duration_seconds, + max_segment_duration=self.streaming_config.max_segment_duration_seconds, + trailing_silence=self.streaming_config.trailing_silence_seconds, + leading_buffer=self.streaming_config.leading_buffer_seconds, + sample_rate=self.DEFAULT_SAMPLE_RATE, + ) + ) partial_buffer = PartialAudioBuffer(sample_rate=self.DEFAULT_SAMPLE_RATE) current_time = time.time() diff --git a/src/noteflow/grpc/proto/noteflow.proto b/src/noteflow/grpc/proto/noteflow.proto index 8099b13..60ae3f9 100644 --- a/src/noteflow/grpc/proto/noteflow.proto +++ b/src/noteflow/grpc/proto/noteflow.proto @@ -57,6 +57,10 @@ service NoteFlowService { rpc UpdateAsrConfiguration(UpdateAsrConfigurationRequest) returns (UpdateAsrConfigurationResponse); rpc GetAsrConfigurationJobStatus(GetAsrConfigurationJobStatusRequest) returns (AsrConfigurationJobStatus); + // Streaming configuration (Sprint 20) + rpc GetStreamingConfiguration(GetStreamingConfigurationRequest) returns (GetStreamingConfigurationResponse); + rpc UpdateStreamingConfiguration(UpdateStreamingConfigurationRequest) returns (UpdateStreamingConfigurationResponse); + // Named entity extraction (Sprint 4) + mutations (Sprint 8) rpc ExtractEntities(ExtractEntitiesRequest) returns (ExtractEntitiesResponse); rpc UpdateEntity(UpdateEntityRequest) returns (UpdateEntityResponse); @@ -733,6 +737,61 @@ message AsrConfigurationJobStatus { optional AsrConfiguration new_configuration = 6; } +// ============================================================================= +// Streaming Configuration Messages (Sprint 20) +// ============================================================================= + +// Streaming configuration for partials and segmentation +message StreamingConfiguration { + // Interval for emitting partial transcripts (seconds) + float partial_cadence_seconds = 1; + + // Minimum audio duration required to emit a partial (seconds) + float min_partial_audio_seconds = 2; + + // Maximum duration before forcing a segment split (seconds) + float max_segment_duration_seconds = 3; + + // Minimum speech duration to keep a segment (seconds) + float min_speech_duration_seconds = 4; + + // Trailing silence to include after speech ends (seconds) + float trailing_silence_seconds = 5; + + // Leading buffer to include before speech starts (seconds) + float leading_buffer_seconds = 6; +} + +message GetStreamingConfigurationRequest {} + +message GetStreamingConfigurationResponse { + StreamingConfiguration configuration = 1; +} + +message UpdateStreamingConfigurationRequest { + // Interval for emitting partial transcripts (seconds) + optional float partial_cadence_seconds = 1; + + // Minimum audio duration required to emit a partial (seconds) + optional float min_partial_audio_seconds = 2; + + // Maximum duration before forcing a segment split (seconds) + optional float max_segment_duration_seconds = 3; + + // Minimum speech duration to keep a segment (seconds) + optional float min_speech_duration_seconds = 4; + + // Trailing silence to include after speech ends (seconds) + optional float trailing_silence_seconds = 5; + + // Leading buffer to include before speech starts (seconds) + optional float leading_buffer_seconds = 6; +} + +message UpdateStreamingConfigurationResponse { + StreamingConfiguration configuration = 1; +} + // ============================================================================= // Annotation Messages // ============================================================================= diff --git a/src/noteflow/grpc/proto/noteflow_pb2.py b/src/noteflow/grpc/proto/noteflow_pb2.py index af74abb..9ec1e58 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\"\x83\x04\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\x12#\n\x16system_ram_total_bytes\x18\x0b \x01(\x03H\x00\x88\x01\x01\x12\'\n\x1asystem_ram_available_bytes\x18\x0c \x01(\x03H\x01\x88\x01\x01\x12!\n\x14gpu_vram_total_bytes\x18\r \x01(\x03H\x02\x88\x01\x01\x12%\n\x18gpu_vram_available_bytes\x18\x0e \x01(\x03H\x03\x88\x01\x01\x42\x19\n\x17_system_ram_total_bytesB\x1d\n\x1b_system_ram_available_bytesB\x17\n\x15_gpu_vram_total_bytesB\x1b\n\x19_gpu_vram_available_bytes\"\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') +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\"\x83\x04\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\x12#\n\x16system_ram_total_bytes\x18\x0b \x01(\x03H\x00\x88\x01\x01\x12\'\n\x1asystem_ram_available_bytes\x18\x0c \x01(\x03H\x01\x88\x01\x01\x12!\n\x14gpu_vram_total_bytes\x18\r \x01(\x03H\x02\x88\x01\x01\x12%\n\x18gpu_vram_available_bytes\x18\x0e \x01(\x03H\x03\x88\x01\x01\x42\x19\n\x17_system_ram_total_bytesB\x1d\n\x1b_system_ram_available_bytesB\x17\n\x15_gpu_vram_total_bytesB\x1b\n\x19_gpu_vram_available_bytes\"\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\"\xe9\x01\n\x16StreamingConfiguration\x12\x1f\n\x17partial_cadence_seconds\x18\x01 \x01(\x02\x12!\n\x19min_partial_audio_seconds\x18\x02 \x01(\x02\x12$\n\x1cmax_segment_duration_seconds\x18\x03 \x01(\x02\x12#\n\x1bmin_speech_duration_seconds\x18\x04 \x01(\x02\x12 \n\x18trailing_silence_seconds\x18\x05 \x01(\x02\x12\x1e\n\x16leading_buffer_seconds\x18\x06 \x01(\x02\"\"\n GetStreamingConfigurationRequest\"\\\n!GetStreamingConfigurationResponse\x12\x37\n\rconfiguration\x18\x01 \x01(\x0b\x32 .noteflow.StreamingConfiguration\"\xc7\x03\n#UpdateStreamingConfigurationRequest\x12$\n\x17partial_cadence_seconds\x18\x01 \x01(\x02H\x00\x88\x01\x01\x12&\n\x19min_partial_audio_seconds\x18\x02 \x01(\x02H\x01\x88\x01\x01\x12)\n\x1cmax_segment_duration_seconds\x18\x03 \x01(\x02H\x02\x88\x01\x01\x12(\n\x1bmin_speech_duration_seconds\x18\x04 \x01(\x02H\x03\x88\x01\x01\x12%\n\x18trailing_silence_seconds\x18\x05 \x01(\x02H\x04\x88\x01\x01\x12#\n\x16leading_buffer_seconds\x18\x06 \x01(\x02H\x05\x88\x01\x01\x42\x1a\n\x18_partial_cadence_secondsB\x1c\n\x1a_min_partial_audio_secondsB\x1f\n\x1d_max_segment_duration_secondsB\x1e\n\x1c_min_speech_duration_secondsB\x1b\n\x19_trailing_silence_secondsB\x19\n\x17_leading_buffer_seconds\"_\n$UpdateStreamingConfigurationResponse\x12\x37\n\rconfiguration\x18\x01 \x01(\x0b\x32 .noteflow.StreamingConfiguration\"\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\xdd>\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\x12t\n\x19GetStreamingConfiguration\x12*.noteflow.GetStreamingConfigurationRequest\x1a+.noteflow.GetStreamingConfigurationResponse\x12}\n\x1cUpdateStreamingConfiguration\x12-.noteflow.UpdateStreamingConfigurationRequest\x1a..noteflow.UpdateStreamingConfigurationResponse\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,28 +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=21393 - _globals['_UPDATETYPE']._serialized_end=21534 - _globals['_MEETINGSTATE']._serialized_start=21537 - _globals['_MEETINGSTATE']._serialized_end=21719 - _globals['_SORTORDER']._serialized_start=21721 - _globals['_SORTORDER']._serialized_end=21817 - _globals['_PRIORITY']._serialized_start=21819 - _globals['_PRIORITY']._serialized_end=21913 - _globals['_ASRDEVICE']._serialized_start=21915 - _globals['_ASRDEVICE']._serialized_end=21995 - _globals['_ASRCOMPUTETYPE']._serialized_start=21998 - _globals['_ASRCOMPUTETYPE']._serialized_end=22135 - _globals['_ANNOTATIONTYPE']._serialized_start=22138 - _globals['_ANNOTATIONTYPE']._serialized_end=22302 - _globals['_EXPORTFORMAT']._serialized_start=22304 - _globals['_EXPORTFORMAT']._serialized_end=22424 - _globals['_JOBSTATUS']._serialized_start=22427 - _globals['_JOBSTATUS']._serialized_end=22588 - _globals['_PROCESSINGSTEPSTATUS']._serialized_start=22591 - _globals['_PROCESSINGSTEPSTATUS']._serialized_end=22792 - _globals['_PROJECTROLEPROTO']._serialized_start=22794 - _globals['_PROJECTROLEPROTO']._serialized_end=22916 + _globals['_UPDATETYPE']._serialized_start=22314 + _globals['_UPDATETYPE']._serialized_end=22455 + _globals['_MEETINGSTATE']._serialized_start=22458 + _globals['_MEETINGSTATE']._serialized_end=22640 + _globals['_SORTORDER']._serialized_start=22642 + _globals['_SORTORDER']._serialized_end=22738 + _globals['_PRIORITY']._serialized_start=22740 + _globals['_PRIORITY']._serialized_end=22834 + _globals['_ASRDEVICE']._serialized_start=22836 + _globals['_ASRDEVICE']._serialized_end=22916 + _globals['_ASRCOMPUTETYPE']._serialized_start=22919 + _globals['_ASRCOMPUTETYPE']._serialized_end=23056 + _globals['_ANNOTATIONTYPE']._serialized_start=23059 + _globals['_ANNOTATIONTYPE']._serialized_end=23223 + _globals['_EXPORTFORMAT']._serialized_start=23225 + _globals['_EXPORTFORMAT']._serialized_end=23345 + _globals['_JOBSTATUS']._serialized_start=23348 + _globals['_JOBSTATUS']._serialized_end=23509 + _globals['_PROCESSINGSTEPSTATUS']._serialized_start=23512 + _globals['_PROCESSINGSTEPSTATUS']._serialized_end=23713 + _globals['_PROJECTROLEPROTO']._serialized_start=23715 + _globals['_PROJECTROLEPROTO']._serialized_end=23837 _globals['_AUDIOCHUNK']._serialized_start=29 _globals['_AUDIOCHUNK']._serialized_end=163 _globals['_CONGESTIONINFO']._serialized_start=165 @@ -151,292 +151,302 @@ if not _descriptor._USE_C_DESCRIPTORS: _globals['_GETASRCONFIGURATIONJOBSTATUSREQUEST']._serialized_end=5962 _globals['_ASRCONFIGURATIONJOBSTATUS']._serialized_start=5965 _globals['_ASRCONFIGURATIONJOBSTATUS']._serialized_end=6191 - _globals['_ANNOTATION']._serialized_start=6194 - _globals['_ANNOTATION']._serialized_end=6382 - _globals['_ADDANNOTATIONREQUEST']._serialized_start=6385 - _globals['_ADDANNOTATIONREQUEST']._serialized_end=6551 - _globals['_GETANNOTATIONREQUEST']._serialized_start=6553 - _globals['_GETANNOTATIONREQUEST']._serialized_end=6598 - _globals['_LISTANNOTATIONSREQUEST']._serialized_start=6600 - _globals['_LISTANNOTATIONSREQUEST']._serialized_end=6682 - _globals['_LISTANNOTATIONSRESPONSE']._serialized_start=6684 - _globals['_LISTANNOTATIONSRESPONSE']._serialized_end=6752 - _globals['_UPDATEANNOTATIONREQUEST']._serialized_start=6755 - _globals['_UPDATEANNOTATIONREQUEST']._serialized_end=6927 - _globals['_DELETEANNOTATIONREQUEST']._serialized_start=6929 - _globals['_DELETEANNOTATIONREQUEST']._serialized_end=6977 - _globals['_DELETEANNOTATIONRESPONSE']._serialized_start=6979 - _globals['_DELETEANNOTATIONRESPONSE']._serialized_end=7022 - _globals['_PROCESSINGSTEPSTATE']._serialized_start=7025 - _globals['_PROCESSINGSTEPSTATE']._serialized_end=7159 - _globals['_PROCESSINGSTATUS']._serialized_start=7162 - _globals['_PROCESSINGSTATUS']._serialized_end=7329 - _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_start=7331 - _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_end=7416 - _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_start=7418 - _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_end=7506 - _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_start=7508 - _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_end=7583 - _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_start=7586 - _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_end=7743 - _globals['_RENAMESPEAKERREQUEST']._serialized_start=7745 - _globals['_RENAMESPEAKERREQUEST']._serialized_end=7837 - _globals['_RENAMESPEAKERRESPONSE']._serialized_start=7839 - _globals['_RENAMESPEAKERRESPONSE']._serialized_end=7905 - _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_start=7907 - _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_end=7955 - _globals['_DIARIZATIONJOBSTATUS']._serialized_start=7958 - _globals['_DIARIZATIONJOBSTATUS']._serialized_end=8129 - _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_start=8131 - _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_end=8176 - _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_start=8178 - _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_end=8285 - _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_start=8287 - _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_end=8320 - _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_start=8322 - _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_end=8402 - _globals['_EXTRACTENTITIESREQUEST']._serialized_start=8404 - _globals['_EXTRACTENTITIESREQUEST']._serialized_end=8471 - _globals['_EXTRACTEDENTITY']._serialized_start=8473 - _globals['_EXTRACTEDENTITY']._serialized_end=8594 - _globals['_EXTRACTENTITIESRESPONSE']._serialized_start=8596 - _globals['_EXTRACTENTITIESRESPONSE']._serialized_end=8703 - _globals['_UPDATEENTITYREQUEST']._serialized_start=8705 - _globals['_UPDATEENTITYREQUEST']._serialized_end=8797 - _globals['_UPDATEENTITYRESPONSE']._serialized_start=8799 - _globals['_UPDATEENTITYRESPONSE']._serialized_end=8864 - _globals['_DELETEENTITYREQUEST']._serialized_start=8866 - _globals['_DELETEENTITYREQUEST']._serialized_end=8926 - _globals['_DELETEENTITYRESPONSE']._serialized_start=8928 - _globals['_DELETEENTITYRESPONSE']._serialized_end=8967 - _globals['_CALENDAREVENT']._serialized_start=8970 - _globals['_CALENDAREVENT']._serialized_end=9169 - _globals['_LISTCALENDAREVENTSREQUEST']._serialized_start=9171 - _globals['_LISTCALENDAREVENTSREQUEST']._serialized_end=9252 - _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_start=9254 - _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_end=9344 - _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_start=9346 - _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_end=9375 - _globals['_CALENDARPROVIDER']._serialized_start=9377 - _globals['_CALENDARPROVIDER']._serialized_end=9457 - _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_start=9459 - _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_end=9536 - _globals['_INITIATEOAUTHREQUEST']._serialized_start=9538 - _globals['_INITIATEOAUTHREQUEST']._serialized_end=9626 - _globals['_INITIATEOAUTHRESPONSE']._serialized_start=9628 - _globals['_INITIATEOAUTHRESPONSE']._serialized_end=9684 - _globals['_COMPLETEOAUTHREQUEST']._serialized_start=9686 - _globals['_COMPLETEOAUTHREQUEST']._serialized_end=9755 - _globals['_COMPLETEOAUTHRESPONSE']._serialized_start=9757 - _globals['_COMPLETEOAUTHRESPONSE']._serialized_end=9868 - _globals['_OAUTHCONNECTION']._serialized_start=9871 - _globals['_OAUTHCONNECTION']._serialized_end=10006 - _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_start=10008 - _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_end=10085 - _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_start=10087 - _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_end=10168 - _globals['_DISCONNECTOAUTHREQUEST']._serialized_start=10170 - _globals['_DISCONNECTOAUTHREQUEST']._serialized_end=10238 - _globals['_DISCONNECTOAUTHRESPONSE']._serialized_start=10240 - _globals['_DISCONNECTOAUTHRESPONSE']._serialized_end=10305 - _globals['_REGISTERWEBHOOKREQUEST']._serialized_start=10308 - _globals['_REGISTERWEBHOOKREQUEST']._serialized_end=10454 - _globals['_WEBHOOKCONFIGPROTO']._serialized_start=10457 - _globals['_WEBHOOKCONFIGPROTO']._serialized_end=10652 - _globals['_LISTWEBHOOKSREQUEST']._serialized_start=10654 - _globals['_LISTWEBHOOKSREQUEST']._serialized_end=10697 - _globals['_LISTWEBHOOKSRESPONSE']._serialized_start=10699 - _globals['_LISTWEBHOOKSRESPONSE']._serialized_end=10790 - _globals['_UPDATEWEBHOOKREQUEST']._serialized_start=10793 - _globals['_UPDATEWEBHOOKREQUEST']._serialized_end=11053 - _globals['_DELETEWEBHOOKREQUEST']._serialized_start=11055 - _globals['_DELETEWEBHOOKREQUEST']._serialized_end=11097 - _globals['_DELETEWEBHOOKRESPONSE']._serialized_start=11099 - _globals['_DELETEWEBHOOKRESPONSE']._serialized_end=11139 - _globals['_WEBHOOKDELIVERYPROTO']._serialized_start=11142 - _globals['_WEBHOOKDELIVERYPROTO']._serialized_end=11345 - _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_start=11347 - _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_end=11411 - _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_start=11413 - _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_end=11516 - _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_start=11518 - _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_end=11544 - _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_start=11546 - _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_end=11573 - _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_start=11575 - _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_end=11602 - _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_start=11604 - _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_end=11632 - _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_start=11634 - _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_end=11664 - _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_start=11666 - _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_end=11722 - _globals['_SETHUGGINGFACETOKENREQUEST']._serialized_start=11724 - _globals['_SETHUGGINGFACETOKENREQUEST']._serialized_end=11785 - _globals['_SETHUGGINGFACETOKENRESPONSE']._serialized_start=11787 - _globals['_SETHUGGINGFACETOKENRESPONSE']._serialized_end=11907 - _globals['_GETHUGGINGFACETOKENSTATUSREQUEST']._serialized_start=11909 - _globals['_GETHUGGINGFACETOKENSTATUSREQUEST']._serialized_end=11943 - _globals['_GETHUGGINGFACETOKENSTATUSRESPONSE']._serialized_start=11945 - _globals['_GETHUGGINGFACETOKENSTATUSRESPONSE']._serialized_end=12065 - _globals['_DELETEHUGGINGFACETOKENREQUEST']._serialized_start=12067 - _globals['_DELETEHUGGINGFACETOKENREQUEST']._serialized_end=12098 - _globals['_DELETEHUGGINGFACETOKENRESPONSE']._serialized_start=12100 - _globals['_DELETEHUGGINGFACETOKENRESPONSE']._serialized_end=12149 - _globals['_VALIDATEHUGGINGFACETOKENREQUEST']._serialized_start=12151 - _globals['_VALIDATEHUGGINGFACETOKENREQUEST']._serialized_end=12184 - _globals['_VALIDATEHUGGINGFACETOKENRESPONSE']._serialized_start=12186 - _globals['_VALIDATEHUGGINGFACETOKENRESPONSE']._serialized_end=12276 - _globals['_GETPREFERENCESREQUEST']._serialized_start=12278 - _globals['_GETPREFERENCESREQUEST']._serialized_end=12315 - _globals['_GETPREFERENCESRESPONSE']._serialized_start=12318 - _globals['_GETPREFERENCESRESPONSE']._serialized_end=12500 - _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_start=12450 - _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_end=12500 - _globals['_SETPREFERENCESREQUEST']._serialized_start=12503 - _globals['_SETPREFERENCESREQUEST']._serialized_end=12709 - _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_start=12450 - _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_end=12500 - _globals['_SETPREFERENCESRESPONSE']._serialized_start=12712 - _globals['_SETPREFERENCESRESPONSE']._serialized_end=12981 - _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_start=12925 - _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_end=12981 - _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_start=12983 - _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_end=13036 - _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_start=13038 - _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_end=13105 - _globals['_GETSYNCSTATUSREQUEST']._serialized_start=13107 - _globals['_GETSYNCSTATUSREQUEST']._serialized_end=13150 - _globals['_GETSYNCSTATUSRESPONSE']._serialized_start=13153 - _globals['_GETSYNCSTATUSRESPONSE']._serialized_end=13371 - _globals['_LISTSYNCHISTORYREQUEST']._serialized_start=13373 - _globals['_LISTSYNCHISTORYREQUEST']._serialized_end=13452 - _globals['_LISTSYNCHISTORYRESPONSE']._serialized_start=13454 - _globals['_LISTSYNCHISTORYRESPONSE']._serialized_end=13538 - _globals['_SYNCRUNPROTO']._serialized_start=13541 - _globals['_SYNCRUNPROTO']._serialized_end=13715 - _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_start=13717 - _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_end=13745 - _globals['_INTEGRATIONINFO']._serialized_start=13747 - _globals['_INTEGRATIONINFO']._serialized_end=13842 - _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_start=13844 - _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_end=13922 - _globals['_GETRECENTLOGSREQUEST']._serialized_start=13924 - _globals['_GETRECENTLOGSREQUEST']._serialized_end=13992 - _globals['_GETRECENTLOGSRESPONSE']._serialized_start=13994 - _globals['_GETRECENTLOGSRESPONSE']._serialized_end=14056 - _globals['_LOGENTRYPROTO']._serialized_start=14059 - _globals['_LOGENTRYPROTO']._serialized_end=14340 - _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_start=14294 - _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_end=14340 - _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_start=14342 - _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_end=14395 - _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_start=14398 - _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_end=14533 - _globals['_PERFORMANCEMETRICSPOINT']._serialized_start=14536 - _globals['_PERFORMANCEMETRICSPOINT']._serialized_end=14777 - _globals['_CLAIMMAPPINGPROTO']._serialized_start=14780 - _globals['_CLAIMMAPPINGPROTO']._serialized_end=15116 - _globals['_OIDCDISCOVERYPROTO']._serialized_start=15119 - _globals['_OIDCDISCOVERYPROTO']._serialized_end=15494 - _globals['_OIDCPROVIDERPROTO']._serialized_start=15497 - _globals['_OIDCPROVIDERPROTO']._serialized_end=15950 - _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_start=15953 - _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_end=16321 - _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_start=16323 - _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_end=16415 - _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_start=16417 - _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_end=16513 - _globals['_GETOIDCPROVIDERREQUEST']._serialized_start=16515 - _globals['_GETOIDCPROVIDERREQUEST']._serialized_end=16560 - _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_start=16563 - _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_end=16852 - _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_start=16854 - _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_end=16902 - _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_start=16904 - _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_end=16949 - _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_start=16951 - _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_end=17066 - _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_start=17069 - _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_end=17263 - _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_start=17217 - _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_end=17263 - _globals['_LISTOIDCPRESETSREQUEST']._serialized_start=17265 - _globals['_LISTOIDCPRESETSREQUEST']._serialized_end=17289 - _globals['_OIDCPRESETPROTO']._serialized_start=17292 - _globals['_OIDCPRESETPROTO']._serialized_end=17476 - _globals['_LISTOIDCPRESETSRESPONSE']._serialized_start=17478 - _globals['_LISTOIDCPRESETSRESPONSE']._serialized_end=17547 - _globals['_EXPORTRULESPROTO']._serialized_start=17550 - _globals['_EXPORTRULESPROTO']._serialized_end=17784 - _globals['_TRIGGERRULESPROTO']._serialized_start=17787 - _globals['_TRIGGERRULESPROTO']._serialized_end=17923 - _globals['_WORKSPACESETTINGSPROTO']._serialized_start=17926 - _globals['_WORKSPACESETTINGSPROTO']._serialized_end=18219 - _globals['_PROJECTSETTINGSPROTO']._serialized_start=18222 - _globals['_PROJECTSETTINGSPROTO']._serialized_end=18513 - _globals['_PROJECTPROTO']._serialized_start=18516 - _globals['_PROJECTPROTO']._serialized_end=18839 - _globals['_PROJECTMEMBERSHIPPROTO']._serialized_start=18841 - _globals['_PROJECTMEMBERSHIPPROTO']._serialized_end=18963 - _globals['_CREATEPROJECTREQUEST']._serialized_start=18966 - _globals['_CREATEPROJECTREQUEST']._serialized_end=19162 - _globals['_GETPROJECTREQUEST']._serialized_start=19164 - _globals['_GETPROJECTREQUEST']._serialized_end=19203 - _globals['_GETPROJECTBYSLUGREQUEST']._serialized_start=19205 - _globals['_GETPROJECTBYSLUGREQUEST']._serialized_end=19266 - _globals['_LISTPROJECTSREQUEST']._serialized_start=19268 - _globals['_LISTPROJECTSREQUEST']._serialized_end=19368 - _globals['_LISTPROJECTSRESPONSE']._serialized_start=19370 - _globals['_LISTPROJECTSRESPONSE']._serialized_end=19455 - _globals['_UPDATEPROJECTREQUEST']._serialized_start=19458 - _globals['_UPDATEPROJECTREQUEST']._serialized_end=19666 - _globals['_ARCHIVEPROJECTREQUEST']._serialized_start=19668 - _globals['_ARCHIVEPROJECTREQUEST']._serialized_end=19711 - _globals['_RESTOREPROJECTREQUEST']._serialized_start=19713 - _globals['_RESTOREPROJECTREQUEST']._serialized_end=19756 - _globals['_DELETEPROJECTREQUEST']._serialized_start=19758 - _globals['_DELETEPROJECTREQUEST']._serialized_end=19800 - _globals['_DELETEPROJECTRESPONSE']._serialized_start=19802 - _globals['_DELETEPROJECTRESPONSE']._serialized_end=19842 - _globals['_SETACTIVEPROJECTREQUEST']._serialized_start=19844 - _globals['_SETACTIVEPROJECTREQUEST']._serialized_end=19911 - _globals['_SETACTIVEPROJECTRESPONSE']._serialized_start=19913 - _globals['_SETACTIVEPROJECTRESPONSE']._serialized_end=19939 - _globals['_GETACTIVEPROJECTREQUEST']._serialized_start=19941 - _globals['_GETACTIVEPROJECTREQUEST']._serialized_end=19988 - _globals['_GETACTIVEPROJECTRESPONSE']._serialized_start=19990 - _globals['_GETACTIVEPROJECTRESPONSE']._serialized_end=20097 - _globals['_ADDPROJECTMEMBERREQUEST']._serialized_start=20099 - _globals['_ADDPROJECTMEMBERREQUEST']._serialized_end=20203 - _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_start=20205 - _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_end=20316 - _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_start=20318 - _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_end=20383 - _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_start=20385 - _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_end=20431 - _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_start=20433 - _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_end=20511 - _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_start=20513 - _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_end=20613 - _globals['_GETCURRENTUSERREQUEST']._serialized_start=20615 - _globals['_GETCURRENTUSERREQUEST']._serialized_end=20638 - _globals['_GETCURRENTUSERRESPONSE']._serialized_start=20641 - _globals['_GETCURRENTUSERRESPONSE']._serialized_end=20828 - _globals['_WORKSPACEPROTO']._serialized_start=20830 - _globals['_WORKSPACEPROTO']._serialized_end=20920 - _globals['_LISTWORKSPACESREQUEST']._serialized_start=20922 - _globals['_LISTWORKSPACESREQUEST']._serialized_end=20976 - _globals['_LISTWORKSPACESRESPONSE']._serialized_start=20978 - _globals['_LISTWORKSPACESRESPONSE']._serialized_end=21069 - _globals['_SWITCHWORKSPACEREQUEST']._serialized_start=21071 - _globals['_SWITCHWORKSPACEREQUEST']._serialized_end=21117 - _globals['_SWITCHWORKSPACERESPONSE']._serialized_start=21119 - _globals['_SWITCHWORKSPACERESPONSE']._serialized_end=21229 - _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_start=21231 - _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_end=21282 - _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_start=21284 - _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_end=21390 - _globals['_NOTEFLOWSERVICE']._serialized_start=22919 - _globals['_NOTEFLOWSERVICE']._serialized_end=30703 + _globals['_STREAMINGCONFIGURATION']._serialized_start=6194 + _globals['_STREAMINGCONFIGURATION']._serialized_end=6427 + _globals['_GETSTREAMINGCONFIGURATIONREQUEST']._serialized_start=6429 + _globals['_GETSTREAMINGCONFIGURATIONREQUEST']._serialized_end=6463 + _globals['_GETSTREAMINGCONFIGURATIONRESPONSE']._serialized_start=6465 + _globals['_GETSTREAMINGCONFIGURATIONRESPONSE']._serialized_end=6557 + _globals['_UPDATESTREAMINGCONFIGURATIONREQUEST']._serialized_start=6560 + _globals['_UPDATESTREAMINGCONFIGURATIONREQUEST']._serialized_end=7015 + _globals['_UPDATESTREAMINGCONFIGURATIONRESPONSE']._serialized_start=7017 + _globals['_UPDATESTREAMINGCONFIGURATIONRESPONSE']._serialized_end=7112 + _globals['_ANNOTATION']._serialized_start=7115 + _globals['_ANNOTATION']._serialized_end=7303 + _globals['_ADDANNOTATIONREQUEST']._serialized_start=7306 + _globals['_ADDANNOTATIONREQUEST']._serialized_end=7472 + _globals['_GETANNOTATIONREQUEST']._serialized_start=7474 + _globals['_GETANNOTATIONREQUEST']._serialized_end=7519 + _globals['_LISTANNOTATIONSREQUEST']._serialized_start=7521 + _globals['_LISTANNOTATIONSREQUEST']._serialized_end=7603 + _globals['_LISTANNOTATIONSRESPONSE']._serialized_start=7605 + _globals['_LISTANNOTATIONSRESPONSE']._serialized_end=7673 + _globals['_UPDATEANNOTATIONREQUEST']._serialized_start=7676 + _globals['_UPDATEANNOTATIONREQUEST']._serialized_end=7848 + _globals['_DELETEANNOTATIONREQUEST']._serialized_start=7850 + _globals['_DELETEANNOTATIONREQUEST']._serialized_end=7898 + _globals['_DELETEANNOTATIONRESPONSE']._serialized_start=7900 + _globals['_DELETEANNOTATIONRESPONSE']._serialized_end=7943 + _globals['_PROCESSINGSTEPSTATE']._serialized_start=7946 + _globals['_PROCESSINGSTEPSTATE']._serialized_end=8080 + _globals['_PROCESSINGSTATUS']._serialized_start=8083 + _globals['_PROCESSINGSTATUS']._serialized_end=8250 + _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_start=8252 + _globals['_EXPORTTRANSCRIPTREQUEST']._serialized_end=8337 + _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_start=8339 + _globals['_EXPORTTRANSCRIPTRESPONSE']._serialized_end=8427 + _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_start=8429 + _globals['_REFINESPEAKERDIARIZATIONREQUEST']._serialized_end=8504 + _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_start=8507 + _globals['_REFINESPEAKERDIARIZATIONRESPONSE']._serialized_end=8664 + _globals['_RENAMESPEAKERREQUEST']._serialized_start=8666 + _globals['_RENAMESPEAKERREQUEST']._serialized_end=8758 + _globals['_RENAMESPEAKERRESPONSE']._serialized_start=8760 + _globals['_RENAMESPEAKERRESPONSE']._serialized_end=8826 + _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_start=8828 + _globals['_GETDIARIZATIONJOBSTATUSREQUEST']._serialized_end=8876 + _globals['_DIARIZATIONJOBSTATUS']._serialized_start=8879 + _globals['_DIARIZATIONJOBSTATUS']._serialized_end=9050 + _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_start=9052 + _globals['_CANCELDIARIZATIONJOBREQUEST']._serialized_end=9097 + _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_start=9099 + _globals['_CANCELDIARIZATIONJOBRESPONSE']._serialized_end=9206 + _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_start=9208 + _globals['_GETACTIVEDIARIZATIONJOBSREQUEST']._serialized_end=9241 + _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_start=9243 + _globals['_GETACTIVEDIARIZATIONJOBSRESPONSE']._serialized_end=9323 + _globals['_EXTRACTENTITIESREQUEST']._serialized_start=9325 + _globals['_EXTRACTENTITIESREQUEST']._serialized_end=9392 + _globals['_EXTRACTEDENTITY']._serialized_start=9394 + _globals['_EXTRACTEDENTITY']._serialized_end=9515 + _globals['_EXTRACTENTITIESRESPONSE']._serialized_start=9517 + _globals['_EXTRACTENTITIESRESPONSE']._serialized_end=9624 + _globals['_UPDATEENTITYREQUEST']._serialized_start=9626 + _globals['_UPDATEENTITYREQUEST']._serialized_end=9718 + _globals['_UPDATEENTITYRESPONSE']._serialized_start=9720 + _globals['_UPDATEENTITYRESPONSE']._serialized_end=9785 + _globals['_DELETEENTITYREQUEST']._serialized_start=9787 + _globals['_DELETEENTITYREQUEST']._serialized_end=9847 + _globals['_DELETEENTITYRESPONSE']._serialized_start=9849 + _globals['_DELETEENTITYRESPONSE']._serialized_end=9888 + _globals['_CALENDAREVENT']._serialized_start=9891 + _globals['_CALENDAREVENT']._serialized_end=10090 + _globals['_LISTCALENDAREVENTSREQUEST']._serialized_start=10092 + _globals['_LISTCALENDAREVENTSREQUEST']._serialized_end=10173 + _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_start=10175 + _globals['_LISTCALENDAREVENTSRESPONSE']._serialized_end=10265 + _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_start=10267 + _globals['_GETCALENDARPROVIDERSREQUEST']._serialized_end=10296 + _globals['_CALENDARPROVIDER']._serialized_start=10298 + _globals['_CALENDARPROVIDER']._serialized_end=10378 + _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_start=10380 + _globals['_GETCALENDARPROVIDERSRESPONSE']._serialized_end=10457 + _globals['_INITIATEOAUTHREQUEST']._serialized_start=10459 + _globals['_INITIATEOAUTHREQUEST']._serialized_end=10547 + _globals['_INITIATEOAUTHRESPONSE']._serialized_start=10549 + _globals['_INITIATEOAUTHRESPONSE']._serialized_end=10605 + _globals['_COMPLETEOAUTHREQUEST']._serialized_start=10607 + _globals['_COMPLETEOAUTHREQUEST']._serialized_end=10676 + _globals['_COMPLETEOAUTHRESPONSE']._serialized_start=10678 + _globals['_COMPLETEOAUTHRESPONSE']._serialized_end=10789 + _globals['_OAUTHCONNECTION']._serialized_start=10792 + _globals['_OAUTHCONNECTION']._serialized_end=10927 + _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_start=10929 + _globals['_GETOAUTHCONNECTIONSTATUSREQUEST']._serialized_end=11006 + _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_start=11008 + _globals['_GETOAUTHCONNECTIONSTATUSRESPONSE']._serialized_end=11089 + _globals['_DISCONNECTOAUTHREQUEST']._serialized_start=11091 + _globals['_DISCONNECTOAUTHREQUEST']._serialized_end=11159 + _globals['_DISCONNECTOAUTHRESPONSE']._serialized_start=11161 + _globals['_DISCONNECTOAUTHRESPONSE']._serialized_end=11226 + _globals['_REGISTERWEBHOOKREQUEST']._serialized_start=11229 + _globals['_REGISTERWEBHOOKREQUEST']._serialized_end=11375 + _globals['_WEBHOOKCONFIGPROTO']._serialized_start=11378 + _globals['_WEBHOOKCONFIGPROTO']._serialized_end=11573 + _globals['_LISTWEBHOOKSREQUEST']._serialized_start=11575 + _globals['_LISTWEBHOOKSREQUEST']._serialized_end=11618 + _globals['_LISTWEBHOOKSRESPONSE']._serialized_start=11620 + _globals['_LISTWEBHOOKSRESPONSE']._serialized_end=11711 + _globals['_UPDATEWEBHOOKREQUEST']._serialized_start=11714 + _globals['_UPDATEWEBHOOKREQUEST']._serialized_end=11974 + _globals['_DELETEWEBHOOKREQUEST']._serialized_start=11976 + _globals['_DELETEWEBHOOKREQUEST']._serialized_end=12018 + _globals['_DELETEWEBHOOKRESPONSE']._serialized_start=12020 + _globals['_DELETEWEBHOOKRESPONSE']._serialized_end=12060 + _globals['_WEBHOOKDELIVERYPROTO']._serialized_start=12063 + _globals['_WEBHOOKDELIVERYPROTO']._serialized_end=12266 + _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_start=12268 + _globals['_GETWEBHOOKDELIVERIESREQUEST']._serialized_end=12332 + _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_start=12334 + _globals['_GETWEBHOOKDELIVERIESRESPONSE']._serialized_end=12437 + _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_start=12439 + _globals['_GRANTCLOUDCONSENTREQUEST']._serialized_end=12465 + _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_start=12467 + _globals['_GRANTCLOUDCONSENTRESPONSE']._serialized_end=12494 + _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_start=12496 + _globals['_REVOKECLOUDCONSENTREQUEST']._serialized_end=12523 + _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_start=12525 + _globals['_REVOKECLOUDCONSENTRESPONSE']._serialized_end=12553 + _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_start=12555 + _globals['_GETCLOUDCONSENTSTATUSREQUEST']._serialized_end=12585 + _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_start=12587 + _globals['_GETCLOUDCONSENTSTATUSRESPONSE']._serialized_end=12643 + _globals['_SETHUGGINGFACETOKENREQUEST']._serialized_start=12645 + _globals['_SETHUGGINGFACETOKENREQUEST']._serialized_end=12706 + _globals['_SETHUGGINGFACETOKENRESPONSE']._serialized_start=12708 + _globals['_SETHUGGINGFACETOKENRESPONSE']._serialized_end=12828 + _globals['_GETHUGGINGFACETOKENSTATUSREQUEST']._serialized_start=12830 + _globals['_GETHUGGINGFACETOKENSTATUSREQUEST']._serialized_end=12864 + _globals['_GETHUGGINGFACETOKENSTATUSRESPONSE']._serialized_start=12866 + _globals['_GETHUGGINGFACETOKENSTATUSRESPONSE']._serialized_end=12986 + _globals['_DELETEHUGGINGFACETOKENREQUEST']._serialized_start=12988 + _globals['_DELETEHUGGINGFACETOKENREQUEST']._serialized_end=13019 + _globals['_DELETEHUGGINGFACETOKENRESPONSE']._serialized_start=13021 + _globals['_DELETEHUGGINGFACETOKENRESPONSE']._serialized_end=13070 + _globals['_VALIDATEHUGGINGFACETOKENREQUEST']._serialized_start=13072 + _globals['_VALIDATEHUGGINGFACETOKENREQUEST']._serialized_end=13105 + _globals['_VALIDATEHUGGINGFACETOKENRESPONSE']._serialized_start=13107 + _globals['_VALIDATEHUGGINGFACETOKENRESPONSE']._serialized_end=13197 + _globals['_GETPREFERENCESREQUEST']._serialized_start=13199 + _globals['_GETPREFERENCESREQUEST']._serialized_end=13236 + _globals['_GETPREFERENCESRESPONSE']._serialized_start=13239 + _globals['_GETPREFERENCESRESPONSE']._serialized_end=13421 + _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_start=13371 + _globals['_GETPREFERENCESRESPONSE_PREFERENCESENTRY']._serialized_end=13421 + _globals['_SETPREFERENCESREQUEST']._serialized_start=13424 + _globals['_SETPREFERENCESREQUEST']._serialized_end=13630 + _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_start=13371 + _globals['_SETPREFERENCESREQUEST_PREFERENCESENTRY']._serialized_end=13421 + _globals['_SETPREFERENCESRESPONSE']._serialized_start=13633 + _globals['_SETPREFERENCESRESPONSE']._serialized_end=13902 + _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_start=13846 + _globals['_SETPREFERENCESRESPONSE_SERVERPREFERENCESENTRY']._serialized_end=13902 + _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_start=13904 + _globals['_STARTINTEGRATIONSYNCREQUEST']._serialized_end=13957 + _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_start=13959 + _globals['_STARTINTEGRATIONSYNCRESPONSE']._serialized_end=14026 + _globals['_GETSYNCSTATUSREQUEST']._serialized_start=14028 + _globals['_GETSYNCSTATUSREQUEST']._serialized_end=14071 + _globals['_GETSYNCSTATUSRESPONSE']._serialized_start=14074 + _globals['_GETSYNCSTATUSRESPONSE']._serialized_end=14292 + _globals['_LISTSYNCHISTORYREQUEST']._serialized_start=14294 + _globals['_LISTSYNCHISTORYREQUEST']._serialized_end=14373 + _globals['_LISTSYNCHISTORYRESPONSE']._serialized_start=14375 + _globals['_LISTSYNCHISTORYRESPONSE']._serialized_end=14459 + _globals['_SYNCRUNPROTO']._serialized_start=14462 + _globals['_SYNCRUNPROTO']._serialized_end=14636 + _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_start=14638 + _globals['_GETUSERINTEGRATIONSREQUEST']._serialized_end=14666 + _globals['_INTEGRATIONINFO']._serialized_start=14668 + _globals['_INTEGRATIONINFO']._serialized_end=14763 + _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_start=14765 + _globals['_GETUSERINTEGRATIONSRESPONSE']._serialized_end=14843 + _globals['_GETRECENTLOGSREQUEST']._serialized_start=14845 + _globals['_GETRECENTLOGSREQUEST']._serialized_end=14913 + _globals['_GETRECENTLOGSRESPONSE']._serialized_start=14915 + _globals['_GETRECENTLOGSRESPONSE']._serialized_end=14977 + _globals['_LOGENTRYPROTO']._serialized_start=14980 + _globals['_LOGENTRYPROTO']._serialized_end=15261 + _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_start=15215 + _globals['_LOGENTRYPROTO_DETAILSENTRY']._serialized_end=15261 + _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_start=15263 + _globals['_GETPERFORMANCEMETRICSREQUEST']._serialized_end=15316 + _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_start=15319 + _globals['_GETPERFORMANCEMETRICSRESPONSE']._serialized_end=15454 + _globals['_PERFORMANCEMETRICSPOINT']._serialized_start=15457 + _globals['_PERFORMANCEMETRICSPOINT']._serialized_end=15698 + _globals['_CLAIMMAPPINGPROTO']._serialized_start=15701 + _globals['_CLAIMMAPPINGPROTO']._serialized_end=16037 + _globals['_OIDCDISCOVERYPROTO']._serialized_start=16040 + _globals['_OIDCDISCOVERYPROTO']._serialized_end=16415 + _globals['_OIDCPROVIDERPROTO']._serialized_start=16418 + _globals['_OIDCPROVIDERPROTO']._serialized_end=16871 + _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_start=16874 + _globals['_REGISTEROIDCPROVIDERREQUEST']._serialized_end=17242 + _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_start=17244 + _globals['_LISTOIDCPROVIDERSREQUEST']._serialized_end=17336 + _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_start=17338 + _globals['_LISTOIDCPROVIDERSRESPONSE']._serialized_end=17434 + _globals['_GETOIDCPROVIDERREQUEST']._serialized_start=17436 + _globals['_GETOIDCPROVIDERREQUEST']._serialized_end=17481 + _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_start=17484 + _globals['_UPDATEOIDCPROVIDERREQUEST']._serialized_end=17773 + _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_start=17775 + _globals['_DELETEOIDCPROVIDERREQUEST']._serialized_end=17823 + _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_start=17825 + _globals['_DELETEOIDCPROVIDERRESPONSE']._serialized_end=17870 + _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_start=17872 + _globals['_REFRESHOIDCDISCOVERYREQUEST']._serialized_end=17987 + _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_start=17990 + _globals['_REFRESHOIDCDISCOVERYRESPONSE']._serialized_end=18184 + _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_start=18138 + _globals['_REFRESHOIDCDISCOVERYRESPONSE_RESULTSENTRY']._serialized_end=18184 + _globals['_LISTOIDCPRESETSREQUEST']._serialized_start=18186 + _globals['_LISTOIDCPRESETSREQUEST']._serialized_end=18210 + _globals['_OIDCPRESETPROTO']._serialized_start=18213 + _globals['_OIDCPRESETPROTO']._serialized_end=18397 + _globals['_LISTOIDCPRESETSRESPONSE']._serialized_start=18399 + _globals['_LISTOIDCPRESETSRESPONSE']._serialized_end=18468 + _globals['_EXPORTRULESPROTO']._serialized_start=18471 + _globals['_EXPORTRULESPROTO']._serialized_end=18705 + _globals['_TRIGGERRULESPROTO']._serialized_start=18708 + _globals['_TRIGGERRULESPROTO']._serialized_end=18844 + _globals['_WORKSPACESETTINGSPROTO']._serialized_start=18847 + _globals['_WORKSPACESETTINGSPROTO']._serialized_end=19140 + _globals['_PROJECTSETTINGSPROTO']._serialized_start=19143 + _globals['_PROJECTSETTINGSPROTO']._serialized_end=19434 + _globals['_PROJECTPROTO']._serialized_start=19437 + _globals['_PROJECTPROTO']._serialized_end=19760 + _globals['_PROJECTMEMBERSHIPPROTO']._serialized_start=19762 + _globals['_PROJECTMEMBERSHIPPROTO']._serialized_end=19884 + _globals['_CREATEPROJECTREQUEST']._serialized_start=19887 + _globals['_CREATEPROJECTREQUEST']._serialized_end=20083 + _globals['_GETPROJECTREQUEST']._serialized_start=20085 + _globals['_GETPROJECTREQUEST']._serialized_end=20124 + _globals['_GETPROJECTBYSLUGREQUEST']._serialized_start=20126 + _globals['_GETPROJECTBYSLUGREQUEST']._serialized_end=20187 + _globals['_LISTPROJECTSREQUEST']._serialized_start=20189 + _globals['_LISTPROJECTSREQUEST']._serialized_end=20289 + _globals['_LISTPROJECTSRESPONSE']._serialized_start=20291 + _globals['_LISTPROJECTSRESPONSE']._serialized_end=20376 + _globals['_UPDATEPROJECTREQUEST']._serialized_start=20379 + _globals['_UPDATEPROJECTREQUEST']._serialized_end=20587 + _globals['_ARCHIVEPROJECTREQUEST']._serialized_start=20589 + _globals['_ARCHIVEPROJECTREQUEST']._serialized_end=20632 + _globals['_RESTOREPROJECTREQUEST']._serialized_start=20634 + _globals['_RESTOREPROJECTREQUEST']._serialized_end=20677 + _globals['_DELETEPROJECTREQUEST']._serialized_start=20679 + _globals['_DELETEPROJECTREQUEST']._serialized_end=20721 + _globals['_DELETEPROJECTRESPONSE']._serialized_start=20723 + _globals['_DELETEPROJECTRESPONSE']._serialized_end=20763 + _globals['_SETACTIVEPROJECTREQUEST']._serialized_start=20765 + _globals['_SETACTIVEPROJECTREQUEST']._serialized_end=20832 + _globals['_SETACTIVEPROJECTRESPONSE']._serialized_start=20834 + _globals['_SETACTIVEPROJECTRESPONSE']._serialized_end=20860 + _globals['_GETACTIVEPROJECTREQUEST']._serialized_start=20862 + _globals['_GETACTIVEPROJECTREQUEST']._serialized_end=20909 + _globals['_GETACTIVEPROJECTRESPONSE']._serialized_start=20911 + _globals['_GETACTIVEPROJECTRESPONSE']._serialized_end=21018 + _globals['_ADDPROJECTMEMBERREQUEST']._serialized_start=21020 + _globals['_ADDPROJECTMEMBERREQUEST']._serialized_end=21124 + _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_start=21126 + _globals['_UPDATEPROJECTMEMBERROLEREQUEST']._serialized_end=21237 + _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_start=21239 + _globals['_REMOVEPROJECTMEMBERREQUEST']._serialized_end=21304 + _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_start=21306 + _globals['_REMOVEPROJECTMEMBERRESPONSE']._serialized_end=21352 + _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_start=21354 + _globals['_LISTPROJECTMEMBERSREQUEST']._serialized_end=21432 + _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_start=21434 + _globals['_LISTPROJECTMEMBERSRESPONSE']._serialized_end=21534 + _globals['_GETCURRENTUSERREQUEST']._serialized_start=21536 + _globals['_GETCURRENTUSERREQUEST']._serialized_end=21559 + _globals['_GETCURRENTUSERRESPONSE']._serialized_start=21562 + _globals['_GETCURRENTUSERRESPONSE']._serialized_end=21749 + _globals['_WORKSPACEPROTO']._serialized_start=21751 + _globals['_WORKSPACEPROTO']._serialized_end=21841 + _globals['_LISTWORKSPACESREQUEST']._serialized_start=21843 + _globals['_LISTWORKSPACESREQUEST']._serialized_end=21897 + _globals['_LISTWORKSPACESRESPONSE']._serialized_start=21899 + _globals['_LISTWORKSPACESRESPONSE']._serialized_end=21990 + _globals['_SWITCHWORKSPACEREQUEST']._serialized_start=21992 + _globals['_SWITCHWORKSPACEREQUEST']._serialized_end=22038 + _globals['_SWITCHWORKSPACERESPONSE']._serialized_start=22040 + _globals['_SWITCHWORKSPACERESPONSE']._serialized_end=22150 + _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_start=22152 + _globals['_GETWORKSPACESETTINGSREQUEST']._serialized_end=22203 + _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_start=22205 + _globals['_UPDATEWORKSPACESETTINGSREQUEST']._serialized_end=22311 + _globals['_NOTEFLOWSERVICE']._serialized_start=23840 + _globals['_NOTEFLOWSERVICE']._serialized_end=31869 # @@protoc_insertion_point(module_scope) diff --git a/src/noteflow/grpc/proto/noteflow_pb2.pyi b/src/noteflow/grpc/proto/noteflow_pb2.pyi index 41cb6c7..fabc8fd 100644 --- a/src/noteflow/grpc/proto/noteflow_pb2.pyi +++ b/src/noteflow/grpc/proto/noteflow_pb2.pyi @@ -1,5662 +1,2130 @@ -""" -@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 +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 AsrDevice(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + ASR_DEVICE_UNSPECIFIED: _ClassVar[AsrDevice] + ASR_DEVICE_CPU: _ClassVar[AsrDevice] + ASR_DEVICE_CUDA: _ClassVar[AsrDevice] + +class AsrComputeType(int, metaclass=_enum_type_wrapper.EnumTypeWrapper): + __slots__ = () + ASR_COMPUTE_TYPE_UNSPECIFIED: _ClassVar[AsrComputeType] + ASR_COMPUTE_TYPE_INT8: _ClassVar[AsrComputeType] + ASR_COMPUTE_TYPE_FLOAT16: _ClassVar[AsrComputeType] + ASR_COMPUTE_TYPE_FLOAT32: _ClassVar[AsrComputeType] + +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 +ASR_DEVICE_UNSPECIFIED: AsrDevice +ASR_DEVICE_CPU: AsrDevice +ASR_DEVICE_CUDA: AsrDevice +ASR_COMPUTE_TYPE_UNSPECIFIED: AsrComputeType +ASR_COMPUTE_TYPE_INT8: AsrComputeType +ASR_COMPUTE_TYPE_FLOAT16: AsrComputeType +ASR_COMPUTE_TYPE_FLOAT32: AsrComputeType +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", "system_ram_total_bytes", "system_ram_available_bytes", "gpu_vram_total_bytes", "gpu_vram_available_bytes") + 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] + SYSTEM_RAM_TOTAL_BYTES_FIELD_NUMBER: _ClassVar[int] + SYSTEM_RAM_AVAILABLE_BYTES_FIELD_NUMBER: _ClassVar[int] + GPU_VRAM_TOTAL_BYTES_FIELD_NUMBER: _ClassVar[int] + GPU_VRAM_AVAILABLE_BYTES_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 + system_ram_total_bytes: int + system_ram_available_bytes: int + gpu_vram_total_bytes: int + gpu_vram_available_bytes: 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] = ..., system_ram_total_bytes: _Optional[int] = ..., system_ram_available_bytes: _Optional[int] = ..., gpu_vram_total_bytes: _Optional[int] = ..., gpu_vram_available_bytes: _Optional[int] = ...) -> None: ... + +class AsrConfiguration(_message.Message): + __slots__ = ("model_size", "device", "compute_type", "is_ready", "cuda_available", "available_model_sizes", "available_compute_types") + MODEL_SIZE_FIELD_NUMBER: _ClassVar[int] + DEVICE_FIELD_NUMBER: _ClassVar[int] + COMPUTE_TYPE_FIELD_NUMBER: _ClassVar[int] + IS_READY_FIELD_NUMBER: _ClassVar[int] + CUDA_AVAILABLE_FIELD_NUMBER: _ClassVar[int] + AVAILABLE_MODEL_SIZES_FIELD_NUMBER: _ClassVar[int] + AVAILABLE_COMPUTE_TYPES_FIELD_NUMBER: _ClassVar[int] + model_size: str + device: AsrDevice + compute_type: AsrComputeType + is_ready: bool + cuda_available: bool + available_model_sizes: _containers.RepeatedScalarFieldContainer[str] + available_compute_types: _containers.RepeatedScalarFieldContainer[AsrComputeType] + def __init__(self, model_size: _Optional[str] = ..., device: _Optional[_Union[AsrDevice, str]] = ..., compute_type: _Optional[_Union[AsrComputeType, str]] = ..., is_ready: bool = ..., cuda_available: bool = ..., available_model_sizes: _Optional[_Iterable[str]] = ..., available_compute_types: _Optional[_Iterable[_Union[AsrComputeType, str]]] = ...) -> None: ... + +class GetAsrConfigurationRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetAsrConfigurationResponse(_message.Message): + __slots__ = ("configuration",) + CONFIGURATION_FIELD_NUMBER: _ClassVar[int] + configuration: AsrConfiguration + def __init__(self, configuration: _Optional[_Union[AsrConfiguration, _Mapping]] = ...) -> None: ... + +class UpdateAsrConfigurationRequest(_message.Message): + __slots__ = ("model_size", "device", "compute_type") + MODEL_SIZE_FIELD_NUMBER: _ClassVar[int] + DEVICE_FIELD_NUMBER: _ClassVar[int] + COMPUTE_TYPE_FIELD_NUMBER: _ClassVar[int] + model_size: str + device: AsrDevice + compute_type: AsrComputeType + def __init__(self, model_size: _Optional[str] = ..., device: _Optional[_Union[AsrDevice, str]] = ..., compute_type: _Optional[_Union[AsrComputeType, str]] = ...) -> None: ... + +class UpdateAsrConfigurationResponse(_message.Message): + __slots__ = ("job_id", "status", "error_message", "accepted") + JOB_ID_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] + ACCEPTED_FIELD_NUMBER: _ClassVar[int] + job_id: str + status: JobStatus + error_message: str + accepted: bool + def __init__(self, job_id: _Optional[str] = ..., status: _Optional[_Union[JobStatus, str]] = ..., error_message: _Optional[str] = ..., accepted: bool = ...) -> None: ... + +class GetAsrConfigurationJobStatusRequest(_message.Message): + __slots__ = ("job_id",) + JOB_ID_FIELD_NUMBER: _ClassVar[int] + job_id: str + def __init__(self, job_id: _Optional[str] = ...) -> None: ... + +class AsrConfigurationJobStatus(_message.Message): + __slots__ = ("job_id", "status", "progress_percent", "phase", "error_message", "new_configuration") + JOB_ID_FIELD_NUMBER: _ClassVar[int] + STATUS_FIELD_NUMBER: _ClassVar[int] + PROGRESS_PERCENT_FIELD_NUMBER: _ClassVar[int] + PHASE_FIELD_NUMBER: _ClassVar[int] + ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] + NEW_CONFIGURATION_FIELD_NUMBER: _ClassVar[int] + job_id: str + status: JobStatus + progress_percent: float + phase: str + error_message: str + new_configuration: AsrConfiguration + def __init__(self, job_id: _Optional[str] = ..., status: _Optional[_Union[JobStatus, str]] = ..., progress_percent: _Optional[float] = ..., phase: _Optional[str] = ..., error_message: _Optional[str] = ..., new_configuration: _Optional[_Union[AsrConfiguration, _Mapping]] = ...) -> None: ... + +class StreamingConfiguration(_message.Message): + __slots__ = ("partial_cadence_seconds", "min_partial_audio_seconds", "max_segment_duration_seconds", "min_speech_duration_seconds", "trailing_silence_seconds", "leading_buffer_seconds") + PARTIAL_CADENCE_SECONDS_FIELD_NUMBER: _ClassVar[int] + MIN_PARTIAL_AUDIO_SECONDS_FIELD_NUMBER: _ClassVar[int] + MAX_SEGMENT_DURATION_SECONDS_FIELD_NUMBER: _ClassVar[int] + MIN_SPEECH_DURATION_SECONDS_FIELD_NUMBER: _ClassVar[int] + TRAILING_SILENCE_SECONDS_FIELD_NUMBER: _ClassVar[int] + LEADING_BUFFER_SECONDS_FIELD_NUMBER: _ClassVar[int] + partial_cadence_seconds: float + min_partial_audio_seconds: float + max_segment_duration_seconds: float + min_speech_duration_seconds: float + trailing_silence_seconds: float + leading_buffer_seconds: float + def __init__(self, partial_cadence_seconds: _Optional[float] = ..., min_partial_audio_seconds: _Optional[float] = ..., max_segment_duration_seconds: _Optional[float] = ..., min_speech_duration_seconds: _Optional[float] = ..., trailing_silence_seconds: _Optional[float] = ..., leading_buffer_seconds: _Optional[float] = ...) -> None: ... + +class GetStreamingConfigurationRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetStreamingConfigurationResponse(_message.Message): + __slots__ = ("configuration",) + CONFIGURATION_FIELD_NUMBER: _ClassVar[int] + configuration: StreamingConfiguration + def __init__(self, configuration: _Optional[_Union[StreamingConfiguration, _Mapping]] = ...) -> None: ... + +class UpdateStreamingConfigurationRequest(_message.Message): + __slots__ = ("partial_cadence_seconds", "min_partial_audio_seconds", "max_segment_duration_seconds", "min_speech_duration_seconds", "trailing_silence_seconds", "leading_buffer_seconds") + PARTIAL_CADENCE_SECONDS_FIELD_NUMBER: _ClassVar[int] + MIN_PARTIAL_AUDIO_SECONDS_FIELD_NUMBER: _ClassVar[int] + MAX_SEGMENT_DURATION_SECONDS_FIELD_NUMBER: _ClassVar[int] + MIN_SPEECH_DURATION_SECONDS_FIELD_NUMBER: _ClassVar[int] + TRAILING_SILENCE_SECONDS_FIELD_NUMBER: _ClassVar[int] + LEADING_BUFFER_SECONDS_FIELD_NUMBER: _ClassVar[int] + partial_cadence_seconds: float + min_partial_audio_seconds: float + max_segment_duration_seconds: float + min_speech_duration_seconds: float + trailing_silence_seconds: float + leading_buffer_seconds: float + def __init__(self, partial_cadence_seconds: _Optional[float] = ..., min_partial_audio_seconds: _Optional[float] = ..., max_segment_duration_seconds: _Optional[float] = ..., min_speech_duration_seconds: _Optional[float] = ..., trailing_silence_seconds: _Optional[float] = ..., leading_buffer_seconds: _Optional[float] = ...) -> None: ... + +class UpdateStreamingConfigurationResponse(_message.Message): + __slots__ = ("configuration",) + CONFIGURATION_FIELD_NUMBER: _ClassVar[int] + configuration: StreamingConfiguration + def __init__(self, configuration: _Optional[_Union[StreamingConfiguration, _Mapping]] = ...) -> 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 SetHuggingFaceTokenRequest(_message.Message): + __slots__ = ("token", "validate") + TOKEN_FIELD_NUMBER: _ClassVar[int] + VALIDATE_FIELD_NUMBER: _ClassVar[int] + token: str + validate: bool + def __init__(self, token: _Optional[str] = ..., validate: bool = ...) -> None: ... + +class SetHuggingFaceTokenResponse(_message.Message): + __slots__ = ("success", "valid", "validation_error", "username") + SUCCESS_FIELD_NUMBER: _ClassVar[int] + VALID_FIELD_NUMBER: _ClassVar[int] + VALIDATION_ERROR_FIELD_NUMBER: _ClassVar[int] + USERNAME_FIELD_NUMBER: _ClassVar[int] + success: bool + valid: bool + validation_error: str + username: str + def __init__(self, success: bool = ..., valid: bool = ..., validation_error: _Optional[str] = ..., username: _Optional[str] = ...) -> None: ... + +class GetHuggingFaceTokenStatusRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class GetHuggingFaceTokenStatusResponse(_message.Message): + __slots__ = ("is_configured", "is_validated", "username", "validated_at") + IS_CONFIGURED_FIELD_NUMBER: _ClassVar[int] + IS_VALIDATED_FIELD_NUMBER: _ClassVar[int] + USERNAME_FIELD_NUMBER: _ClassVar[int] + VALIDATED_AT_FIELD_NUMBER: _ClassVar[int] + is_configured: bool + is_validated: bool + username: str + validated_at: float + def __init__(self, is_configured: bool = ..., is_validated: bool = ..., username: _Optional[str] = ..., validated_at: _Optional[float] = ...) -> None: ... + +class DeleteHuggingFaceTokenRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class DeleteHuggingFaceTokenResponse(_message.Message): + __slots__ = ("success",) + SUCCESS_FIELD_NUMBER: _ClassVar[int] + success: bool + def __init__(self, success: bool = ...) -> None: ... + +class ValidateHuggingFaceTokenRequest(_message.Message): + __slots__ = () + def __init__(self) -> None: ... + +class ValidateHuggingFaceTokenResponse(_message.Message): + __slots__ = ("valid", "username", "error_message") + VALID_FIELD_NUMBER: _ClassVar[int] + USERNAME_FIELD_NUMBER: _ClassVar[int] + ERROR_MESSAGE_FIELD_NUMBER: _ClassVar[int] + valid: bool + username: str + error_message: str + def __init__(self, valid: bool = ..., username: _Optional[str] = ..., error_message: _Optional[str] = ...) -> 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: ... diff --git a/src/noteflow/grpc/proto/noteflow_pb2_grpc.py b/src/noteflow/grpc/proto/noteflow_pb2_grpc.py index e8e8e91..5dfa573 100644 --- a/src/noteflow/grpc/proto/noteflow_pb2_grpc.py +++ b/src/noteflow/grpc/proto/noteflow_pb2_grpc.py @@ -3,7 +3,7 @@ import grpc import warnings -import noteflow_pb2 as noteflow__pb2 +from . import noteflow_pb2 as noteflow__pb2 GRPC_GENERATED_VERSION = '1.76.0' GRPC_VERSION = grpc.__version__ @@ -183,6 +183,16 @@ class NoteFlowServiceStub(object): request_serializer=noteflow__pb2.GetAsrConfigurationJobStatusRequest.SerializeToString, response_deserializer=noteflow__pb2.AsrConfigurationJobStatus.FromString, _registered_method=True) + self.GetStreamingConfiguration = channel.unary_unary( + '/noteflow.NoteFlowService/GetStreamingConfiguration', + request_serializer=noteflow__pb2.GetStreamingConfigurationRequest.SerializeToString, + response_deserializer=noteflow__pb2.GetStreamingConfigurationResponse.FromString, + _registered_method=True) + self.UpdateStreamingConfiguration = channel.unary_unary( + '/noteflow.NoteFlowService/UpdateStreamingConfiguration', + request_serializer=noteflow__pb2.UpdateStreamingConfigurationRequest.SerializeToString, + response_deserializer=noteflow__pb2.UpdateStreamingConfigurationResponse.FromString, + _registered_method=True) self.ExtractEntities = channel.unary_unary( '/noteflow.NoteFlowService/ExtractEntities', request_serializer=noteflow__pb2.ExtractEntitiesRequest.SerializeToString, @@ -650,6 +660,19 @@ class NoteFlowServiceServicer(object): context.set_details('Method not implemented!') raise NotImplementedError('Method not implemented!') + def GetStreamingConfiguration(self, request, context): + """Streaming configuration (Sprint 20) + """ + context.set_code(grpc.StatusCode.UNIMPLEMENTED) + context.set_details('Method not implemented!') + raise NotImplementedError('Method not implemented!') + + def UpdateStreamingConfiguration(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) """ @@ -1143,6 +1166,16 @@ def add_NoteFlowServiceServicer_to_server(servicer, server): request_deserializer=noteflow__pb2.GetAsrConfigurationJobStatusRequest.FromString, response_serializer=noteflow__pb2.AsrConfigurationJobStatus.SerializeToString, ), + 'GetStreamingConfiguration': grpc.unary_unary_rpc_method_handler( + servicer.GetStreamingConfiguration, + request_deserializer=noteflow__pb2.GetStreamingConfigurationRequest.FromString, + response_serializer=noteflow__pb2.GetStreamingConfigurationResponse.SerializeToString, + ), + 'UpdateStreamingConfiguration': grpc.unary_unary_rpc_method_handler( + servicer.UpdateStreamingConfiguration, + request_deserializer=noteflow__pb2.UpdateStreamingConfigurationRequest.FromString, + response_serializer=noteflow__pb2.UpdateStreamingConfigurationResponse.SerializeToString, + ), 'ExtractEntities': grpc.unary_unary_rpc_method_handler( servicer.ExtractEntities, request_deserializer=noteflow__pb2.ExtractEntitiesRequest.FromString, @@ -2216,6 +2249,60 @@ class NoteFlowService(object): metadata, _registered_method=True) + @staticmethod + def GetStreamingConfiguration(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/GetStreamingConfiguration', + noteflow__pb2.GetStreamingConfigurationRequest.SerializeToString, + noteflow__pb2.GetStreamingConfigurationResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + + @staticmethod + def UpdateStreamingConfiguration(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/UpdateStreamingConfiguration', + noteflow__pb2.UpdateStreamingConfigurationRequest.SerializeToString, + noteflow__pb2.UpdateStreamingConfigurationResponse.FromString, + options, + channel_credentials, + insecure, + call_credentials, + compression, + wait_for_ready, + timeout, + metadata, + _registered_method=True) + @staticmethod def ExtractEntities(request, target, diff --git a/src/noteflow/grpc/server/__init__.py b/src/noteflow/grpc/server/__init__.py index 4573bdf..bf938ef 100644 --- a/src/noteflow/grpc/server/__init__.py +++ b/src/noteflow/grpc/server/__init__.py @@ -13,7 +13,14 @@ from pydantic import ValidationError from noteflow.application.services.asr_config_persistence import ( resolve_asr_config_preference, ) -from noteflow.config.constants import DEFAULT_GRPC_PORT, SETTING_ASR_CONFIG +from noteflow.application.services.streaming_config_persistence import ( + StreamingConfig, + build_default_streaming_config, +) +from noteflow.config.constants import ( + DEFAULT_GRPC_PORT, + SETTING_ASR_CONFIG, +) from noteflow.config.constants.core import MAIN_MODULE_NAME from noteflow.config.settings import get_settings from noteflow.infrastructure.logging import LoggingConfig, configure_logging, get_logger @@ -33,6 +40,7 @@ from ._bootstrap import ( from ._lifecycle import load_asr_engine, stop_server from ._services import build_servicer, ensure_services from ._setup import bind_server, create_server +from ._streaming_config import load_streaming_config_from_preferences from ._types import ServerInitKwargs if TYPE_CHECKING: @@ -75,8 +83,6 @@ async def _read_asr_config_preference( return await uow.preferences.get(SETTING_ASR_CONFIG) - - class NoteFlowServer: """Async gRPC server for NoteFlow.""" @@ -93,6 +99,7 @@ class NoteFlowServer: bind_address = kwargs.get("bind_address", DEFAULT_BIND_ADDRESS) asr = kwargs.get("asr") asr_config = asr if isinstance(asr, AsrConfig) else AsrConfig() + streaming_config = kwargs.get("streaming_config") session_factory = kwargs.get("session_factory") db_engine = kwargs.get("db_engine") services = kwargs.get("services") or ServicesConfig() @@ -102,6 +109,9 @@ class NoteFlowServer: self._asr_model: str = asr_config.model self._asr_device: str = asr_config.device self._asr_compute_type: str = asr_config.compute_type + self._streaming_config: StreamingConfig = ( + streaming_config or build_default_streaming_config(get_settings()) + ) self._session_factory = session_factory self._db_engine = db_engine self._summarization_service = services.summarization_service @@ -195,10 +205,15 @@ class NoteFlowServer: logger.info("Starting NoteFlow gRPC server (async)...") await self._apply_persisted_asr_config() - asr_engine = load_asr_engine(self._asr_model, self._asr_device, self._asr_compute_type) settings = get_settings() + self._streaming_config = await load_streaming_config_from_preferences( + self._session_factory, + settings.meetings_dir, + self._streaming_config, + ) + asr_engine = load_asr_engine(self._asr_model, self._asr_device, self._asr_compute_type) await ensure_services(self, self._session_factory, settings) - self._servicer = build_servicer(self, asr_engine) + self._servicer = build_servicer(self, asr_engine, self._streaming_config) await recover_orphaned_jobs(self._session_factory) self._server = create_server() diff --git a/src/noteflow/grpc/server/_services.py b/src/noteflow/grpc/server/_services.py index ae4c85b..8b2a75a 100644 --- a/src/noteflow/grpc/server/_services.py +++ b/src/noteflow/grpc/server/_services.py @@ -5,6 +5,7 @@ from __future__ import annotations from typing import TYPE_CHECKING, Protocol from noteflow.infrastructure.logging import get_logger +from noteflow.application.services.streaming_config_persistence import StreamingConfig from noteflow.infrastructure.summarization import create_summarization_service from .._config import ServicesConfig @@ -88,6 +89,7 @@ async def wire_consent_persistence( def build_servicer( state: _ServerState, asr_engine: object, + streaming_config: StreamingConfig, ) -> NoteFlowServicer: """Construct the gRPC servicer instance.""" from noteflow.infrastructure.asr import FasterWhisperEngine @@ -96,7 +98,7 @@ def build_servicer( if asr_typed is None: raise TypeError("Invalid ASR engine") - return NoteFlowServicer( + servicer = NoteFlowServicer( asr_engine=asr_typed, session_factory=state.session_factory, services=ServicesConfig( @@ -109,3 +111,5 @@ def build_servicer( project_service=state.project_service, ), ) + servicer.apply_streaming_config(streaming_config) + return servicer diff --git a/src/noteflow/grpc/server/_streaming_config.py b/src/noteflow/grpc/server/_streaming_config.py new file mode 100644 index 0000000..3826a5c --- /dev/null +++ b/src/noteflow/grpc/server/_streaming_config.py @@ -0,0 +1,65 @@ +"""Streaming configuration preference loading for gRPC server.""" + +from __future__ import annotations + +from pathlib import Path +from typing import TYPE_CHECKING + +from noteflow.application.services.streaming_config_persistence import ( + StreamingConfig, + resolve_streaming_config_preference, +) +from noteflow.config.constants import SETTING_STREAMING_CONFIG +from noteflow.infrastructure.logging import get_logger + +if TYPE_CHECKING: + from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker + +logger = get_logger(__name__) + + +async def load_streaming_config_from_preferences( + session_factory: async_sessionmaker[AsyncSession] | None, + meetings_dir: Path, + fallback: StreamingConfig, +) -> StreamingConfig: + stored = await _load_streaming_config_preference(session_factory, meetings_dir) + if stored is None: + return fallback + + resolution = resolve_streaming_config_preference(stored, fallback=fallback) + if resolution is None: + return fallback + + if resolution.had_fallback: + logger.warning("streaming_config_preferences_fallback") + else: + logger.info("streaming_config_loaded_from_preferences") + + return resolution.config + + +async def _load_streaming_config_preference( + session_factory: async_sessionmaker[AsyncSession] | None, + meetings_dir: Path, +) -> object | None: + if session_factory is None: + return None + try: + return await _read_streaming_config_preference(session_factory, meetings_dir) + except Exception as exc: # pragma: no cover - defensive logging + logger.warning("streaming_config_preferences_load_failed", error=str(exc)) + return None + + +async def _read_streaming_config_preference( + session_factory: async_sessionmaker[AsyncSession], + meetings_dir: Path, +) -> object | None: + from noteflow.infrastructure.persistence.unit_of_work import SqlAlchemyUnitOfWork + + async with SqlAlchemyUnitOfWork(session_factory, meetings_dir) as uow: + if not uow.supports_preferences: + logger.debug("streaming_config_preferences_unavailable") + return None + return await uow.preferences.get(SETTING_STREAMING_CONFIG) diff --git a/src/noteflow/grpc/server/_types.py b/src/noteflow/grpc/server/_types.py index 8f08f3a..1d49bb7 100644 --- a/src/noteflow/grpc/server/_types.py +++ b/src/noteflow/grpc/server/_types.py @@ -8,6 +8,7 @@ if TYPE_CHECKING: from sqlalchemy.ext.asyncio import AsyncEngine, AsyncSession, async_sessionmaker from .._config import AsrConfig, ServicesConfig + from noteflow.application.services.streaming_config_persistence import StreamingConfig class ServerInitKwargs(TypedDict, total=False): @@ -16,6 +17,7 @@ class ServerInitKwargs(TypedDict, total=False): port: int bind_address: str asr: AsrConfig | None + streaming_config: StreamingConfig | None session_factory: async_sessionmaker[AsyncSession] | None db_engine: AsyncEngine | None services: ServicesConfig | None diff --git a/src/noteflow/grpc/service.py b/src/noteflow/grpc/service.py index a5fa70c..4e9dec1 100644 --- a/src/noteflow/grpc/service.py +++ b/src/noteflow/grpc/service.py @@ -10,9 +10,13 @@ from typing import TYPE_CHECKING, ClassVar, Final from noteflow import __version__ from noteflow.config.constants import APP_DIR_NAME, SETTING_ASR_CONFIG +from noteflow.config.settings import get_settings from noteflow.application.services.asr_config_persistence import ( build_asr_config_preference, ) +from noteflow.application.services.streaming_config_persistence import ( + build_default_streaming_config, +) from noteflow.config.constants import DEFAULT_SAMPLE_RATE as _DEFAULT_SAMPLE_RATE from noteflow.grpc.meeting_store import MeetingStore from noteflow.infrastructure.asr import Segmenter, StreamingVad @@ -40,6 +44,7 @@ from ._mixins import ( PreferencesMixin, ProjectMembershipMixin, ProjectMixin, + StreamingConfigMixin, StreamingMixin, SummarizationConsentMixin, SummarizationGenerationMixin, @@ -97,6 +102,7 @@ class NoteFlowServicer( ProjectMixin, ProjectMembershipMixin, AsrConfigMixin, + StreamingConfigMixin, HfTokenMixin, NoteFlowServicerStubs, GrpcBaseServicer, @@ -139,6 +145,7 @@ class NoteFlowServicer( """ self._init_injected_services(asr_engine, session_factory, services) self._init_audio_infrastructure(meetings_dir, session_factory) + self._init_streaming_config() self._init_streaming_state() self._init_diarization_state() @@ -201,6 +208,10 @@ class NoteFlowServicer( crypto=self.crypto, ) + def _init_streaming_config(self) -> None: + settings = get_settings() + self.streaming_config = build_default_streaming_config(settings) + def _set_asr_engine(self, engine: FasterWhisperEngine) -> None: """Update the active ASR engine reference for streaming.""" self.asr_engine = engine diff --git a/tests/grpc/test_meeting_mixin.py b/tests/grpc/test_meeting_mixin.py index acf1de1..929fd9c 100644 --- a/tests/grpc/test_meeting_mixin.py +++ b/tests/grpc/test_meeting_mixin.py @@ -124,6 +124,7 @@ class MockMeetingMixinServicerHost(MeetingMixin): # Webhook service (optional) self.webhook_service = webhook_service self.project_service = None + self.summarization_service = None # Post-processing disabled in tests def create_repository_provider(self) -> MockMeetingRepositoryProvider: """Create mock repository provider context manager.""" diff --git a/tests/grpc/test_sprint_15_1_critical_bugs.py b/tests/grpc/test_sprint_15_1_critical_bugs.py index 05ba683..1cd4918 100644 --- a/tests/grpc/test_sprint_15_1_critical_bugs.py +++ b/tests/grpc/test_sprint_15_1_critical_bugs.py @@ -12,7 +12,6 @@ in Phase 4.5 Sprint 15.1. from __future__ import annotations import asyncio -import re from datetime import timedelta from pathlib import Path from uuid import uuid4 @@ -113,7 +112,7 @@ class TestStopMeetingIdempotency: def test_idempotency_guard_in_code(self) -> None: """Verify the idempotency guard code exists in StopMeeting.""" - meeting_path = Path("src/noteflow/grpc/_mixins/meeting.py") + meeting_path = Path("src/noteflow/grpc/_mixins/meeting/meeting_mixin.py") content = meeting_path.read_text() # Verify the idempotency guard pattern exists @@ -132,16 +131,24 @@ class TestStopMeetingIdempotency: ) def test_idempotency_guard_returns_early(self) -> None: - """Verify idempotency guard returns meeting proto without state transition.""" - meeting_path = Path("src/noteflow/grpc/_mixins/meeting.py") + """Verify idempotency guard returns early without state transition. + + After refactoring, the helper function returns the domain entity directly, + and the caller (StopMeeting) converts to proto. + """ + meeting_path = Path("src/noteflow/grpc/_mixins/meeting/meeting_mixin.py") content = meeting_path.read_text() - # Find the idempotency guard pattern and verify it returns - # Pattern: if meeting.state in terminal_states: ... return meeting_to_proto(meeting) - pattern = r"if meeting\.state in terminal_states:\s+.*?return meeting_to_proto\(meeting\)" - match = re.search(pattern, content, re.DOTALL) - assert match is not None, ( - "Idempotency guard should return meeting_to_proto(meeting) for terminal states" + # Verify the guard pattern exists: checks terminal_states and returns context.meeting + # The pattern checks state membership then returns without transition + guard_check = "context.meeting.state in terminal_states" + early_return = "return context.meeting" + + assert guard_check in content, ( + "Idempotency guard check for terminal_states not found" + ) + assert early_return in content, ( + "Idempotency guard early return not found" ) @pytest.mark.parametrize(