{"openapi":"3.0.0","paths":{"/api/processor/extract-events":{"post":{"description":"Server-side proxy to processor POST /custom-documents/extract-events. Caller must be authenticated; user_id is taken from the session.","operationId":"ProcessorController_extractEvents","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractEventsDto"}}}},"responses":{"200":{"description":"Processor event extraction response"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"},"502":{"description":"Processor unreachable or error"}},"security":[{"bearer":[]}],"summary":"Extract calendar events from text","tags":["processor"]}},"/api/processor/extract-content-from-url":{"post":{"description":"Server-side proxy to processor POST /custom-documents/extract-content-from-url. Caller must be authenticated.","operationId":"ProcessorController_extractContentFromUrl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractContentFromUrlDto"}}}},"responses":{"200":{"description":"Processor extract-content-from-url response"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"},"502":{"description":"Processor unreachable or error"}},"security":[{"bearer":[]}],"summary":"Extract document content from a URL","tags":["processor"]}},"/api/custom-auth/signup":{"post":{"description":"Creates a new user account and returns user data with session token","operationId":"CustomAuthController_signUp","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomSignUpDto"}}}},"responses":{"201":{"description":"User successfully registered","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"400":{"description":"Invalid input data"},"409":{"description":"User already exists"}},"summary":"Register a new user","tags":["auth"]}},"/api/custom-auth/signin":{"post":{"description":"Signs in a user with email and password, returns user data with session token","operationId":"CustomAuthController_signIn","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CustomSignInDto"}}}},"responses":{"200":{"description":"User successfully authenticated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthResponseDto"}}}},"401":{"description":"Invalid credentials"}},"summary":"Authenticate user","tags":["auth"]}},"/api/custom-auth/session":{"get":{"description":"Retrieves the current user session from token in Authorization header or cookie","operationId":"CustomAuthController_getSession","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer token (optional if using cookie)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Session retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SessionResponseDto"}}}}},"summary":"Get current session","tags":["auth"]}},"/api/custom-auth/me":{"get":{"description":"Returns the current authenticated user directly","operationId":"CustomAuthController_getCurrentUser","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer token (optional if using cookie)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"User retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthUserDto"}}}}},"summary":"Get current user","tags":["auth"]}},"/api/custom-auth/profile":{"patch":{"description":"Updates the current user first and last name","operationId":"CustomAuthController_updateProfile","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":"Profile updated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthUserDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Update profile","tags":["auth"]}},"/api/custom-auth/signout":{"post":{"description":"Invalidates the current session token","operationId":"CustomAuthController_signOut","parameters":[{"name":"authorization","required":true,"in":"header","schema":{"type":"string"}},{"name":"Authorization","in":"header","description":"Bearer token (optional if using cookie)","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"User signed out successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignOutResponseDto"}}}}},"summary":"Sign out user","tags":["auth"]}},"/api/custom-auth/health":{"get":{"description":"Returns the health status of the authentication service","operationId":"CustomAuthController_healthCheck","parameters":[],"responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckResponseDto"}}}}},"summary":"Health check","tags":["auth"]}},"/health":{"get":{"description":"Shallow check — the process is up. No external dependencies, so it stays green during an upstream outage and Cloud Run replacements always boot. Use this for the startup probe.","operationId":"HealthController_check","parameters":[],"responses":{"200":{"description":"Service is healthy"}},"summary":"Health check","tags":["health"]}},"/health/live":{"get":{"description":"Exercises the two paths that have wedged a single instance while the process itself stayed healthy: outbound signing egress, and the Postgres connection pool. Returns 503 when either is unusable from this instance, so a Cloud Run liveness probe recycles it. Deliberately kept off the startup probe so replacements still boot during a genuine upstream outage.","operationId":"HealthController_live","parameters":[],"responses":{"200":{"description":"Instance healthy"},"503":{"description":"Instance wedged — recycle it"}},"summary":"Instance liveness probe","tags":["health"]}},"/api/chat/attachments/extract":{"post":{"operationId":"AttachmentsController_extractContent","parameters":[{"name":"x-internal-service-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Processor extract-content response"},"400":{"description":"No file or file too large"},"502":{"description":"Processor unreachable"}},"summary":"Extract content from file via processor (server-side proxy)","tags":["chat"]}},"/api/chat/attachments/extract-events":{"post":{"operationId":"AttachmentsController_extractEvents","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractEventsDto"}}}},"responses":{"200":{"description":"Processor event extraction response"},"400":{"description":"Validation error"},"502":{"description":"Processor unreachable or error"}},"summary":"Extract calendar events from text via processor (server-side proxy)","tags":["chat"]}},"/api/chat/attachments/complete":{"post":{"description":"Creates a completed attachment record after the client has called RAG extract-content. Request body is JSON only (no file upload).","operationId":"AttachmentsController_complete","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteAttachmentDto"}}}},"responses":{"201":{"description":"Attachment created","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AttachmentResponseDto"}}}},"400":{"description":"Validation error (size, type, or content length)"},"401":{"description":"Unauthorized (optional auth: guests use anonymous user)"}},"summary":"Complete chat attachment","tags":["chat"]}},"/api/chat/attachments/upload/initiate":{"post":{"operationId":"AttachmentsController_initiateGcsUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateGcsUploadDto"}}}},"responses":{"200":{"description":"Signed URL issued"},"401":{"description":"Sign-in required (guests not allowed)"},"503":{"description":"GCS not configured"}},"summary":"Initiate GCS upload for chat attachment","tags":["chat"]}},"/api/chat/attachments/upload/confirm":{"post":{"operationId":"AttachmentsController_confirmGcsUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmGcsUploadDto"}}}},"responses":{"200":{"description":"Confirmed; extraction dispatched async (status via polling)"},"401":{"description":"Sign-in required"},"404":{"description":"Attachment not found"},"409":{"description":"Already confirmed or processed"}},"summary":"Confirm GCS upload and start async extraction","tags":["chat"]}},"/api/chat/attachments/upload/proxy":{"post":{"operationId":"AttachmentsController_proxyGcsUpload","parameters":[],"responses":{"200":{"description":"Stored to GCS; client should call confirm"},"401":{"description":"Sign-in required"},"404":{"description":"Attachment not found"},"409":{"description":"Already confirmed or processed"}},"summary":"Server-side upload fallback for a pending chat attachment","tags":["chat"]}},"/api/chat/attachments/find":{"post":{"description":"Returns prior completed attachments owned by the signed-in user whose stored metadata.<sourceKey> matches any of the given ids. Two request forms supported: legacy `outlookAttachmentIds` (Outlook add-in) and generalized `source` + `externalIds` (Associate / future surfaces).","operationId":"AttachmentsController_findExisting","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindAttachmentsDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FindAttachmentsResponseDto"}}}},"401":{"description":"Sign-in required"}},"summary":"Find existing chat attachments by source id","tags":["chat"]}},"/api/chat/attachments/{id}/status":{"get":{"operationId":"AttachmentsController_getAttachmentStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Attachment ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Status payload"},"401":{"description":"Sign-in required"},"404":{"description":"Not found"}},"summary":"Get chat attachment processing status","tags":["chat"]}},"/api/chat/attachments/conversation/{conversationId}":{"get":{"operationId":"AttachmentsController_listConversationAttachments","parameters":[{"name":"conversationId","required":true,"in":"path","description":"Conversation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Active attachments for the conversation"},"401":{"description":"Sign-in required"}},"summary":"List a conversation's active chat attachments","tags":["chat"]}},"/api/chat/attachments/conversation/{conversationId}/{attachmentId}":{"delete":{"operationId":"AttachmentsController_removeConversationAttachment","parameters":[{"name":"conversationId","required":true,"in":"path","description":"Conversation ID","schema":{"type":"string"}},{"name":"attachmentId","required":true,"in":"path","description":"Attachment ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Attachment unlinked"},"401":{"description":"Sign-in required"},"404":{"description":"Attachment not owned by user"}},"summary":"Remove an attachment from a conversation","tags":["chat"]}},"/api/chat/attachments/sweep-extraction-failures":{"post":{"operationId":"AttachmentSweepController_sweepExtractionFailures","parameters":[{"name":"authorization","in":"header","description":"Bearer <google-signed-oidc-token>","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Re-dispatches scheduled."},"401":{"description":"Invalid or missing OIDC token."},"503":{"description":"CHAT_ATTACHMENT_SWEEP_OIDC_AUDIENCE is not configured."}},"summary":"Cloud Scheduler trigger that re-runs extractions whose result was lost.","tags":["chat"]}},"/api/subscription":{"get":{"description":"Returns the current user's subscription tier, limits, and usage information","operationId":"SubscriptionController_getSubscriptionStatus","parameters":[],"responses":{"200":{"description":"Subscription status retrieved successfully"},"401":{"description":"Unauthorized - authentication required"}},"summary":"Get subscription status","tags":["subscription"]}},"/api/calendar/events":{"post":{"description":"Creates an event in the user's OpenCase calendar. Sync to Google/Outlook is not performed by the API in Phase 1.","operationId":"CalendarController_createEvent","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCalendarEventDto"}}}},"responses":{"201":{"description":"Event created"},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Create calendar event","tags":["calendar"]}},"/api/docs/revisions/apply":{"post":{"operationId":"DocsRevisionsController_apply","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplyRevisionDto"}}}},"responses":{"200":{"description":"Applied"},"401":{"description":"Unauthorized"},"403":{"description":"Message does not belong to user"},"404":{"description":"Message or proposal not found / apply failed"}},"security":[{"bearer":[]}],"summary":"Apply a proposed Google Docs revision","tags":["docs/revisions"]}},"/api/docs/revisions/dismiss":{"post":{"operationId":"DocsRevisionsController_dismiss","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DismissRevisionDto"}}}},"responses":{"200":{"description":"Dismissed"},"401":{"description":"Unauthorized"},"403":{"description":"Message does not belong to user"},"404":{"description":"Message not found"}},"security":[{"bearer":[]}],"summary":"Dismiss a proposed Google Docs revision","tags":["docs/revisions"]}},"/api/office/timetrack/settings":{"get":{"operationId":"TimetrackController_getSettings","parameters":[],"responses":{"200":{"description":"Timetrack settings retrieved"}},"security":[{"bearer":[]}],"summary":"Get Timetrack add-in settings","tags":["office/timetrack"]}},"/api/office/timetrack/word-activity":{"post":{"operationId":"TimetrackController_recordWordActivity","parameters":[],"responses":{"200":{"description":"Activity events accepted"}},"security":[{"bearer":[]}],"summary":"Record Word add-in Timetrack activity events","tags":["office/timetrack"]}},"/api/office/timetrack/outlook-activity":{"post":{"operationId":"TimetrackController_recordOutlookActivity","parameters":[],"responses":{"200":{"description":"Activity events accepted"}},"security":[{"bearer":[]}],"summary":"Record Outlook add-in Timetrack activity events","tags":["office/timetrack"]}},"/api/office/documents/definitions":{"post":{"operationId":"DocumentsController_extractDefinitions","parameters":[{"name":"x-session-id","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Defined terms extracted"}},"summary":"Extract defined terms from a contract","tags":["office/documents"]}},"/api/office/documents/sections":{"post":{"operationId":"DocumentsController_extractSections","parameters":[{"name":"x-session-id","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Section outline extracted"}},"summary":"Extract the section/clause outline from a contract","tags":["office/documents"]}},"/api/office/documents/quality-check":{"post":{"operationId":"DocumentsController_runQualityCheck","parameters":[{"name":"x-session-id","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Quality check completed"}},"summary":"Run the user's own playbook that fits the document (or a chosen one)","tags":["office/documents"]}},"/api/office/documents/authorities":{"post":{"operationId":"DocumentsController_detectAuthorities","parameters":[],"responses":{"200":{"description":"Citations detected, grouped-ready by type"}},"summary":"Detect the citations (table of authorities) in a document","tags":["office/documents"]}},"/api/office/documents/authorities/verify":{"post":{"operationId":"DocumentsController_verifyAuthorities","parameters":[{"name":"x-session-id","required":true,"in":"header","schema":{"type":"string"}},{"name":"x-client-version","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":"Citations verified against the citation engine"}},"summary":"Verify detected citations (canonical title, source link, status)","tags":["office/documents"]}},"/api/users/playbooks":{"get":{"operationId":"UserPlaybooksController_list","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]},"post":{"operationId":"UserPlaybooksController_create","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]}},"/api/users/playbooks/{id}":{"get":{"operationId":"UserPlaybooksController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]},"put":{"operationId":"UserPlaybooksController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]},"delete":{"operationId":"UserPlaybooksController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]}},"/api/users/playbooks/{id}/duplicate":{"post":{"operationId":"UserPlaybooksController_duplicate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]}},"/api/users/playbooks/generate":{"post":{"operationId":"UserPlaybooksController_generate","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]}},"/api/users/playbooks/test":{"post":{"operationId":"UserPlaybooksController_test","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]}},"/api/users/playbooks/run":{"post":{"operationId":"UserPlaybooksController_run","parameters":[],"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["users/playbooks"]}},"/api/users/files/upload/initiate":{"post":{"description":"Creates a pending document record and returns a signed PUT URL for direct client upload to GCS","operationId":"FilesController_initiateUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateFileUploadDto"}}}},"responses":{"200":{"description":"documentId, signedUploadUrl, expiresAt"},"400":{"description":"Validation error or file too large"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Initiate GCS async upload","tags":["users/files"]}},"/api/users/files/upload/initiate-batch":{"post":{"description":"Creates pending document records and signed PUT URLs for multiple files in one folder","operationId":"FilesController_initiateBatchUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateBatchFileUploadDto"}}}},"responses":{"200":{"description":"documents[] and optional per-file errors"},"400":{"description":"All files failed validation"},"401":{"description":"Unauthorized"},"404":{"description":"Folder not found"}},"security":[{"bearer":[]}],"summary":"Initiate batch GCS async upload","tags":["users/files"]}},"/api/users/files/upload/confirm":{"post":{"description":"Marks pending documents as queued and schedules async extraction. Returns immediately (202); poll GET …/:id/status for outcome.","operationId":"FilesController_confirmUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmFileUploadDto"}}}},"responses":{"202":{"description":"Documents accepted for extraction"},"401":{"description":"Unauthorized"},"409":{"description":"Document already confirmed or processed"}},"security":[{"bearer":[]}],"summary":"Confirm GCS upload complete","tags":["users/files"]}},"/api/users/files/{id}/status":{"get":{"operationId":"FilesController_getDocumentStatus","parameters":[{"name":"id","required":true,"in":"path","description":"Document UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"Document status"},"401":{"description":"Unauthorized"},"404":{"description":"Document not found"}},"security":[{"bearer":[]}],"summary":"Poll document processing status","tags":["users/files"]}},"/api/users/files":{"get":{"description":"Returns all files owned by the authenticated user","operationId":"FilesController_listFiles","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"List user files","tags":["users/files"]}},"/api/users/files/{id}":{"get":{"operationId":"FilesController_getFile","parameters":[{"name":"id","required":true,"in":"path","description":"File UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"File not found"}},"security":[{"bearer":[]}],"summary":"Get file by ID","tags":["users/files"]},"patch":{"operationId":"FilesController_renameFile","parameters":[{"name":"id","required":true,"in":"path","description":"File ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RenameFileDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"File not found"}},"security":[{"bearer":[]}],"summary":"Rename file","tags":["users/files"]},"delete":{"operationId":"FilesController_deleteFile","parameters":[{"name":"id","required":true,"in":"path","description":"File UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteFileResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"File not found"}},"security":[{"bearer":[]}],"summary":"Delete file","tags":["users/files"]}},"/api/users/files/{id}/content":{"get":{"description":"Get extracted content for a file","operationId":"FilesController_getFileContent","parameters":[{"name":"id","required":true,"in":"path","description":"File UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileContentResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"File or content not found"}},"security":[{"bearer":[]}],"summary":"Get file content","tags":["users/files"]}},"/api/users/files/{id}/move":{"post":{"description":"Moves the file — every version of it — into another of the caller's folders. Connector-synced folders are not valid on either end.","operationId":"FilesController_moveFile","parameters":[{"name":"id","required":true,"in":"path","description":"File ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MoveFileDto"}}}},"responses":{"200":{"description":"movedId and the folder it now lives in"},"400":{"description":"Source or destination folder syncs from a connector"},"401":{"description":"Unauthorized"},"404":{"description":"File or destination folder not found"},"409":{"description":"Destination already holds a file of that name"}},"security":[{"bearer":[]}],"summary":"Move file to another folder","tags":["users/files"]}},"/api/users/folders":{"get":{"description":"Returns all folders owned by the authenticated user","operationId":"FoldersController_listFolders","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"List user folders","tags":["users/folders"]},"post":{"description":"Create a new folder for organizing files","operationId":"FoldersController_createFolder","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateFolderDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponseDto"}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Create folder","tags":["users/folders"]}},"/api/users/folders/{id}":{"get":{"operationId":"FoldersController_getFolder","parameters":[{"name":"id","required":true,"in":"path","description":"Folder UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Folder not found"}},"security":[{"bearer":[]}],"summary":"Get folder by ID","tags":["users/folders"]},"patch":{"operationId":"FoldersController_updateFolder","parameters":[{"name":"id","required":true,"in":"path","description":"Folder UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateFolderDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FolderResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Folder not found"}},"security":[{"bearer":[]}],"summary":"Update folder","tags":["users/folders"]},"delete":{"operationId":"FoldersController_deleteFolder","parameters":[{"name":"id","required":true,"in":"path","description":"Folder UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteFolderResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Folder not found"}},"security":[{"bearer":[]}],"summary":"Delete folder","tags":["users/folders"]}},"/api/inngest":{"get":{"operationId":"InngestProxyController_forward_get","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"post":{"operationId":"InngestProxyController_forward_post","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"put":{"operationId":"InngestProxyController_forward_put","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"delete":{"operationId":"InngestProxyController_forward_delete","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"patch":{"operationId":"InngestProxyController_forward_patch","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"options":{"operationId":"InngestProxyController_forward_options","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"head":{"operationId":"InngestProxyController_forward_head","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]},"search":{"operationId":"InngestProxyController_forward_search","parameters":[],"responses":{"200":{"description":""}},"tags":["InngestProxy"]}},"/api/chat":{"post":{"description":"Sends a chat message and receives a complete AI response (non-streaming)","operationId":"ChatController_chat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequestDto"}}}},"responses":{"200":{"description":"Chat response received successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatResponseDto"}}}},"400":{"description":"Invalid request data"}},"summary":"Send chat message","tags":["chat"]}},"/api/chat/outlook-suggestions":{"post":{"description":"Returns 2 AI-generated suggestion prompts based on the current email context (read or compose mode)","operationId":"ChatController_outlookSuggestions","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutlookSuggestionRequestDto"}}}},"responses":{"200":{"description":"Suggestions generated","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutlookSuggestionResponseDto"}}}}},"summary":"Generate Outlook suggestion prompts","tags":["chat"]}},"/api/chat/stream/test":{"post":{"description":"Test endpoint for Server-Sent Events streaming (returns test data without AI provider)","operationId":"ChatController_streamTest","parameters":[],"responses":{"200":{"description":"SSE stream started successfully"}},"summary":"Test SSE streaming","tags":["chat"]}},"/api/chat/stream":{"post":{"description":"Sends a chat message and receives an AI response via Server-Sent Events (SSE) streaming","operationId":"ChatController_streamChat","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatRequestDto"}}}},"responses":{"200":{"description":"SSE stream started successfully"},"400":{"description":"Invalid request data"},"429":{"description":"Rate limit exceeded"}},"summary":"Stream chat response","tags":["chat"]}},"/api/tool/result/test":{"post":{"description":"Creates a test pending tool call for testing tool execution without a full SSE stream","operationId":"ChatController_createTestToolCall","parameters":[],"responses":{"200":{"description":"Test tool call created successfully"}},"summary":"Create test tool call","tags":["chat"]}},"/api/tool/result":{"post":{"description":"Submits the result of a tool call execution from the frontend","operationId":"ChatController_handleToolResult","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResultDto"}}}},"responses":{"200":{"description":"Tool result received successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolResultResponseDto"}}}},"400":{"description":"Invalid request data"},"404":{"description":"Tool call not found or expired"}},"summary":"Submit tool execution result","tags":["chat"]}},"/api/mcp/frontend-response":{"post":{"description":"Submits a response from the frontend after receiving a frontend_request event via SSE","operationId":"ChatController_handleFrontendResponse","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontendResponseDto"}}}},"responses":{"200":{"description":"Frontend response received successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FrontendResponseResultDto"}}}},"400":{"description":"Invalid request data"}},"summary":"Submit frontend response","tags":["chat"]}},"/api/health":{"get":{"description":"Returns the health status of the chat service","operationId":"ChatController_getHealth","parameters":[],"responses":{"200":{"description":"Service is healthy","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HealthCheckDto"}}}}},"summary":"Health check","tags":["chat"]}},"/api/chat/conversations":{"post":{"description":"Creates a new conversation. Supports both authenticated users and anonymous sessions.","operationId":"ConversationController_createConversation","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationDto"}}}},"responses":{"201":{"description":"Conversation created successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationResponseDto"}}}},"400":{"description":"Invalid request data"}},"summary":"Create conversation","tags":["chat"]},"get":{"description":"Lists the caller's own conversations: a signed-in user's, or a guest's by session id. A caller with neither gets an empty list.","operationId":"ConversationController_listConversations","parameters":[{"name":"isPublic","required":false,"in":"query","description":"Filter by public/private status","schema":{"example":true,"type":"boolean"}},{"name":"source","required":false,"in":"query","description":"Filter by conversation source platform","schema":{"example":"word_plugin","type":"string","enum":["web","word_plugin","slack","docs"]}},{"name":"limit","required":false,"in":"query","description":"Maximum number of results","schema":{"minimum":1,"maximum":100,"default":50,"example":50,"type":"number"}},{"name":"offset","required":false,"in":"query","description":"Number of results to skip (for pagination)","schema":{"minimum":0,"default":0,"example":0,"type":"number"}}],"responses":{"200":{"description":"Conversations retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationListResponseDto"}}}}},"summary":"List conversations","tags":["chat"]}},"/api/chat/conversations/{id}/apply-results":{"post":{"description":"Reports edit apply results (DB persistence + admin email on failure).","operationId":"ConversationController_reportApplyResults","parameters":[{"name":"id","required":true,"in":"path","description":"Conversation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Apply results recorded"},"403":{"description":"Access denied"}},"summary":"Report apply results","tags":["chat"]}},"/api/chat/conversations/{id}":{"get":{"description":"Retrieves a conversation with all messages. Public conversations are accessible to anyone. Private conversations require ownership.","operationId":"ConversationController_getConversation","parameters":[{"name":"id","required":true,"in":"path","description":"Conversation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Conversation retrieved successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationWithMessagesDto"}}}},"403":{"description":"Access denied"},"404":{"description":"Conversation not found"}},"summary":"Get conversation","tags":["chat"]},"put":{"description":"Updates conversation metadata. Only the owner can update.","operationId":"ConversationController_updateConversation","parameters":[{"name":"id","required":true,"in":"path","description":"Conversation ID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateConversationDto"}}}},"responses":{"200":{"description":"Conversation updated successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationDto"}}}},"403":{"description":"Access denied"},"404":{"description":"Conversation not found"}},"summary":"Update conversation","tags":["chat"]},"delete":{"description":"Deletes a conversation and all its messages. Only the owner can delete.","operationId":"ConversationController_deleteConversation","parameters":[{"name":"id","required":true,"in":"path","description":"Conversation ID","schema":{"type":"string"}}],"responses":{"200":{"description":"Conversation deleted successfully","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeleteConversationResponseDto"}}}},"403":{"description":"Access denied"},"404":{"description":"Conversation not found"}},"summary":"Delete conversation","tags":["chat"]}},"/api/users/preferences":{"get":{"description":"Returns all preferences for the current user","operationId":"PreferencesController_getPreferences","parameters":[],"responses":{"200":{"description":"Preferences retrieved"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Get preferences","tags":["users/preferences"]},"post":{"description":"Sets preferences for the current user (partial update)","operationId":"PreferencesController_upsertPreferences","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpsertPreferencesDto"}}}},"responses":{"200":{"description":"Preferences updated"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Upsert preferences","tags":["users/preferences"]}},"/api/users/prompts":{"get":{"description":"Returns all prompts owned by the authenticated user","operationId":"PromptsController_listPrompts","parameters":[],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptListResponseDto"}}}},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"List user prompts","tags":["users/prompts"]},"post":{"description":"Create a new prompt template","operationId":"PromptsController_createPrompt","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePromptDto"}}}},"responses":{"201":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptResponseDto"}}}},"400":{"description":"Validation error"},"401":{"description":"Unauthorized"}},"security":[{"bearer":[]}],"summary":"Create prompt","tags":["users/prompts"]}},"/api/users/prompts/{id}":{"get":{"operationId":"PromptsController_getPrompt","parameters":[{"name":"id","required":true,"in":"path","description":"Prompt UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Prompt not found"}},"security":[{"bearer":[]}],"summary":"Get prompt by ID","tags":["users/prompts"]},"put":{"operationId":"PromptsController_updatePrompt","parameters":[{"name":"id","required":true,"in":"path","description":"Prompt UUID","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdatePromptDto"}}}},"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PromptResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Prompt not found"}},"security":[{"bearer":[]}],"summary":"Update prompt","tags":["users/prompts"]},"delete":{"operationId":"PromptsController_deletePrompt","parameters":[{"name":"id","required":true,"in":"path","description":"Prompt UUID","schema":{"type":"string"}}],"responses":{"200":{"description":"","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeletePromptResponseDto"}}}},"401":{"description":"Unauthorized"},"404":{"description":"Prompt not found"}},"security":[{"bearer":[]}],"summary":"Delete prompt","tags":["users/prompts"]}},"/api/webhooks/extraction-complete":{"post":{"operationId":"ExtractionCompleteController_extractionComplete","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractionCompleteDto"}}}},"responses":{"200":{"description":"Processed or already processed"},"401":{"description":"Unauthorized"},"404":{"description":"Document not found"}},"summary":"Processor extraction-complete webhook (attachments + custom_documents)","tags":["webhooks"]}},"/api/webhooks/transcription-complete":{"post":{"operationId":"TranscriptionCompleteController_handle","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TranscriptionCompleteDto"}}}},"responses":{"200":{"description":""}},"tags":["TranscriptionComplete"]}},"/api/meetings/upload/initiate":{"post":{"operationId":"MeetingsController_initiate","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InitiateMeetingUploadDto"}}}},"responses":{"201":{"description":""}},"tags":["Meetings"]}},"/api/meetings/upload/confirm":{"post":{"operationId":"MeetingsController_confirm","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmMeetingUploadDto"}}}},"responses":{"202":{"description":""}},"tags":["Meetings"]}},"/api/meetings/shared/{token}":{"get":{"operationId":"MeetingsController_getShared","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/settings":{"get":{"operationId":"MeetingsController_getSettings","parameters":[],"responses":{"200":{"description":""}},"tags":["Meetings"]},"put":{"operationId":"MeetingsController_putSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeetingSettingsDto"}}}},"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}":{"get":{"operationId":"MeetingsController_get","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/retention-hold":{"patch":{"operationId":"MeetingsController_setRetentionHold","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetRetentionHoldDto"}}}},"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/share/public":{"post":{"operationId":"MeetingsController_enablePublic","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"tags":["Meetings"]},"delete":{"operationId":"MeetingsController_disablePublic","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/share":{"get":{"operationId":"MeetingsController_shareState","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/share/collaborators":{"post":{"operationId":"MeetingsController_invite","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteCollaboratorsDto"}}}},"responses":{"201":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/share/collaborators/{memberId}":{"delete":{"operationId":"MeetingsController_removeCollaborator","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"memberId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/note":{"patch":{"operationId":"MeetingsController_updateNote","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateMeetingNoteDto"}}}},"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/folder":{"patch":{"operationId":"MeetingsController_updateFolder","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetMeetingFolderDto"}}}},"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/note/stream":{"get":{"operationId":"MeetingsController_streamNote","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/transcript":{"get":{"operationId":"MeetingsController_getTranscript","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/transcript/speakers":{"patch":{"operationId":"MeetingsController_patchTranscriptSpeakers","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateTranscriptSpeakersDto"}}}},"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings/{id}/audio-url":{"get":{"operationId":"MeetingsController_getAudioUrl","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/meetings":{"get":{"operationId":"MeetingsController_list","parameters":[{"name":"folderId","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Meetings"]}},"/api/internal/meetings/retention-sweep":{"post":{"operationId":"MeetingsInternalController_sweep","parameters":[],"responses":{"200":{"description":""}},"tags":["MeetingsInternal"]}},"/api/internal/meetings/stuck-sweep":{"post":{"operationId":"MeetingsInternalController_stuckSweep","parameters":[],"responses":{"200":{"description":""}},"tags":["MeetingsInternal"]}},"/api/internal/processor/extract-from-gcs":{"post":{"operationId":"InternalProcessorController_extractFromGcs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalExtractFromGcsDto"}}}},"responses":{"202":{"description":"Extraction accepted"},"401":{"description":"Unauthorized"},"503":{"description":"Trigger secret not configured"}},"summary":"Server-to-server trigger for processor extract-from-gcs","tags":["internal"]}},"/api/internal/processor/extract-content-from-gcs":{"post":{"operationId":"InternalProcessorController_extractContentFromGcs","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalExtractContentFromGcsDto"}}}},"responses":{"200":{"description":"Processor extract-content response"},"401":{"description":"Unauthorized"}},"summary":"Server-to-server extract-content for a file staged in cloud storage","tags":["internal"]}},"/api/internal/processor/extract-content-from-url":{"post":{"operationId":"InternalProcessorController_extractPublicContentFromUrl","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ExtractContentFromUrlDto"}}}},"responses":{"200":{"description":"Processor extract-content-from-url response"},"401":{"description":"Unauthorized"},"502":{"description":"Processor unreachable or error"}},"summary":"Server-to-server read of a public URL, shareable through the processor cache","tags":["internal"]}},"/api/internal/processor/mark-extraction-failed":{"post":{"operationId":"InternalProcessorController_markExtractionFailed","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InternalMarkExtractionFailedDto"}}}},"responses":{"200":{"description":"Document marked failed"},"401":{"description":"Unauthorized"}},"summary":"Server-to-server: mark a document extraction failed (e.g. after Inngest retries exhaust)","tags":["internal"]}},"/api/associate/poll":{"post":{"operationId":"AssociateController_poll","parameters":[{"name":"x-associate-secret","in":"header","description":"Shared secret (must match ASSOCIATE_POLL_SECRET).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Poll completed; returns per-outcome counts."},"403":{"description":"Forbidden: missing/wrong secret."},"503":{"description":"Misconfigured: ASSOCIATE_POLL_SECRET is unset."}},"summary":"Manually trigger one Associate AI Agent Gmail poll cycle.","tags":["associate"]}},"/api/associate/create-routine":{"post":{"operationId":"AssociateController_createRoutine","parameters":[],"responses":{"201":{"description":"Created; returns the new routine id and name."},"400":{"description":"Invalid params, duplicate name, or routine limit reached."},"401":{"description":"Unauthenticated: missing/invalid session token."}},"security":[{"bearer":[]}],"summary":"Create an Associate routine for the authenticated user (web setup wizard).","tags":["associate"]}},"/api/associate/actions/mailbox-links":{"post":{"operationId":"AssociateController_getMailboxLinks","parameters":[],"responses":{"200":{"description":"Returns { links }, keyed by action id."},"400":{"description":"Invalid body: ids must be an array of strings."},"401":{"description":"Unauthenticated: missing/invalid session token."}},"security":[{"bearer":[]}],"summary":"Resolve actions to mailbox URLs for the user's own inbox.","tags":["associate"]}},"/api/associate/process-routines":{"post":{"operationId":"AssociateController_processRoutines","parameters":[{"name":"x-associate-secret","in":"header","description":"Shared secret (must match ASSOCIATE_POLL_SECRET).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Processed; returns per-outcome counts."},"403":{"description":"Forbidden: missing/wrong secret."},"503":{"description":"Misconfigured: ASSOCIATE_POLL_SECRET is unset."}},"summary":"Process due recurring routines (cron).","tags":["associate"]}},"/api/associate/process-proactive":{"post":{"operationId":"AssociateController_processProactive","parameters":[{"name":"x-associate-secret","in":"header","description":"Shared secret (must match ASSOCIATE_POLL_SECRET).","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Processed; returns per-job counts."},"403":{"description":"Forbidden: missing/wrong secret."}},"summary":"Probe mail grants and send proactive Associate emails (cron).","tags":["associate"]}},"/api/associate/gmail-webhook":{"post":{"operationId":"GmailPushController_push","parameters":[{"name":"authorization","in":"header","description":"Bearer <google-signed-oidc-token>","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Acked (processed or no-op)."},"401":{"description":"Invalid or missing OIDC token."},"503":{"description":"ASSOCIATE_PUSH_OIDC_AUDIENCE is not configured."}},"summary":"Pub/Sub push for Gmail mailbox changes.","tags":["associate"]}},"/api/associate/dispatch-worker":{"post":{"operationId":"DispatchWorkerController_run","parameters":[{"name":"authorization","in":"header","description":"Bearer <google-signed-oidc-token>","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Acked (ran, skipped, or failed)."},"401":{"description":"Invalid or missing OIDC token."},"409":{"description":"Not acked: the run is still going elsewhere."},"503":{"description":"Not acked: the re-queue failed, or the worker is not configured."}},"summary":"Dispatch worker: run one claimed inbound email or routine.","tags":["associate"]}},"/api/associate/gmail-watch-renew":{"post":{"operationId":"GmailWatchController_renew","parameters":[{"name":"authorization","in":"header","description":"Bearer <google-signed-oidc-token>","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Watch renewed."},"401":{"description":"Invalid or missing OIDC token."},"503":{"description":"ASSOCIATE_WATCH_RENEW_OIDC_AUDIENCE is not configured."}},"summary":"Cloud Scheduler trigger that re-issues Gmail users.watch.","tags":["associate"]}},"/api/file-comparisons/{comparisonId}/run":{"post":{"operationId":"FileComparisonController_startFileComparisonRun","parameters":[{"name":"comparisonId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileComparisonRunDto"}}}},"responses":{"202":{"description":"Run accepted"},"401":{"description":"Unauthorized"},"502":{"description":"Processor unreachable or error"}},"security":[{"bearer":[]}],"summary":"Start file comparison run (via processor)","tags":["file-comparison"]}},"/api/file-comparisons/{comparisonId}/suggest-columns":{"post":{"operationId":"FileComparisonController_suggestColumns","parameters":[{"name":"comparisonId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FileComparisonSuggestColumnsDto"}}}},"responses":{"200":{"description":"Suggested columns response"},"401":{"description":"Unauthorized"},"502":{"description":"Processor unreachable or error"}},"security":[{"bearer":[]}],"summary":"Suggest file comparison columns (via processor)","tags":["file-comparison"]}},"/api/issue-reports":{"post":{"description":"Emails an add-in issue report to the team. Auth is optional (guests allowed).","operationId":"IssueReportController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateIssueReportDto"}}}},"responses":{"200":{"description":"Report submitted"},"400":{"description":"Invalid payload"},"500":{"description":"Email delivery failed"}},"security":[{"bearer":[]}],"summary":"Submit an issue report","tags":["issue-reports"]}},"/api/timetrack/desktop/observations":{"post":{"operationId":"DesktopObservationController_createObservation","parameters":[],"responses":{"202":{"description":"Desktop observation queued"}},"security":[{"bearer":[]}],"summary":"Queue a desktop screenshot observation","tags":["timetrack/desktop"]}},"/api/timetrack/desktop/observations/boundary":{"post":{"operationId":"DesktopObservationController_createBoundary","parameters":[],"responses":{"202":{"description":"Desktop boundary queued"}},"security":[{"bearer":[]}],"summary":"Queue a desktop activity boundary","tags":["timetrack/desktop"]}},"/api/slack/dispatch":{"post":{"operationId":"SlackController_dispatchEvent","parameters":[{"name":"x-slack-dispatch-secret","in":"header","description":"Shared secret (must match SLACK_DISPATCH_SECRET).","required":true,"schema":{"type":"string"}}],"responses":{"202":{"description":"Accepted; the agent run happens in the background."},"401":{"description":"Unauthorized: missing/wrong secret."},"503":{"description":"Misconfigured: SLACK_DISPATCH_SECRET is unset."}},"summary":"Dispatch an inbound Slack DM turn to the Associate agent.","tags":["slack"]}},"/api/slack/channel-dispatch":{"post":{"operationId":"SlackController_dispatchChannelEvent","parameters":[],"responses":{"202":{"description":""}},"summary":"Dispatch an addressed Slack channel turn without personal tools or context.","tags":["slack"]}},"/api/mobile/bootstrap":{"get":{"operationId":"MobileController_bootstrap","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/threads":{"get":{"operationId":"MobileController_listThreads","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]},"post":{"operationId":"MobileController_createThread","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateThreadDto"}}}},"responses":{"201":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/threads/{id}":{"get":{"operationId":"MobileController_getThread","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/matters":{"get":{"operationId":"MobileController_matters","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/threads/{id}/messages":{"get":{"operationId":"MobileController_listMessages","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]},"post":{"operationId":"MobileController_postMessage","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PostMessageDto"}}}},"responses":{"202":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/actions/{actionId}/send":{"post":{"operationId":"MobileController_sendAction","parameters":[{"name":"actionId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendActionDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/actions/{actionId}/cancel":{"post":{"operationId":"MobileController_cancelAction","parameters":[{"name":"actionId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/uploads":{"post":{"operationId":"MobileController_createUpload","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateUploadDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/files":{"get":{"operationId":"MobileController_listFiles","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/folders":{"get":{"operationId":"MobileController_listFolders","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/files/{id}/url":{"get":{"operationId":"MobileController_fileUrl","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/files/{id}/text":{"get":{"operationId":"MobileController_fileText","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/transcribe":{"post":{"operationId":"MobileController_transcribe","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/settings":{"get":{"operationId":"MobileController_getSettings","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]},"patch":{"operationId":"MobileController_patchSettings","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchSettingsDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/first-read":{"post":{"operationId":"MobileController_startFirstRead","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/devices":{"post":{"operationId":"MobileController_registerDevice","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDeviceDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/devices/{token}":{"delete":{"operationId":"MobileController_unregisterDevice","parameters":[{"name":"token","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/account":{"delete":{"operationId":"MobileController_deleteAccount","parameters":[],"responses":{"202":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/attribution":{"post":{"operationId":"MobileController_saveAttribution","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAttributionDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/routines":{"get":{"operationId":"MobileController_listRoutines","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/routines/builtin/{kind}":{"patch":{"operationId":"MobileController_patchBuiltinRoutine","parameters":[{"name":"kind","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchBuiltinRoutineDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/routines/{id}":{"patch":{"operationId":"MobileController_patchRoutine","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchRoutineDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]},"delete":{"operationId":"MobileController_deleteRoutine","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/memory":{"get":{"operationId":"MobileController_listMemory","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/memory/{id}":{"patch":{"operationId":"MobileController_patchMemory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchMemoryDto"}}}},"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]},"delete":{"operationId":"MobileController_forgetMemory","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/connectors":{"get":{"operationId":"MobileController_connectors","parameters":[],"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}},"/api/mobile/web-link":{"post":{"operationId":"MobileController_webLink","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WebLinkDto"}}}},"responses":{"200":{"description":""}},"security":[{"bearer":[]}],"tags":["mobile"]}}},"info":{"title":"OpenCase Backend API","description":"NestJS backend API for OpenCase Word Add-in with AI integration","version":"1.0","contact":{}},"tags":[{"name":"auth","description":"Authentication endpoints"},{"name":"chat","description":"Chat and conversation endpoints"},{"name":"health","description":"Health check endpoints"}],"servers":[{"url":"https://localhost:8080","description":"HTTPS Server"},{"url":"http://localhost:8080","description":"HTTP Server"}],"components":{"securitySchemes":{"JWT-auth":{"scheme":"bearer","bearerFormat":"JWT","type":"http","name":"JWT","description":"Enter JWT token","in":"header"}},"schemas":{"ExtractEventsDto":{"type":"object","properties":{"text_content":{"type":"string","description":"Raw text to scan for calendar events"},"document_id":{"type":"string","description":"Optional correlation id (processor may ignore; not persisted by Nest)"},"timezone":{"type":"string","default":"UTC"},"include_past_events":{"type":"boolean","default":false},"confidence_threshold":{"type":"number","default":0.3,"minimum":0,"maximum":1},"max_events":{"type":"number","default":50,"minimum":1,"maximum":100}},"required":["text_content"]},"ExtractContentFromUrlDto":{"type":"object","properties":{"url":{"type":"string","description":"HTTPS URL of the document to fetch and extract"},"max_pages":{"type":"object","description":"Max PDF pages; an over-limit PDF is refused. Send null for no per-request cap (the processor's own ceiling still applies). Omit to use the processor default (10).","minimum":1,"nullable":true},"truncate_to_max_pages":{"type":"boolean","description":"Read the first max_pages pages of a longer PDF instead of refusing it."},"text_format":{"type":"string","enum":["markdown","plain"],"default":"markdown","description":"PDF text format. `plain` is much faster; `markdown` keeps headings and tables."},"deadline_seconds":{"type":"number","description":"Seconds the caller will wait; work past it is skipped.","maximum":300}},"required":["url"]},"CustomSignUpDto":{"type":"object","properties":{"name":{"type":"string","description":"User full name","example":"John Doe","minLength":1,"maxLength":255},"email":{"type":"string","description":"User email address (case-sensitive)","example":"john.doe@example.com"},"password":{"type":"string","description":"User password (minimum 8 characters)","example":"SecurePassword123!","minLength":8}},"required":["name","email","password"]},"AuthUserDto":{"type":"object","properties":{"id":{"type":"string","description":"User ID","example":"123e4567-e89b-12d3-a456-426614174000"},"name":{"type":"string","description":"User full name","example":"John Doe"},"email":{"type":"string","description":"User email address","example":"john.doe@example.com"},"emailVerified":{"type":"boolean","description":"Whether email is verified","example":true},"firstName":{"type":"string","description":"User first name","example":"John"},"lastName":{"type":"string","description":"User last name","example":"Doe"},"createdAt":{"format":"date-time","type":"string","description":"Account creation date","example":"2024-01-01T00:00:00.000Z"},"updatedAt":{"format":"date-time","type":"string","description":"Last update date","example":"2024-01-01T00:00:00.000Z"}},"required":["id","name","email","emailVerified","createdAt","updatedAt"]},"AuthSessionDto":{"type":"object","properties":{"id":{"type":"string","description":"Session ID","example":"123e4567-e89b-12d3-a456-426614174000"},"token":{"type":"string","description":"Session token","example":"session_token_abc123"},"expiresAt":{"format":"date-time","type":"string","description":"Token expiration date","example":"2024-01-02T00:00:00.000Z"},"userId":{"type":"string","description":"User ID","example":"123e4567-e89b-12d3-a456-426614174000"}},"required":["id","token","expiresAt","userId"]},"AuthResponseDto":{"type":"object","properties":{"user":{"description":"User data","allOf":[{"$ref":"#/components/schemas/AuthUserDto"}]},"session":{"description":"Session data","allOf":[{"$ref":"#/components/schemas/AuthSessionDto"}]}},"required":["user","session"]},"CustomSignInDto":{"type":"object","properties":{"email":{"type":"string","description":"User email address","example":"john.doe@example.com"},"password":{"type":"string","description":"User password","example":"SecurePassword123!"},"totpCode":{"type":"string","description":"Authenticator code, for an account with two-factor on"},"backupCode":{"type":"string","description":"One of the account backup codes, in place of totpCode"}},"required":["email","password"]},"SessionResponseDto":{"type":"object","properties":{"user":{"description":"User data or null if not authenticated","nullable":true,"allOf":[{"$ref":"#/components/schemas/AuthUserDto"}]},"expiresAt":{"type":"string","description":"When the session now expires, after any refresh this read triggered","example":"2026-09-04T07:23:04.000Z"}},"required":["user"]},"UpdateProfileDto":{"type":"object","properties":{"firstName":{"type":"string","description":"User first name","example":"Raymond","maxLength":255},"lastName":{"type":"string","description":"User last name","example":"Lei","maxLength":255}}},"SignOutResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether sign out was successful","example":true},"message":{"type":"string","description":"Response message","example":"Signed out successfully"}},"required":["success","message"]},"HealthCheckResponseDto":{"type":"object","properties":{"status":{"type":"string","description":"Service status","example":"ok"},"service":{"type":"string","description":"Service name","example":"custom-auth"},"timestamp":{"type":"string","description":"Timestamp","example":"2024-01-01T00:00:00.000Z"}},"required":["status","service","timestamp"]},"CompleteAttachmentDto":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation ID to associate the attachment with","example":"conversation-uuid"},"fileName":{"type":"string","description":"Original file name from RAG response","example":"brief.pdf"},"fileSize":{"type":"number","description":"File size in bytes","example":1024000,"maximum":41943040},"mimeType":{"type":"string","description":"MIME type (e.g. application/pdf)","example":"application/pdf"},"fileType":{"type":"string","description":"File type from RAG (e.g. pdf, document, image)","example":"pdf"},"ragRequestId":{"type":"string","description":"RAG request_id from extract-content response","example":"rag-req-uuid"},"extractedContent":{"type":"string","description":"Extracted full text from RAG (content.full_text)","example":"Document content here...","maxLength":2000000},"ragMetadata":{"type":"object","description":"RAG metadata (metadata, partial, etc.)"}},"required":["fileName","fileSize","mimeType","ragRequestId","extractedContent"]},"AttachmentResponseDto":{"type":"object","properties":{"id":{"type":"string","description":"Attachment ID (use as attachmentId in chat requests)","example":"attachment-uuid"},"conversationId":{"type":"object","description":"Conversation ID if associated"},"fileName":{"type":"string","description":"Original file name","example":"brief.pdf"},"fileSize":{"type":"number","description":"File size in bytes","example":1024000},"mimeType":{"type":"string","description":"MIME type","example":"application/pdf"},"fileType":{"type":"string","description":"Schema file type: image | pdf | document","example":"pdf"},"processingStatus":{"type":"string","description":"Processing status","example":"completed","enum":["pending","processing","completed","failed"]},"ragRequestId":{"type":"object","description":"RAG request ID"},"createdAt":{"type":"string","description":"Created at (ISO string)"},"updatedAt":{"type":"string","description":"Updated at (ISO string)"}},"required":["id","fileName","fileSize","mimeType","fileType","processingStatus","createdAt","updatedAt"]},"InitiateGcsUploadDto":{"type":"object","properties":{"conversationId":{"type":"string","description":"Conversation ID to associate after send (optional; often unset until first message)"},"fileName":{"type":"string","example":"brief.pdf"},"fileSize":{"type":"number","example":1024000,"maximum":41943040},"mimeType":{"type":"string","example":"application/pdf"},"fileType":{"type":"string","enum":["image","pdf","document"]}},"required":["fileName","fileSize","mimeType","fileType"]},"ConfirmGcsUploadDto":{"type":"object","properties":{"attachmentId":{"type":"string","description":"Attachment ID from initiate"},"statsigStableID":{"type":"string","description":"Deprecated; accepted for older clients and ignored","deprecated":true}},"required":["attachmentId"]},"FindAttachmentsDto":{"type":"object","properties":{"outlookAttachmentIds":{"maxItems":50,"description":"Legacy form: Outlook ItemAttachment ids to look up.","type":"array","items":{"type":"string"}},"source":{"type":"string","enum":["gmail","outlook"],"description":"Generalized form: which source the external ids come from."},"externalIds":{"maxItems":50,"description":"Generalized form: external ids to look up under `source`.","type":"array","items":{"type":"string"}}}},"FindAttachmentMatchDto":{"type":"object","properties":{"outlookAttachmentId":{"type":"string","description":"Populated when the request used the legacy `outlookAttachmentIds` field."},"externalId":{"type":"string","description":"Populated when the request used the generalized `source` + `externalIds` fields."},"id":{"type":"string"}},"required":["id"]},"FindAttachmentsResponseDto":{"type":"object","properties":{"matches":{"type":"array","items":{"$ref":"#/components/schemas/FindAttachmentMatchDto"}}},"required":["matches"]},"CreateCalendarEventDto":{"type":"object","properties":{"title":{"type":"string","description":"Event title","example":"Court Meeting","maxLength":500},"description":{"type":"string","description":"Event description","maxLength":5000},"date":{"type":"string","description":"Start date/time in ISO 8601 format","example":"2026-03-09T17:00:00.000Z"},"endDate":{"type":"string","description":"End date/time in ISO 8601 format","example":"2026-03-09T18:00:00.000Z"},"type":{"type":"string","description":"Event type","enum":["deadline","hearing","meeting","custom","appointment","conference","training","interview","social","travel"]},"color":{"type":"string"},"location":{"type":"string","maxLength":500},"guests":{"type":"array","items":{"type":"string","maxLength":100}},"isAllDay":{"type":"boolean"},"visibility":{"type":"string","enum":["default","private","public"]},"reminder":{"type":"string"},"recurrenceRule":{"type":"string","enum":["none","daily","weekly","monthly","yearly"]},"recurrenceEndDate":{"type":"string","description":"Recurrence end date in ISO 8601 format"},"recurrenceCount":{"type":"number","minimum":1,"maximum":1000},"syncToGoogleCalendar":{"type":"boolean","description":"Sync to Google Calendar (requires connected calendar)"},"syncToMicrosoftCalendar":{"type":"boolean","description":"Sync to Microsoft Outlook (requires connected calendar)"}},"required":["title","date"]},"DocsRevisionKind":{"type":"string","enum":["replace","insert","delete"]},"ApplyRevisionDto":{"type":"object","properties":{"toolCallId":{"type":"string","description":"Tool call ID of the original proposal — unique per assistant turn"},"docId":{"type":"string","description":"Google Doc ID"},"kind":{"allOf":[{"$ref":"#/components/schemas/DocsRevisionKind"}]},"oldText":{"type":"string","description":"Required for replace/delete"},"newText":{"type":"string","description":"Required for replace/insert"},"paragraphIndex":{"type":"number"}},"required":["toolCallId","docId","kind"]},"DismissRevisionDto":{"type":"object","properties":{"toolCallId":{"type":"string","description":"Tool call ID of the original proposal — unique per assistant turn"}},"required":["toolCallId"]},"InitiateFileUploadDto":{"type":"object","properties":{"fileName":{"type":"string","description":"Original file name"},"mimeType":{"type":"string","description":"File MIME type"},"fileSize":{"type":"number","description":"File size in bytes"},"folderId":{"type":"string","description":"Target folder ID — defaults to My Files when omitted"}},"required":["fileName","mimeType","fileSize"]},"InitiateBatchFileMetadataDto":{"type":"object","properties":{"fileName":{"type":"string","description":"Original file name"},"mimeType":{"type":"string","description":"File MIME type"},"fileSize":{"type":"number","description":"File size in bytes"}},"required":["fileName","mimeType","fileSize"]},"InitiateBatchFileUploadDto":{"type":"object","properties":{"folderId":{"type":"string","description":"Target folder ID"},"files":{"type":"array","items":{"$ref":"#/components/schemas/InitiateBatchFileMetadataDto"}},"versionOfDocumentId":{"type":"string","description":"Attach this upload as a new version of the given document (its version stack)."}},"required":["folderId","files"]},"ConfirmFileUploadDto":{"type":"object","properties":{"documentIds":{"description":"Document IDs whose GCS upload is complete","type":"array","items":{"type":"string"}},"statsigStableID":{"type":"string","description":"Deprecated; accepted for older clients and ignored","deprecated":true}},"required":["documentIds"]},"FileResponseDto":{"type":"object","properties":{"id":{"type":"string"},"folderId":{"type":"string"},"userId":{"type":"string"},"originalFilename":{"type":"string"},"storedFilename":{"type":"string"},"fileSizeBytes":{"type":"number"},"mimeType":{"type":"string"},"fileType":{"type":"string"},"storagePath":{"type":"string"},"ragStatus":{"type":"string"},"ragErrorMessage":{"type":"object"},"retryCount":{"type":"number"},"chunksGenerated":{"type":"object"},"processingTimeMs":{"type":"object"},"metadata":{"type":"object","description":"Free-form source metadata (e.g. { outlookItemId, outlookAttachmentId } when saved from the Outlook addin)."},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","folderId","userId","originalFilename","storedFilename","fileSizeBytes","mimeType","fileType","storagePath","ragStatus","retryCount","createdAt","updatedAt"]},"FileListResponseDto":{"type":"object","properties":{"files":{"type":"array","items":{"$ref":"#/components/schemas/FileResponseDto"}},"total":{"type":"number"}},"required":["files","total"]},"FileContentResponseDto":{"type":"object","properties":{"id":{"type":"string"},"documentId":{"type":"string"},"userId":{"type":"string"},"folderId":{"type":"string"},"rawText":{"type":"string"},"cleanedText":{"type":"string"},"extractedContent":{"type":"string"},"processedContent":{"type":"string"},"contentLength":{"type":"number"},"processingMetadata":{"type":"object"},"structuredContent":{"type":"object"},"extractionMethod":{"type":"string"},"extractionEngine":{"type":"string"},"extractionVersion":{"type":"object"},"languageDetected":{"type":"object"},"encodingDetected":{"type":"object"},"pageCount":{"type":"object"},"wordCount":{"type":"object"},"characterCount":{"type":"object"},"paragraphCount":{"type":"object"},"extractionDurationMs":{"type":"number"},"retryCount":{"type":"object"},"extractionErrors":{"type":"object"},"warnings":{"type":"object"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","documentId","userId","folderId","rawText","cleanedText","extractedContent","processedContent","contentLength","extractionMethod","extractionEngine","extractionDurationMs","createdAt","updatedAt"]},"RenameFileDto":{"type":"object","properties":{"name":{"type":"string","description":"New filename"}},"required":["name"]},"MoveFileDto":{"type":"object","properties":{"folderId":{"type":"string","description":"Destination folder id (must be one of the caller's own, non-connector folders)"}},"required":["folderId"]},"DeleteFileResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"deletedId":{"type":"string"}},"required":["success","deletedId"]},"FolderResponseDto":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"name":{"type":"string"},"description":{"type":"object"},"documentCount":{"type":"number"},"totalSizeBytes":{"type":"number"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","userId","name","documentCount","totalSizeBytes","createdAt","updatedAt"]},"FolderListResponseDto":{"type":"object","properties":{"folders":{"type":"array","items":{"$ref":"#/components/schemas/FolderResponseDto"}},"total":{"type":"number"}},"required":["folders","total"]},"CreateFolderDto":{"type":"object","properties":{"name":{"type":"string","description":"Folder name","example":"My Legal Documents"},"description":{"type":"string","description":"Optional description"}},"required":["name"]},"UpdateFolderDto":{"type":"object","properties":{"name":{"type":"string","description":"Folder name"},"description":{"type":"string","description":"Folder description"}}},"DeleteFolderResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"deletedId":{"type":"string"}},"required":["success","deletedId"]},"ToolCallDto":{"type":"object","properties":{"toolCallId":{"type":"string","description":"Tool call ID","example":"call_abc123"},"toolName":{"type":"string","description":"Tool name","example":"suggest_changes"},"args":{"type":"object","description":"Tool arguments","example":{"text":"example"}},"sequenceOrder":{"type":"number","description":"Sequence order within message","example":0}},"required":["toolCallId","toolName","args"]},"ChatMessageToolResultDto":{"type":"object","properties":{"toolCallId":{"type":"string","description":"Tool call ID this result belongs to","example":"call_abc123"},"result":{"type":"object","description":"Tool execution result"},"error":{"type":"string","description":"Error message if execution failed","example":"Tool execution failed"},"executionTimeMs":{"type":"number","description":"Execution time in milliseconds","example":150}},"required":["toolCallId"]},"ChatMessageDto":{"type":"object","properties":{"role":{"type":"string","description":"Message role","enum":["user","assistant","system"],"example":"user"},"content":{"type":"string","description":"Message content","example":"Hello, how can you help me?"},"toolCalls":{"description":"Tool calls (for assistant messages)","type":"array","items":{"$ref":"#/components/schemas/ToolCallDto"}},"toolResults":{"description":"Tool results (for assistant messages)","type":"array","items":{"$ref":"#/components/schemas/ChatMessageToolResultDto"}}},"required":["role","content"]},"ChatRequestDto":{"type":"object","properties":{"messages":{"description":"Array of chat messages","type":"array","items":{"$ref":"#/components/schemas/ChatMessageDto"}},"message":{"type":"string","description":"Single message string (alternative to messages array)","example":"Hello, how can you help me?"},"model":{"type":"string","description":"AI model to use","example":"gpt-4"},"temperature":{"type":"number","description":"Temperature for AI response (0-2)","example":0.7,"minimum":0,"maximum":2},"sessionId":{"type":"string","description":"Session ID for conversation continuity","example":"session-123"},"clientId":{"type":"string","description":"Client ID for tracking","example":"client-456"},"clientMessageId":{"type":"string","description":"Stable id the client generates for THIS user message. Makes agent dispatch idempotent: a reconnect/retry that re-delivers the same chat:stream is ignored instead of spawning a second run. Absent for older clients.","example":"a1b2c3d4-e5f6-7890-abcd-ef0123456789"},"conversationId":{"type":"string","description":"Conversation ID to link message to existing conversation","example":"conversation-uuid"},"selectedFileIds":{"description":"Document IDs to include in AI context","example":["doc-123","doc-456"],"type":"array","items":{"type":"string"}},"attachmentIds":{"description":"Attachment IDs to include as inline chat attachments","example":["attachment-123","attachment-456"],"type":"array","items":{"type":"string"}},"documentContent":{"type":"string","description":"Current Word document content (sent by client, injected into user prompt)","example":"This is my document content..."},"country":{"type":"string","description":"Jurisdiction: 2-letter country code (e.g. US, UK). Overrides user profile when set.","example":"US"},"circuitNames":{"description":"Jurisdiction: circuit display names (e.g. \"9th Circuit\"). Overrides profile when set.","example":["9th Circuit"],"type":"array","items":{"type":"string"}},"stateNames":{"description":"Jurisdiction: state display names (e.g. \"California\"). Overrides profile when set.","example":["California"],"type":"array","items":{"type":"string"}},"subdivisionNames":{"description":"Jurisdiction: subdivision names for non-US (e.g. \"England & Wales\"). Overrides profile when set.","example":["England & Wales"],"type":"array","items":{"type":"string"}},"documentSnapshot":{"type":"object","description":"Lightweight snapshot of the current Word document (text + structure + indices). Used for reasoning and edit targeting. Optional and currently behind a feature flag."},"appContext":{"type":"string","description":"Client application context — determines which tool set and system prompt the AI uses.","enum":["word","outlook","web","docs","email","slack","telegram","whatsapp","teams","imessage","mobile"],"example":"outlook"},"docId":{"type":"string","description":"Host document identifier (for example, Google Docs docId when appContext = \"docs\").","example":"1A2B3C4D-doc-id"},"hostContext":{"type":"object","description":"Host/editor context from client (host, docId). When appContext is \"docs\", docId is normalized from here at entry if not set at top level.","example":{"host":"docs","docId":"1A2B3C4D-doc-id"}},"clientVersion":{"type":"string","description":"Add-in client version (e.g. Word add-in APP_VERSION). Sent only by clients that strip [[case:]] citation tags before display; gates whether the agent emits those tags. Absent ⇒ treated as an old client (no tags).","example":"1.2.9"},"editMode":{"type":"string","description":"Editing posture for this turn. \"answers_only\" tells the backend to withhold the document-editing tools so the agent answers and researches in chat without modifying the document. Omitted/\"auto\"/\"approve\" leave editing available.","enum":["auto","approve","answers_only"],"example":"answers_only"},"openProposals":{"description":"Word approval mode: the versioned suggested-edit cards still waiting in the panel when this message was sent (`OpenProposalCard`). Sent by add-in bundles that can revise an earlier turn's card; absent from older bundles. Read structurally by `readOpenProposals`.","type":"array","items":{"type":"object"}},"otherPendingSuggestions":{"type":"number","description":"Sent with `openProposals`: how many other suggested edits are waiting in the panel that cannot be revised in a later turn (formatting, document-end and pre-versioning cards)."}}},"ChatResponseDto":{"type":"object","properties":{"text":{"type":"string","description":"AI generated text response","example":"Hello! How can I assist you today?"},"toolCalls":{"description":"Array of tool calls requested by the AI","type":"array","items":{"$ref":"#/components/schemas/ToolCallDto"}},"finishReason":{"type":"string","description":"Reason for finishing the response","example":"stop"}},"required":["text"]},"OutlookSuggestionRequestDto":{"type":"object","properties":{"mode":{"type":"string","description":"Outlook mode: reading an email or composing a reply","enum":["read","compose"],"example":"read"},"emailSubject":{"type":"string","description":"Email subject line","example":"Re: Contract review deadline"},"emailFrom":{"type":"string","description":"Sender display name or address","example":"Jane Doe <jane@firm.com>"},"emailBody":{"type":"string","description":"Plain-text email body used for suggestions"},"attachmentNames":{"description":"File names of attachments on the email","example":["NDA_Draft.pdf"],"type":"array","items":{"type":"string"}}},"required":["mode"]},"OutlookSuggestionResponseDto":{"type":"object","properties":{"suggestions":{"description":"AI-generated suggestion labels","type":"array","items":{"type":"string"}}},"required":["suggestions"]},"ToolResultDto":{"type":"object","properties":{"streamId":{"type":"string","description":"Stream ID for the chat session","example":"123e4567-e89b-12d3-a456-426614174000"},"toolCallId":{"type":"string","description":"Tool call ID to submit result for","example":"call_abc123"},"result":{"type":"object","description":"Tool execution result (required if error is not provided)","example":{"data":"result data"}},"error":{"type":"string","description":"Error message if tool execution failed (required if result is not provided)","example":"Tool execution failed"}},"required":["streamId","toolCallId"]},"ToolResultResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the tool result was processed successfully","example":true},"message":{"type":"string","description":"Response message","example":"Tool call result received (success)"}},"required":["success"]},"FrontendResponseDto":{"type":"object","properties":{"requestId":{"type":"string","description":"Request ID from the frontend_request event","example":"req_123456"},"success":{"type":"boolean","description":"Whether the frontend request was successful","example":true},"data":{"type":"object","description":"Response data from frontend (required if error is not provided). May contain a debugContext field with diagnostic info (platform, documentState, trackChanges, timing, textMatch).","example":{"applied":1,"debugContext":{"platform":"windows","isOnline":false,"documentState":{"isEmpty":false,"characterCount":5000,"paragraphCount":20},"trackChanges":{"enabled":true,"canEnable":true},"timing":{"startTime":1706000000000,"endTime":1706000001000,"durationMs":1000}}}},"error":{"type":"string","description":"Error message if request failed (required if data is not provided)","example":"Request failed"},"debugContext":{"type":"object","description":"Debug context for troubleshooting (platform, documentState, trackChanges, timing, textMatch, errorDetails)","example":{"platform":"windows","isOnline":false,"documentState":{"isEmpty":false,"characterCount":5000,"paragraphCount":20},"trackChanges":{"enabled":true,"canEnable":true},"timing":{"startTime":1706000000000,"endTime":1706000001000,"durationMs":1000},"errorDetails":{"code":"OPERATION_FAILED","message":"Insert failed","operationAttempted":"insertText at END"}}}},"required":["requestId"]},"FrontendResponseResultDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the frontend response was processed successfully","example":true},"message":{"type":"string","description":"Response message","example":"Frontend response received and processed"}},"required":["success","message"]},"HealthCheckDto":{"type":"object","properties":{"status":{"type":"string","description":"Service status","enum":["ok","error"],"example":"ok"},"timestamp":{"type":"string","description":"Timestamp","example":"2024-01-01T00:00:00.000Z"},"uptime":{"type":"number","description":"Service uptime in seconds","example":3600},"provider":{"type":"string","description":"AI provider name","example":"openai"},"toolsEnabled":{"type":"boolean","description":"Whether tools are enabled","example":true}},"required":["status","timestamp"]},"CreateConversationDto":{"type":"object","properties":{"title":{"type":"string","description":"Conversation title (first 100 chars of first message)","example":"What is the statute of limitations?","maxLength":200},"firstMessage":{"type":"string","description":"First message content (optional)","example":"What is the statute of limitations for personal injury in California?"},"isPublic":{"type":"boolean","description":"Whether conversation is public","example":false,"default":false},"source":{"type":"string","description":"Conversation source platform (e.g. docs for Google Docs add-on)","example":"docs","enum":["web","word_plugin","slack","docs"]}},"required":["title"]},"ConversationDto":{"type":"object","properties":{"id":{"type":"string","description":"Conversation ID","example":"uuid"},"title":{"type":"string","description":"Conversation title","example":"What is the statute of limitations?"},"userId":{"type":"object","description":"User ID (null for anonymous)","example":"uuid"},"sessionId":{"type":"object","description":"Session ID (for anonymous conversations)","example":"uuid"},"isPublic":{"type":"boolean","description":"Whether conversation is public","example":false},"source":{"type":"string","description":"Source platform of conversation","enum":["web","word_plugin","slack"],"example":"word_plugin"},"isOwner":{"type":"boolean","description":"Whether current user is owner","example":true},"lastMessageAt":{"type":"string","description":"Last message timestamp","example":"2024-01-01T00:00:00.000Z"},"messageCount":{"type":"number","description":"Number of messages in conversation","example":5},"createdAt":{"type":"string","description":"Creation timestamp","example":"2024-01-01T00:00:00.000Z"},"updatedAt":{"type":"string","description":"Last update timestamp","example":"2024-01-01T00:00:00.000Z"}},"required":["id","title","isPublic","source","lastMessageAt","messageCount","createdAt","updatedAt"]},"CreateConversationResponseDto":{"type":"object","properties":{"conversationId":{"type":"string","description":"Created conversation ID","example":"uuid"},"conversation":{"description":"Conversation data","allOf":[{"$ref":"#/components/schemas/ConversationDto"}]}},"required":["conversationId","conversation"]},"MessageToolCallDto":{"type":"object","properties":{"toolCallId":{"type":"string","description":"Tool call ID","example":"call_abc123"},"toolName":{"type":"string","description":"Tool name","example":"suggest_changes"},"args":{"type":"object","description":"Tool arguments"},"sequenceOrder":{"type":"number","description":"Sequence order within message","example":0}},"required":["toolCallId","toolName","args"]},"MessageToolResultDto":{"type":"object","properties":{"toolCallId":{"type":"string","description":"Tool call ID this result belongs to","example":"call_abc123"},"result":{"type":"object","description":"Tool execution result"},"error":{"type":"string","description":"Error message if execution failed"},"executionTimeMs":{"type":"number","description":"Execution time in milliseconds"}},"required":["toolCallId"]},"MessageDto":{"type":"object","properties":{"id":{"type":"string","description":"Message ID","example":"uuid"},"role":{"type":"string","description":"Message role","enum":["user","assistant"],"example":"user"},"content":{"type":"string","description":"Message content","example":"What is the statute of limitations?"},"sources":{"description":"Sources (parsed from JSON)","type":"array","items":{"type":"object"}},"citation":{"type":"string","description":"Citation","example":"See Cal. Civ. Proc. Code § 335.1"},"followUpQuestions":{"description":"Follow-up questions (parsed from JSON)","type":"array","items":{"type":"object"}},"annotations":{"description":"Annotations (parsed from JSON)","type":"array","items":{"type":"object"}},"toolCalls":{"description":"Tool calls (for assistant messages)","type":"array","items":{"$ref":"#/components/schemas/MessageToolCallDto"}},"toolResults":{"description":"Tool results (for assistant messages)","type":"array","items":{"$ref":"#/components/schemas/MessageToolResultDto"}},"citationVerifications":{"description":"Citation verifications (parsed from JSON)","type":"array","items":{"type":"object"}},"attachments":{"description":"Inline attachments on this message (id, fileName, fileType)","type":"array","items":{"type":"object"}},"timestamp":{"type":"string","description":"Message timestamp","example":"2024-01-01T00:00:00.000Z"}},"required":["id","role","content","timestamp"]},"ConversationWithMessagesDto":{"type":"object","properties":{"conversation":{"description":"Conversation data","allOf":[{"$ref":"#/components/schemas/ConversationDto"}]},"messages":{"description":"Messages in conversation","type":"array","items":{"$ref":"#/components/schemas/MessageDto"}}},"required":["conversation","messages"]},"UpdateConversationDto":{"type":"object","properties":{"title":{"type":"string","description":"Conversation title","example":"Updated conversation title","maxLength":200},"isPublic":{"type":"boolean","description":"Whether conversation is public","example":true}}},"DeleteConversationResponseDto":{"type":"object","properties":{"success":{"type":"boolean","description":"Success status","example":true},"message":{"type":"string","description":"Response message","example":"Conversation deleted successfully"}},"required":["success","message"]},"ConversationListResponseDto":{"type":"object","properties":{"conversations":{"description":"List of conversations","type":"array","items":{"$ref":"#/components/schemas/ConversationDto"}},"total":{"type":"number","description":"Total number of conversations","example":100},"limit":{"type":"number","description":"Limit used","example":50},"offset":{"type":"number","description":"Offset used","example":0}},"required":["conversations","total","limit","offset"]},"FirmNamePreferenceDto":{"type":"object","properties":{"firmName":{"type":"string"}}},"CitationStylePreferenceDto":{"type":"object","properties":{"style":{"type":"string","enum":["bluebook","alwd","chicago","apa","oscola","mcgill","aglc","california"]}}},"PracticeAreasPreferenceDto":{"type":"object","properties":{"practiceAreas":{"type":"array","items":{"type":"string"}}}},"BarNumberPreferenceDto":{"type":"object","properties":{"barNumber":{"type":"string"}}},"JurisdictionPreferenceDto":{"type":"object","properties":{"country":{"type":"string"},"selectedCircuitIds":{"type":"array","items":{"type":"string"}},"selectedStateIds":{"type":"array","items":{"type":"string"}},"selectedSubdivisionIds":{"type":"array","items":{"type":"string"}}}},"CustomPromptPreferenceDto":{"type":"object","properties":{"instructions":{"type":"string","description":"Custom instructions sent to the AI on every query","maxLength":500}}},"PreferencesMapDto":{"type":"object","properties":{"firmName":{"$ref":"#/components/schemas/FirmNamePreferenceDto"},"citationStyle":{"$ref":"#/components/schemas/CitationStylePreferenceDto"},"practiceAreas":{"$ref":"#/components/schemas/PracticeAreasPreferenceDto"},"barNumber":{"$ref":"#/components/schemas/BarNumberPreferenceDto"},"jurisdiction":{"$ref":"#/components/schemas/JurisdictionPreferenceDto"},"customPrompt":{"$ref":"#/components/schemas/CustomPromptPreferenceDto"}}},"UpsertPreferencesDto":{"type":"object","properties":{"preferences":{"description":"Preferences to set (partial update)","allOf":[{"$ref":"#/components/schemas/PreferencesMapDto"}]}}},"PromptResponseDto":{"type":"object","properties":{"id":{"type":"string"},"userId":{"type":"string"},"title":{"type":"string"},"description":{"type":"object"},"template":{"type":"string"},"createdAt":{"format":"date-time","type":"string"},"updatedAt":{"format":"date-time","type":"string"}},"required":["id","userId","title","template","createdAt","updatedAt"]},"PromptListResponseDto":{"type":"object","properties":{"prompts":{"type":"array","items":{"$ref":"#/components/schemas/PromptResponseDto"}},"total":{"type":"number"}},"required":["prompts","total"]},"CreatePromptDto":{"type":"object","properties":{"title":{"type":"string","description":"Prompt title","example":"My NDA Review"},"description":{"type":"string","description":"Optional description"},"template":{"type":"string","description":"Prompt template with {{variables}}","example":"Review this {{document_type}} for {{party_name}}"}},"required":["title","template"]},"UpdatePromptDto":{"type":"object","properties":{"title":{"type":"string","description":"Prompt title","example":"My NDA Review"},"description":{"type":"string","description":"Optional description"},"template":{"type":"string","description":"Prompt template with {{variables}}","example":"Review this {{document_type}} for {{party_name}}"}}},"DeletePromptResponseDto":{"type":"object","properties":{"success":{"type":"boolean"},"deletedId":{"type":"string"}},"required":["success","deletedId"]},"ExtractionCompleteDto":{"type":"object","properties":{"extraction_job_id":{"type":"string"},"document_id":{"type":"string","description":"Attachment/document primary key"},"user_id":{"type":"string"},"folder_id":{"type":"string"},"result":{"type":"object","description":"ExtractContentResponse JSON from the processor (success/content/metadata/error)"}},"required":["document_id","user_id","folder_id","result"]},"TranscriptionCompleteDto":{"type":"object","properties":{"meeting_id":{"type":"string","description":"Meeting primary key"},"user_id":{"type":"string"},"success":{"type":"boolean"},"transcript":{"type":"string","description":"Diarized transcript text (present on success)"},"utterances":{"description":"Structured utterances (Deepgram path only)","type":"array","items":{"type":"string"}},"language":{"type":"string","description":"Detected language code"},"title":{"type":"string"},"error":{"type":"string","description":"Failure reason (present on failure)"}},"required":["meeting_id","user_id","success"]},"InitiateMeetingUploadDto":{"type":"object","properties":{}},"ConfirmMeetingUploadDto":{"type":"object","properties":{}},"UpdateMeetingSettingsDto":{"type":"object","properties":{"retentionDays":{"type":"object","nullable":true,"description":"null = keep forever"}},"required":["retentionDays"]},"SetRetentionHoldDto":{"type":"object","properties":{}},"InviteCollaboratorsDto":{"type":"object","properties":{}},"UpdateMeetingNoteDto":{"type":"object","properties":{}},"SetMeetingFolderDto":{"type":"object","properties":{}},"UpdateTranscriptSpeakersDto":{"type":"object","properties":{"speakerMap":{"type":"object","additionalProperties":{"type":"string"}},"aliasKeys":{"type":"object","additionalProperties":{"type":"string"}}},"required":["speakerMap"]},"InternalExtractFromGcsDto":{"type":"object","properties":{"gcs_path":{"type":"string"},"document_id":{"type":"string"},"user_id":{"type":"string"},"folder_id":{"type":"string","default":"chat-attachments"},"max_pages":{"type":"number"},"webhook_target":{"type":"string","enum":["nest","next"]},"defer_ocr":{"type":"boolean"}},"required":["gcs_path","document_id","user_id","folder_id"]},"InternalExtractContentFromGcsDto":{"type":"object","properties":{"gcs_path":{"type":"string"},"file_name":{"type":"string"},"user_id":{"type":"string"},"folder_id":{"type":"string"},"max_pages":{"type":"number"},"defer_ocr":{"type":"boolean"}},"required":["gcs_path","file_name","user_id","folder_id","max_pages"]},"InternalMarkExtractionFailedDto":{"type":"object","properties":{"document_id":{"type":"string"},"error_code":{"type":"string"},"error_message":{"type":"string"}},"required":["document_id"]},"FileComparisonRunDto":{"type":"object","properties":{"user_id":{"type":"string","deprecated":true}}},"FileComparisonSuggestColumnsDto":{"type":"object","properties":{"max_files":{"type":"number","description":"Max files to use for suggestion","minimum":1,"maximum":50}},"required":["max_files"]},"RecentMessageDto":{"type":"object","properties":{"role":{"type":"string","description":"Message author role (user / assistant)"},"content":{"type":"string","description":"Message content snippet"}},"required":["role","content"]},"CreateIssueReportDto":{"type":"object","properties":{"issueType":{"type":"string","enum":["hallucination","bug","feature","account"]},"message":{"type":"string","description":"User-written issue description"},"appContext":{"type":"string","enum":["word_plugin","outlook_addin"]},"appVersion":{"type":"string","description":"Add-in version, e.g. 1.2.4"},"officeHost":{"type":"string","description":"Office host application, e.g. Word"},"officePlatform":{"type":"string","description":"Office platform, e.g. PC / Mac / OfficeOnline"},"officeVersion":{"type":"string","description":"Office host version"},"route":{"type":"string","description":"Current taskpane route"},"conversationId":{"type":"string","description":"Active conversation id, if any"},"recentMessages":{"description":"Last few chat messages for context","type":"array","items":{"$ref":"#/components/schemas/RecentMessageDto"}}},"required":["issueType","message","appContext"]},"CreateThreadDto":{"type":"object","properties":{}},"PostMessageDto":{"type":"object","properties":{}},"SendActionDto":{"type":"object","properties":{}},"CreateUploadDto":{"type":"object","properties":{}},"PatchSettingsDto":{"type":"object","properties":{}},"RegisterDeviceDto":{"type":"object","properties":{}},"SaveAttributionDto":{"type":"object","properties":{}},"PatchBuiltinRoutineDto":{"type":"object","properties":{}},"PatchRoutineDto":{"type":"object","properties":{}},"PatchMemoryDto":{"type":"object","properties":{}},"WebLinkDto":{"type":"object","properties":{}}}}}