{"openapi":"3.1.0","info":{"title":"Patricia API","version":"0.1.0"},"paths":{"/v1/apps/{app_id}":{"get":{"tags":["Apps"],"summary":"Get App Metadata","operationId":"get_app_metadata_v1_apps__app_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"refresh","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"Refresh"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppMetadata"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Result storage unavailable; retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/apps/{app_id}/executions":{"post":{"tags":["Apps"],"summary":"Create App Execution","operationId":"create_app_execution_v1_apps__app_id__executions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppExecutionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppExecutionSubmission"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Preview admission refused","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Work publication unavailable; retry the same submission","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/apps/{app_id}/executions/{execution_id}":{"get":{"tags":["Apps"],"summary":"Get App Execution","operationId":"get_app_execution_v1_apps__app_id__executions__execution_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"App Id"}},{"name":"execution_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Execution Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppExecutionStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Result storage unavailable; retry","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences":{"get":{"tags":["actor-preferences"],"summary":"List employee preferences","description":"List preferences for an actor (your own, or anyone's if you are an admin).","operationId":"list_actor_preferences_v1_actor_preferences_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/models__preference__ActorPreference__FullValidator"},"title":"Response List Actor Preferences V1 Actor Preferences Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["actor-preferences"],"summary":"Set an employee preference","description":"Upsert one preference key for an actor (overwrites if the key exists).","operationId":"set_actor_preference_v1_actor_preferences_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__CreateValidator"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/approval-policy":{"get":{"tags":["actor-preferences"],"summary":"Get the tool-approval policy","description":"Read an actor's tool-approval policy (your own, or anyone's if you are an admin).","operationId":"get_approval_policy_v1_actor_preferences_approval_policy_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalPolicyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["actor-preferences"],"summary":"Set the tool-approval policy","description":"Set an actor's tool-approval policy (your own, or anyone's if you are an admin).","operationId":"set_approval_policy_v1_actor_preferences_approval_policy_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalPolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalPolicyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/timezone":{"get":{"tags":["actor-preferences"],"summary":"Get the stored timezone","description":"Read the caller's own stored timezone.","operationId":"get_actor_timezone_v1_actor_preferences_timezone_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorTimezoneResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["actor-preferences"],"summary":"Set the stored timezone","description":"user_provided (default) unconditionally overwrites any prior value; browser_detected writes only while the caller's timezone is still unset.","operationId":"set_actor_timezone_v1_actor_preferences_timezone_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorTimezoneBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorTimezoneResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/{preference_id}":{"get":{"tags":["actor-preferences"],"summary":"Get an employee preference","operationId":"get_actor_preference_v1_actor_preferences__preference_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"preference_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Preference Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["actor-preferences"],"summary":"Update an employee preference","operationId":"update_actor_preference_v1_actor_preferences__preference_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"preference_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Preference Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__MergeValidator"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["actor-preferences"],"summary":"Remove an employee preference","operationId":"delete_actor_preference_v1_actor_preferences__preference_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"preference_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Preference Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actors":{"get":{"tags":["actors","actors"],"summary":"Search actors","description":"List actors with filtering, sorting, and pagination.","operationId":"list_items_v1_actors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated actor list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["actors","actors"],"summary":"Create actor","description":"Create a new actor.","operationId":"create_item_v1_actors_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__CreateValidator"}}}},"responses":{"201":{"description":"The created actor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actors/actor-directory":{"get":{"tags":["actors"],"summary":"Search the actor directory","description":"Read-only directory view backed by a SearchQuery (QueryProxy).","operationId":"list_actor_directory_v1_actors_actor_directory_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/queries__actor_directory__ActorDirectoryQuery__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actors/{id}":{"get":{"tags":["actors","actors"],"summary":"Get actor","description":"Retrieve a single actor by ID.","operationId":"get_item_v1_actors__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested actor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["actors","actors"],"summary":"Update actor","description":"Full update (PUT) of a actor.","operationId":"update_item_v1_actors__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__UpdateValidator"}}}},"responses":{"200":{"description":"The updated actor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["actors","actors"],"summary":"Partial update actor","description":"Partial update (PATCH) of a actor.","operationId":"merge_item_v1_actors__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__MergeValidator"}}}},"responses":{"200":{"description":"The updated actor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["actors","actors"],"summary":"Delete actor","description":"Soft-delete a actor by ID.","operationId":"delete_item_v1_actors__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/actor-preferences":{"get":{"tags":["admin"],"summary":"Search actor preferences","description":"List actor preferences with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_actor_preferences_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated actor preference list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/actor-preferences/{id}":{"get":{"tags":["admin"],"summary":"Get actor preference","description":"Retrieve a single actor preference by ID.","operationId":"get_item_v1_admin_actor_preferences__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested actor preference.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__preference__ActorPreference__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/actors":{"get":{"tags":["admin"],"summary":"Search actors","description":"List actors with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_actors_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated actor list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/actors/{id}":{"get":{"tags":["admin"],"summary":"Get actor","description":"Retrieve a single actor by ID.","operationId":"get_item_v1_admin_actors__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested actor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Actor__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/admin-credit-adjustments":{"get":{"tags":["admin"],"summary":"Search admin credit adjustments","description":"List admin credit adjustments with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_admin_credit_adjustments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated admin credit adjustment list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__AdminCreditAdjustment__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/admin-credit-adjustments/{id}":{"get":{"tags":["admin"],"summary":"Get admin credit adjustment","description":"Retrieve a single admin credit adjustment by ID.","operationId":"get_item_v1_admin_admin_credit_adjustments__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested admin credit adjustment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__AdminCreditAdjustment__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/agent-runs":{"get":{"tags":["admin"],"summary":"Search agent runs","description":"List agent runs with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_agent_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated agent run list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__AgentRun__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/agent-runs/{id}":{"get":{"tags":["admin"],"summary":"Get agent run","description":"Retrieve a single agent run by ID.","operationId":"get_item_v1_admin_agent_runs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested agent run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__AgentRun__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/api-keys":{"get":{"tags":["admin"],"summary":"Search api keys","description":"List api keys with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_api_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated api key list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__api_key__ApiKey__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/api-keys/{id}":{"get":{"tags":["admin"],"summary":"Get api key","description":"Retrieve a single api key by ID.","operationId":"get_item_v1_admin_api_keys__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested api key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__api_key__ApiKey__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/audit-logs":{"get":{"tags":["admin"],"summary":"Search audit logs","description":"List audit logs with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_audit_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated audit log list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__audit__AuditLog__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/audit-logs/{id}":{"get":{"tags":["admin"],"summary":"Get audit log","description":"Retrieve a single audit log by ID.","operationId":"get_item_v1_admin_audit_logs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested audit log.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__audit__AuditLog__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/automation-auto-enrollments":{"get":{"tags":["admin"],"summary":"Automatic enrollment state of each auto-enrolled automation","operationId":"list_automation_auto_enrollments_v1_admin_automation_auto_enrollments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoEnrollmentList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/automation-auto-enrollments/{template_key}":{"put":{"tags":["admin"],"summary":"Turn automatic enrollment off or on for one automation","operationId":"put_automation_auto_enrollment_v1_admin_automation_auto_enrollments__template_key__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"template_key","in":"path","required":true,"schema":{"type":"string","title":"Template Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoEnrollmentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoEnrollmentItem"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/bootstrap":{"get":{"tags":["admin"],"summary":"Bootstrap the admin shell","description":"Return the current staff identity and API environment.","operationId":"get_admin_bootstrap_v1_admin_bootstrap_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminBootstrapResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/brain-doc-revisions":{"get":{"tags":["admin"],"summary":"Search brain doc revisions","description":"List brain doc revisions with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_brain_doc_revisions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated brain doc revision list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDocRevision__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain-doc-revisions/{id}":{"get":{"tags":["admin"],"summary":"Get brain doc revision","description":"Retrieve a single brain doc revision by ID.","operationId":"get_item_v1_admin_brain_doc_revisions__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested brain doc revision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDocRevision__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain-docs":{"get":{"tags":["admin"],"summary":"Search brain docs","description":"List brain docs with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_brain_docs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated brain doc list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain-docs/{doc_id}/pin":{"post":{"tags":["admin"],"summary":"Admin Pin Doc","operationId":"admin_pin_doc_v1_admin_brain_docs__doc_id__pin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain-docs/{doc_id}/restore":{"post":{"tags":["admin"],"summary":"Admin Restore Doc","operationId":"admin_restore_doc_v1_admin_brain_docs__doc_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain-docs/{doc_id}/unpin":{"post":{"tags":["admin"],"summary":"Admin Unpin Doc","operationId":"admin_unpin_doc_v1_admin_brain_docs__doc_id__unpin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain-docs/{id}":{"get":{"tags":["admin"],"summary":"Get brain doc","description":"Retrieve a single brain doc by ID.","operationId":"get_item_v1_admin_brain_docs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested brain doc.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/brain/remediate-salience":{"get":{"tags":["admin"],"summary":"Whether the one-time salience remediation is armed","description":"Reports whether API_BRAIN_SALIENCE_REMEDIATION_ENABLED is set. Read-only. The repair is a deliberate one-time act, so the console needs to know it is disarmed before offering it.","operationId":"salience_remediation_status_v1_admin_brain_remediate_salience_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]},"post":{"tags":["admin"],"summary":"Trigger the one-time salience-remediation fan-out (all tenants)","description":"Repairs the compounding-decay damage: restores over-decayed salience + un-prunes reversibly across every active tenant. Idempotent (raise-only). GUARDED: returns 409 unless API_BRAIN_SALIENCE_REMEDIATION_ENABLED is set, so the one-time repair is a deliberate act.","operationId":"trigger_salience_remediation_v1_admin_brain_remediate_salience_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RemediationTriggerResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/cockpit/people":{"get":{"tags":["admin"],"summary":"Cross-team people directory (one card per person)","operationId":"list_people_v1_admin_cockpit_people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPersonList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/people/detail":{"get":{"tags":["admin"],"summary":"One person across all their teams, with recent activity","operationId":"person_detail_v1_admin_cockpit_people_detail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"email","in":"query","required":true,"schema":{"type":"string","minLength":3,"maxLength":320,"description":"The person's email (case-insensitive).","title":"Email"},"description":"The person's email (case-insensitive)."},{"name":"runs_limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":20,"title":"Runs Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPersonDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/search":{"get":{"tags":["admin"],"summary":"One-box cockpit search across teams and people","description":"Case-insensitive partial match over team names, chat workspace names, member emails/names, and exact ids, grouped into teams and people. Admin only.","operationId":"cockpit_search_v1_admin_cockpit_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Name, email, workspace, or id fragment.","title":"Q"},"description":"Name, email, workspace, or id fragment."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSearchResults"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams":{"get":{"tags":["admin"],"summary":"Enriched team list (plan, balance, members, recent activity)","operationId":"list_teams_v1_admin_cockpit_teams_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"}},{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Status"}},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["display_name","created_at","credit_balance","last_run_at","runs_30d","member_count"],"type":"string","default":"last_run_at","title":"Sort By"}},{"name":"order","in":"query","required":false,"schema":{"enum":["asc","desc"],"type":"string","default":"desc","title":"Order"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}":{"get":{"tags":["admin"],"summary":"One team's enriched summary","operationId":"get_team_v1_admin_cockpit_teams__tenant_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/credit-adjustments":{"post":{"tags":["admin"],"summary":"Add or subtract prepaid credits for a team (audited, idempotent)","description":"Moves credits through the existing ledger primitives only (atomic grant / clamped FOR-UPDATE drawdown, so a balance can never go negative), writes the money-trail row and the tenant audit entry in the SAME transaction, and claims the client-supplied idempotency key so a retried submit replays the stored outcome instead of moving credits twice. Requires a human reason. Admin only.","operationId":"create_credit_adjustment_v1_admin_cockpit_teams__tenant_id__credit_adjustments_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreditAdjustmentCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreditAdjustmentRead"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: inspect ``errors[0].type`` for the specific case (``idempotency_key_reused``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["admin"],"summary":"A team's staff credit-adjustment history, newest first","operationId":"list_credit_adjustments_v1_admin_cockpit_teams__tenant_id__credit_adjustments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminCreditAdjustmentList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/member-merges":{"post":{"tags":["admin"],"summary":"Commit an attributed staff member merge","description":"Merge two members and write both staff audit records in one transaction.","operationId":"commit_team_member_merge_v1_admin_cockpit_teams__tenant_id__member_merges_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMemberMergeRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMemberMergeResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: inspect ``errors[0].type`` for the specific case (``last_owner``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/member-merges/preview":{"post":{"tags":["admin"],"summary":"Preview an attributed staff member merge","description":"Judge a staff-vouched merge and return its carry plan without writing.","operationId":"preview_team_member_merge_v1_admin_cockpit_teams__tenant_id__member_merges_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMemberMergeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMemberMergePreview"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/members":{"get":{"tags":["admin"],"summary":"A team's member roster, resolved to names and emails","operationId":"list_team_members_v1_admin_cockpit_teams__tenant_id__members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamMemberList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/members/{membership_id}/role":{"patch":{"tags":["admin"],"summary":"Change one member's role in any workspace (staff, audited)","description":"The staff replacement for a hand-written database update. Cross-tenant by design: ``tenant_id`` comes from the path and re-scopes the membership lookup, so a membership of another workspace is a 404. Requires a signed-in internal staff user, never a service key and never a tenant API key. The role write and its ``audit_logs`` row share one transaction, so the change cannot land without the record naming who made it, on which member, from which role to which, and why. Granting ``owner`` is refused here (that stays the workspace's own decision). Demoting the last ACTIVE owner is a 409, and so is demoting the last restorable owner row when no owner is ACTIVE.","operationId":"set_team_member_role_v1_admin_cockpit_teams__tenant_id__members__membership_id__role_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMemberRoleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamMember"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: inspect ``errors[0].type`` for the specific case (``last_owner``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/payments":{"get":{"tags":["admin"],"summary":"A team's enriched payment ledger, newest first (cursor-paginated)","description":"Human-only (``require_admin_user``): a purely staff-console read with no automated consumer, so it does not join the legacy service-key allowlist.","operationId":"list_team_payments_v1_admin_cockpit_teams__tenant_id__payments_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamPaymentList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/skill-testing":{"put":{"tags":["admin"],"summary":"Set a team's skill-testing designation","description":"Allow or refuse testing-skill discovery and installation for this team.","operationId":"set_team_skill_testing_v1_admin_cockpit_teams__tenant_id__skill_testing_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetSkillTestingRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/usage":{"get":{"tags":["admin"],"summary":"A team's daily credit usage plus its most recent runs","operationId":"team_usage_v1_admin_cockpit_teams__tenant_id__usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}},{"name":"runs_limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":25,"title":"Runs Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminTeamUsage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cockpit/teams/{tenant_id}/usage/export":{"get":{"tags":["admin"],"summary":"The daily usage table as a CSV download","operationId":"team_usage_export_v1_admin_cockpit_teams__tenant_id__usage_export_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"default":30,"title":"Days"}}],"responses":{"200":{"description":"The daily usage table as CSV, newest window first.","content":{"application/json":{"schema":{}},"text/csv":{"schema":{"type":"string"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/approvals/{permission_request_id}/approve":{"post":{"tags":["admin"],"summary":"Approve a pending approval raised in operator console chat","operationId":"approve_admin_console_approval_v1_admin_console_chat_approvals__permission_request_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleApprovalDecision"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: the request has already been resolved, or approval would use a personal connection its requester does not own.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable: the task queue could not accept the decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/approvals/{permission_request_id}/deny":{"post":{"tags":["admin"],"summary":"Deny a pending approval raised in operator console chat","operationId":"deny_admin_console_approval_v1_admin_console_chat_approvals__permission_request_id__deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleApprovalDecision"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: the request has already been resolved, or approval would use a personal connection its requester does not own.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable: the task queue could not accept the decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/conversations":{"get":{"tags":["admin"],"summary":"List operator console chat conversations","operationId":"list_admin_console_conversations_v1_admin_console_chat_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["admin"],"summary":"Create an operator console chat conversation","operationId":"create_admin_console_conversation_v1_admin_console_chat_conversations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/conversations/{conversation_id}":{"get":{"tags":["admin"],"summary":"Get an operator console chat conversation","operationId":"get_admin_console_conversation_v1_admin_console_chat_conversations__conversation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleThreadResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["admin"],"summary":"Rename an operator console chat conversation","operationId":"rename_admin_console_conversation_v1_admin_console_chat_conversations__conversation_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["admin"],"summary":"Delete an operator console chat conversation","operationId":"delete_admin_console_conversation_v1_admin_console_chat_conversations__conversation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/memory":{"get":{"tags":["admin"],"summary":"List an operator-selected tenant's org memory","operationId":"list_admin_console_memory_items_v1_admin_console_chat_memory_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleMemoryList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["admin"],"summary":"Remember one thing for an operator-selected tenant","operationId":"add_admin_console_memory_item_v1_admin_console_chat_memory_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleMemoryCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleMemoryItem"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Semantic memory is unavailable, so nothing was stored.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/memory/bulk":{"post":{"tags":["admin"],"summary":"Bulk-import org memory for an operator-selected tenant","operationId":"bulk_add_admin_console_memory_items_v1_admin_console_chat_memory_bulk_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleMemoryBulkRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleMemoryBulkResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/memory/{item_id}/forget":{"post":{"tags":["admin"],"summary":"Forget one memory for an operator-selected tenant","operationId":"forget_admin_console_memory_item_v1_admin_console_chat_memory__item_id__forget_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleMemoryForgetResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/messages":{"post":{"tags":["admin"],"summary":"Start an operator console chat turn","description":"Accept a JSON body part and zero to five inline file parts.","operationId":"create_admin_console_message_v1_admin_console_chat_messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"title":"Idempotency-Key"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleMessageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The Idempotency-Key was already used for a different message (``idempotency_conflict``).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Operator console chat or the task queue is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"body":{"additionalProperties":false,"description":"An operator turn with an optional conversation coordinate.","properties":{"text":{"maxLength":11000,"minLength":1,"title":"Text","type":"string"},"conversation_id":{"anyOf":[{"format":"uuid","type":"string"},{"type":"null"}],"title":"Conversation Id"}},"required":["text"],"title":"Body","type":"object"},"file":{"type":"array","items":{"type":"string","format":"binary"},"maxItems":5}},"required":["body"]}}}}},"get":{"tags":["admin"],"summary":"Get an operator console chat transcript","operationId":"get_admin_console_messages_v1_admin_console_chat_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminConsoleTranscriptResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Operator console chat is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/console-chat/thread":{"get":{"tags":["admin"],"summary":"Get an operator console chat thread","operationId":"get_admin_console_thread_v1_admin_console_chat_thread_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleThreadResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Operator console chat is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/conversations":{"get":{"tags":["admin"],"summary":"Search conversations","description":"List conversations with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated conversation list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/conversations/{id}":{"get":{"tags":["admin"],"summary":"Get conversation","description":"Retrieve a single conversation by ID.","operationId":"get_item_v1_admin_conversations__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cron-jobs":{"get":{"tags":["admin"],"summary":"Search cron jobs","description":"List cron jobs with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_cron_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated cron job list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/cron-jobs/{id}":{"get":{"tags":["admin"],"summary":"Get cron job","description":"Retrieve a single cron job by ID.","operationId":"get_item_v1_admin_cron_jobs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/email-simulate":{"post":{"tags":["admin"],"summary":"Email Simulate","description":"Dry-run the REAL two-phase evaluator for one (tenant, recipient, email): the explainability\nsurface for everything that never entered the pipeline (persisted decisions cover everything that did).\n\nRead-only by construction: it evaluates predicates, consent, caps, and quiet hours against current\nstate and reports every blocker; nothing is enqueued, sent, or recorded.","operationId":"email_simulate_v1_admin_email_simulate_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSimulateRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailSimulateResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/email-test-send":{"post":{"tags":["admin"],"summary":"Email Test Send","description":"Render one catalog email with sample values and send it directly (admin verification only).\n\nThe audit row is written and COMMITTED BEFORE the provider call, not queued afterwards. This\nroute puts real mail into a real mailbox, at a caller-chosen address, from a caller-chosen\nsender, so \"we emailed someone and there is no record\" must be unreachable. The post-commit\nside-effect dispatcher cannot promise that: it runs after the transaction closes, writes in its\nown session, and logs its failures instead of raising (``dependencies/audit.py``), so a queued\nrow can silently never land.\n\nOrdering it before the send trades one honest failure mode for an unacceptable one. A row can\nnow exist for a send the provider then refused (over-recording, visible and harmless); a send\ncan never exist without a row (under-recording, the state the approval was about). It records\nthe REQUEST for that reason, and says so in its action name: ``platform_audit_logs`` is\nappend-only behind a ``prevent_mutation()`` trigger, so the row cannot be updated afterwards\nwith the delivery outcome. That outcome stays in the structured log below and in the response.","operationId":"email_test_send_v1_admin_email_test_send_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTestSendRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailTestSendResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/emails":{"get":{"tags":["admin"],"summary":"List the lifecycle email catalog","description":"Every lifecycle email with the routing metadata a staff operator needs to pick one, so the admin console offers a picker instead of asking for a typed id. Read-only. Internal admin users only, since only the console needs it.","operationId":"list_email_catalog_v1_admin_emails_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailCatalogList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/feature-flags":{"get":{"tags":["admin"],"summary":"Effective feature-flag state (this process)","description":"Platform-admin view of every governed backend feature gate, plus every capability armed by credentials rather than by a gate: intended home, loaded value, effective state, and why. A credential-armed row governs nothing and its reported name is not a settable key. Reports the api tier's own state; the worker reports its own at startup. Values only, no secrets.","operationId":"get_feature_flag_state_v1_admin_feature_flags_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FeatureFlagState"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/group-channels":{"get":{"tags":["admin"],"summary":"Search group channels","description":"List group channels with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_group_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated group channel list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupChannel__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/group-channels/{id}":{"get":{"tags":["admin"],"summary":"Get group channel","description":"Retrieve a single group channel by ID.","operationId":"get_item_v1_admin_group_channels__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested group channel.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupChannel__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/group-suggestions":{"get":{"tags":["admin"],"summary":"Search group suggestions","description":"List group suggestions with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_group_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated group suggestion list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupSuggestion__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/group-suggestions/{id}":{"get":{"tags":["admin"],"summary":"Get group suggestion","description":"Retrieve a single group suggestion by ID.","operationId":"get_item_v1_admin_group_suggestions__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested group suggestion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupSuggestion__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/groups":{"get":{"tags":["admin"],"summary":"Search groups","description":"List groups with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated group list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/groups/{id}":{"get":{"tags":["admin"],"summary":"Get group","description":"Retrieve a single group by ID.","operationId":"get_item_v1_admin_groups__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/identity-cases":{"get":{"tags":["admin"],"summary":"List Identity Cases","description":"The collision queue: cases waiting on a human decision, oldest first.\n\n``status`` and ``reason_code`` are ENUMS, so a value outside them is a 422 rather than an empty\npage. Typed as a free string, ``status`` answered a misspelling with \"no cases\", which on a\nqueue reads as \"the queue is clear\" — the one wrong answer an operator has no reason to question.\n\n``reason_code`` narrows in SQL, before the limit applies: filtering a mixed page client-side\nwould hide one kind of case behind whatever else happened to fill the limit.\n\n**This is the route that discloses the captured address, so it is the route that pays for it.**\n``no_store`` keeps a cross-tenant page of addresses out of every shared cache, and one platform\nread-audit row is COMMITTED before any content is returned — the writer propagates its failures,\nso a queue this process could not record is a queue it does not serve. The row is written on\nevery request, including the empty page: a recorder that fired only when an address came back\nwould leave \"nobody looked\" and \"the reader looked and the queue was clear\" as the same silence.","operationId":"list_identity_cases_v1_admin_identity_cases_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/IdentityBindingCaseStatus"},{"type":"null"}],"description":"Filter to one status; default is the open queue.","title":"Status"},"description":"Filter to one status; default is the open queue."},{"name":"reason_code","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/IdentityBindingCaseReason"},{"type":"null"}],"description":"Filter to one case kind; default is every kind in the queue.","title":"Reason Code"},"description":"Filter to one case kind; default is every kind in the queue."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":100,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CaseRow"},"title":"Response List Identity Cases V1 Admin Identity Cases Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["admin"],"summary":"Open Identity Case","description":"Open a support case for a named user and subject, with staff attribution.","operationId":"open_identity_case_v1_admin_identity_cases_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SupportCaseIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/identity-cases/{case_id}/approve":{"post":{"tags":["admin"],"summary":"Approve Identity Case","description":"Record the decision and its server-computed digest, moving the case to ready.\n\nThe digest is computed here, from the document the approver submitted. Accepting one from the\ncaller would authenticate nothing — the same request supplies the document it summarizes.","operationId":"approve_identity_case_v1_admin_identity_cases__case_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Case Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManifestIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/identity-cases/{case_id}/commit":{"post":{"tags":["admin"],"summary":"Commit Identity Case","description":"Execute the approved decision. Takes NO manifest — the stored document is the only input.\n\nEverything below happens in one transaction, so a recovery either moves every row it named or\nmoves none. There is no half-applied state worth keeping: each one leaves somebody holding\nauthority the decision took away.","operationId":"commit_identity_case_v1_admin_identity_cases__case_id__commit_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Case Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CommitResult"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/identity-cases/{case_id}/deny":{"post":{"tags":["admin"],"summary":"Deny Identity Case","description":"Refuse the collision. The person stays blocked, which is the safe outcome of a real conflict.","operationId":"deny_identity_case_v1_admin_identity_cases__case_id__deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"case_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Case Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CaseRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/ingress/reopen":{"post":{"tags":["admin"],"summary":"Reopen an ingress event's processing state","description":"Reset retry and park processing state for an ingress event. Existing terminal and outage-note notification tombstones remain immutable. Events with a durable inbound election are rejected. Admin only.","operationId":"reopen_ingress_event_v1_admin_ingress_reopen_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngressReopenRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngressReopenResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: inspect ``errors[0].type`` for the specific case (``run_backed``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/ingress/stuck":{"get":{"tags":["admin"],"summary":"List open ingress recovery events","description":"Return bounded recovery metadata without saved message payloads. Admin only.","operationId":"list_stuck_ingress_events_v1_admin_ingress_stuck_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"platform_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":50,"pattern":"^[a-z0-9_-]+$"},{"type":"null"}],"title":"Platform Code"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StuckIngressResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integration-accounts":{"get":{"tags":["admin"],"summary":"Search integration accounts","description":"List integration accounts with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_integration_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated integration account list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__integration__IntegrationAccount__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integration-accounts/{id}":{"get":{"tags":["admin"],"summary":"Get integration account","description":"Retrieve a single integration account by ID.","operationId":"get_item_v1_admin_integration_accounts__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested integration account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__integration__IntegrationAccount__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integration-content":{"get":{"tags":["admin"],"summary":"List authored integration content","description":"Every app that has Connect-sheet content authored, newest-edited first.","operationId":"list_integration_content_v1_admin_integration_content_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/IntegrationContentListItem"},"type":"array","title":"Response List Integration Content V1 Admin Integration Content Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/integration-content/{app_slug}":{"get":{"tags":["admin"],"summary":"Get one app's authored content","description":"The full authored row for the editor to prefill. 404 when no content exists yet.","operationId":"get_integration_content_v1_admin_integration_content__app_slug__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","description":"The catalog app slug.","title":"App Slug"},"description":"The catalog app slug."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationContentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["admin"],"summary":"Create or replace one app's content","description":"Upsert the full Connect-sheet content for one app. Em dashes are rejected (422).","operationId":"upsert_integration_content_v1_admin_integration_content__app_slug__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","description":"The catalog app slug.","title":"App Slug"},"description":"The catalog app slug."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationContentUpsertRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationContentResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["admin"],"summary":"Delete one app's content","description":"Remove the Connect-sheet content for one app. The sheet still opens for it, but the authored sections go with the row and it falls back to what the catalog knows.","operationId":"delete_integration_content_v1_admin_integration_content__app_slug__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","description":"The catalog app slug.","title":"App Slug"},"description":"The catalog app slug."}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/accounts/{account_id}/abandoned-revoke-clearances":{"post":{"tags":["admin"],"summary":"Record a confirmed kill on an abandoned upstream revoke","description":"Takes an account off the COGS orphan report when its upstream revoke was never attempted and nothing owns a retry. That is the crash-window row a disconnect leaves if the process dies between the local commit and the provider call, which the leak report shows as retry_ownership 'unowned'. Operator-only and deliberately manual: the route performs NO provider call, it writes down the answer you give it, so answering true without having killed the credential removes a live charge from the one report that would have shown it. Matches only a soft-deleted, revoked, attempt_pending row that is owed no live outbox debt and is older than the abandonment floor. That floor bounds an ordinary in-flight disconnect; it does NOT bound a tenant offboard, whose serial provider loop grows with the account count, so wait for a known offboard to finish before acting on its accounts. It never writes status_code or deleted_at, so it cannot reactivate an account or lift a reconnect fence, and a late disconnect still completes over it. Internal admin users only.","operationId":"clear_abandoned_revoke_v1_admin_integrations_accounts__account_id__abandoned_revoke_clearances_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Connected account abandoned at attempt_pending.","title":"Account Id"},"description":"Connected account abandoned at attempt_pending."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbandonedRevokeClearance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbandonedRevokeClearanceResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/accounts/{account_id}/revoke-failure-clearances":{"post":{"tags":["admin"],"summary":"Release a connected account stuck at revoke_failed","description":"Clears the fence on an account whose upstream revoke exhausted its retries, returning it to revoked so the member can connect that app again. Operator-only and deliberately manual: attempts are exhausted, so somebody has to have confirmed the kill in the provider's own console, or accepted the leak. The body says which — only a confirmed kill takes the account off the COGS orphan report, because an accepted leak may still be billing. Matches only a revoke_failed row, so it can neither reactivate a live account nor short-circuit a revocation still in flight. Internal admin users only.","operationId":"clear_revoke_failure_v1_admin_integrations_accounts__account_id__revoke_failure_clearances_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Connected account stuck at revoke_failed.","title":"Account Id"},"description":"Connected account stuck at revoke_failed."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeFailureClearance"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeFailureClearanceResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/accounts/{account_id}/syncs":{"post":{"tags":["admin"],"summary":"Force a tool-catalog sync for one connected account","description":"Queues a background tool-catalog sync for one connected integration account. The account's owning tenant is resolved from the account record. Answers 503 when the queue broker will not take the work, so a dropped dispatch is never reported as queued. Internal admin users only.","operationId":"sync_integration_account_v1_admin_integrations_accounts__account_id__syncs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Connected integration account to sync.","title":"Account Id"},"description":"Connected integration account to sync."}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminAccountSyncResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable: the task queue could not accept the sync.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/connected-accounts":{"get":{"tags":["admin"],"summary":"Connected-account counts by provider (COGS driver)","description":"Active connected-account counts per provider. Pass ``tenant_id`` for one tenant's ``by_provider`` map, or omit it for the cross-tenant overview (``rows``). Read-only. Admin only.","operationId":"connected_account_counts_v1_admin_integrations_connected_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Scope to one tenant; omit for the platform overview.","title":"Tenant Id"},"description":"Scope to one tenant; omit for the platform overview."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccountCounts"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/orphaned-upstream":{"get":{"tags":["admin"],"summary":"Accounts deactivated locally but not confirmed revoked upstream","description":"Soft-deleted connected accounts whose upstream revoke is unconfirmed: deactivated in Patricia but possibly still live at the provider, so they may still be billing. Pass ``tenant_id`` to scope. Read-only. Admin only. Read ``retry_ownership`` before acting on a row: appearing here does not mean retries have stopped, and cleaning up at the provider while a drainer still owns the credential races it.","operationId":"orphaned_upstream_v1_admin_integrations_orphaned_upstream_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Scope to one tenant; omit for the platform report.","title":"Tenant Id"},"description":"Scope to one tenant; omit for the platform report."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OrphanedUpstreamReport"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/proxy-capability-catalogs":{"get":{"tags":["admin"],"summary":"List provider capability catalog status","operationId":"list_proxy_capability_catalogs_v1_admin_integrations_proxy_capability_catalogs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":10000,"minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ProxyCatalogStatus"},"title":"Response List Proxy Capability Catalogs V1 Admin Integrations Proxy Capability Catalogs Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/proxy-capability-catalogs/status":{"get":{"tags":["admin"],"summary":"Report durable provider catalog rule diagnostics","description":"Stored catalog diagnostics, not account entitlement or alert delivery. Graph coverage is open_surface.","operationId":"proxy_capability_catalog_status_v1_admin_integrations_proxy_capability_catalogs_status_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCatalogDiagnosticReport"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/integrations/proxy-capability-catalogs/{catalog_id}":{"get":{"tags":["admin"],"summary":"Inspect a provider capability catalog and retained revision identifiers","operationId":"get_proxy_capability_catalog_v1_admin_integrations_proxy_capability_catalogs__catalog_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"catalog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Catalog Id"}},{"name":"revision_limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Revision Limit"}},{"name":"revision_offset","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"default":0,"title":"Revision Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCatalogDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/proxy-capability-catalogs/{catalog_id}/restorations":{"post":{"tags":["admin"],"summary":"Restore retained guidance through current catalog rules","operationId":"restore_proxy_capability_catalog_v1_admin_integrations_proxy_capability_catalogs__catalog_id__restorations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"catalog_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Catalog Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCatalogRestorationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCatalogPublicationResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/integrations/proxy-capability-catalogs/{provider}/{app_slug}/{endpoint_scope}":{"put":{"tags":["admin"],"summary":"Publish a validated whole provider capability snapshot","operationId":"publish_proxy_capability_catalog_v1_admin_integrations_proxy_capability_catalogs__provider___app_slug___endpoint_scope__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"Provider"}},{"name":"app_slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"title":"App Slug"}},{"name":"endpoint_scope","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"title":"Endpoint Scope"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProxyCatalogPublicationResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["expected_generation","catalog"],"properties":{"expected_generation":{"type":"integer","minimum":0,"maximum":9223372036854775806},"catalog":{"type":"object","additionalProperties":true}}}}}}}},"/v1/admin/integrations/tool-tiers":{"get":{"tags":["admin"],"summary":"Whether every active Composio account's tool rows carry the running classifier's generation","description":"Reads the classifier generation stamped on every enabled tool row of every ACTIVE Composio account. An account is ``visited`` when every row carries the running generation, ``stale`` when any row carries another or none, and ``empty`` when it has no enabled rows. ``ok`` is false while any account is stale; re-running the re-sync is what clears it. Note ``ok: true`` with ``checked: 0`` means the scan matched no active account, not that the fleet is verified — the cutover step is visited above zero with none stale. Read-only. Internal admin users only.","operationId":"tool_tier_generation_report_v1_admin_integrations_tool_tiers_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolTierGenerationReport"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/integrations/tool-tiers/resyncs":{"post":{"tags":["admin"],"summary":"Re-sync every active Composio account so its tool rows carry the running classifier's tier","description":"Queues the one-off fleet sweep that re-syncs every ACTIVE Composio account, so each of its enabled tool rows is tiered by the running classifier and stamped with its generation. Run it only after both fleets have converged: an old worker still applies the old classifier. Idempotent and re-runnable — each account commits on its own, so a partial run keeps everything it finished. Poll ``GET /v1/admin/integrations/tool-tiers`` for the verdict. Internal admin users only.","operationId":"resync_tool_tiers_endpoint_v1_admin_integrations_tool_tiers_resyncs_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolTierResyncResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/integrations/wire-contract-digests":{"get":{"tags":["admin"],"summary":"Whether every wire-contract publishing tool row records a valid wire contract","description":"Audits every enabled tool row backed by an ACTIVE account of a provider that publishes a wire contract: it must record a digest that still matches its own stored schema and the live adapter contract. ``ok`` is false while any row is missing, mismatched, or unverifiable. Re-running the backfill clears ``missing`` and ``mismatched``; ``unverifiable`` it cannot: the provider will not answer for that ref, so read ``blocked_by`` first. Note ``ok: true`` with ``checked: 0`` means the scan matched no rows, not that the fleet is verified. Read-only. Internal admin users only.","operationId":"wire_contract_digest_report_v1_admin_integrations_wire_contract_digests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WireContractDigestReport"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/integrations/wire-contract-digests/backfills":{"post":{"tags":["admin"],"summary":"Re-sync every wire-contract publishing account so its tool rows record a wire contract","description":"Queues the one-off fleet sweep that re-syncs every connected account of a provider that publishes a wire contract, so each of its enabled tool rows records the digest of the contract it dispatches. Idempotent and re-runnable: each account commits on its own, so a partial run keeps everything it finished. Poll ``GET /v1/admin/integrations/wire-contract-digests`` for the verdict. Internal admin users only.","operationId":"backfill_wire_contract_digests_endpoint_v1_admin_integrations_wire_contract_digests_backfills_post","responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WireContractBackfillResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/integrations/{tenant_id}/connected-accounts":{"delete":{"tags":["admin"],"summary":"Offboard cleanup: disconnect all of a tenant's connected accounts","description":"Locally disconnect every connected account for the tenant AND best-effort revoke each at its provider, so offboarding actually stops per-account upstream charges. Idempotent. Anything not confirmed revoked upstream is flagged for the orphaned-upstream report. Admin only.","operationId":"disconnect_all_v1_admin_integrations__tenant_id__connected_accounts_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"Tenant to offboard-clean.","title":"Tenant Id"},"description":"Tenant to offboard-clean."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OffboardCleanupResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/invoice-lines":{"get":{"tags":["admin"],"summary":"Search invoice lines","description":"List invoice lines with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_invoice_lines_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated invoice line list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__InvoiceLine__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/invoice-lines/{id}":{"get":{"tags":["admin"],"summary":"Get invoice line","description":"Retrieve a single invoice line by ID.","operationId":"get_item_v1_admin_invoice_lines__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested invoice line.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__InvoiceLine__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/invoices":{"get":{"tags":["admin"],"summary":"Search invoices","description":"List invoices with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"embed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relation embedding. Available values: lines. Use a comma-separated list to request multiple embeds.","title":"Embed"},"description":"Relation embedding. Available values: lines. Use a comma-separated list to request multiple embeds.","examples":{"single":{"summary":"Single embed","value":"lines"}}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated invoice list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__Invoice__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/invoices/{id}":{"get":{"tags":["admin"],"summary":"Get invoice","description":"Retrieve a single invoice by ID.","operationId":"get_item_v1_admin_invoices__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"embed","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Relation embedding. Available values: lines. Use a comma-separated list to request multiple embeds.","title":"Embed"},"description":"Relation embedding. Available values: lines. Use a comma-separated list to request multiple embeds.","examples":{"single":{"summary":"Single embed","value":"lines"}}}],"responses":{"200":{"description":"The requested invoice.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__Invoice__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/lessons":{"get":{"tags":["admin"],"summary":"Search lessons","description":"List lessons with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_lessons_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated lesson list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Lesson__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/lessons/{id}":{"get":{"tags":["admin"],"summary":"Get lesson","description":"Retrieve a single lesson by ID.","operationId":"get_item_v1_admin_lessons__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested lesson.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Lesson__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memberships":{"get":{"tags":["admin"],"summary":"Search memberships","description":"List memberships with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_memberships_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated membership list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__rbac__Membership__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memberships/{id}":{"get":{"tags":["admin"],"summary":"Get membership","description":"Retrieve a single membership by ID.","operationId":"get_item_v1_admin_memberships__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested membership.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__rbac__Membership__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memory-items":{"get":{"tags":["admin"],"summary":"Search memory items","description":"List memory items with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_memory_items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated memory item list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memory-items/{id}":{"get":{"tags":["admin"],"summary":"Get memory item","description":"Retrieve a single memory item by ID.","operationId":"get_item_v1_admin_memory_items__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested memory item.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memory-items/{item_id}/pin":{"post":{"tags":["admin"],"summary":"Pin a memory as a standing rule","description":"Make a memory a standing rule. Every run in its scope carries up to 10 pinned memories, most recently pinned first, whatever the run asks, and a pin protects the memory from Curator decay, prune, and consolidation. A personal memory stands only in a run that answers its owner in the owner's own chat-platform direct message. A meeting memory keeps that protection but reaches a run only through ordinary recall.","operationId":"admin_pin_memory_v1_admin_memory_items__item_id__pin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memory-items/{item_id}/restore":{"post":{"tags":["admin"],"summary":"Admin Restore Memory","operationId":"admin_restore_memory_v1_admin_memory_items__item_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/memory-items/{item_id}/unpin":{"post":{"tags":["admin"],"summary":"Admin Unpin Memory","operationId":"admin_unpin_memory_v1_admin_memory_items__item_id__unpin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/messages":{"get":{"tags":["admin"],"summary":"Search messages","description":"List messages with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated message list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Message__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/messages/{id}":{"get":{"tags":["admin"],"summary":"Get message","description":"Retrieve a single message by ID.","operationId":"get_item_v1_admin_messages__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Message__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/permission-requests":{"get":{"tags":["admin"],"summary":"Search permission requests","description":"List permission requests with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_permission_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated permission request list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__PermissionRequest__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/permission-requests/{id}":{"get":{"tags":["admin"],"summary":"Get permission request","description":"Retrieve a single permission request by ID.","operationId":"get_item_v1_admin_permission_requests__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested permission request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__PermissionRequest__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/platform-audit-logs":{"get":{"tags":["admin"],"summary":"Search the platform-scope (tenantless) audit trail","description":"Staff actions that no single team owns: platform-admin grants, service-key mint and revoke, skill-catalog publishing, and the audited email test send. Narrow it with the typed filters below, which are the ONLY query surface; the free-form change and metadata bags are readable in a row but can never be sorted or filtered on. Every search records its own read-audit row. Internal admin users only.","operationId":"search_platform_audit_logs_v1_admin_platform_audit_logs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"action","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"Exact action name.","title":"Action"},"description":"Exact action name."},{"name":"principal_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Who acted.","title":"Principal Id"},"description":"Who acted."},{"name":"principal_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^(user|service_key)$"},{"type":"null"}],"description":"user | service_key","title":"Principal Type"},"description":"user | service_key"},{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"The team the action targeted.","title":"Tenant Id"},"description":"The team the action targeted."},{"name":"resource_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"e.g. user, skill, tenant.","title":"Resource Type"},"description":"e.g. user, skill, tenant."},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive lower bound.","title":"Created After"},"description":"Inclusive lower bound."},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Inclusive upper bound.","title":"Created Before"},"description":"Inclusive upper bound."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":100,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformAuditPageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/platform-audit-logs/actions":{"get":{"tags":["admin"],"summary":"Distinct platform-audit action names","description":"The vocabulary present in the trail, so the console offers a picker. Internal admin users only.","operationId":"list_platform_audit_actions_v1_admin_platform_audit_logs_actions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformAuditActions"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/platform-installations":{"get":{"tags":["admin"],"summary":"Search platform installations","description":"List platform installations with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_platform_installations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated platform installation list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__PlatformInstallation__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/platform-installations/{id}":{"get":{"tags":["admin"],"summary":"Get platform installation","description":"Retrieve a single platform installation by ID.","operationId":"get_item_v1_admin_platform_installations__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested platform installation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__PlatformInstallation__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/proactive-sends":{"get":{"tags":["admin"],"summary":"Cross-tenant built-in automation runs","operationId":"list_proactive_sends_v1_admin_proactive_sends_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_name","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"title":"Team Name"}},{"name":"automation","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Automation"}},{"name":"reaction","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ReactionFilter"},{"type":"null"}],"title":"Reaction"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"$ref":"#/components/schemas/ProactiveSendSort","default":"created_at:desc"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminProactiveSendListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/proactive-sends/{run_id}":{"get":{"tags":["admin"],"summary":"One built-in automation run with its whole message","operationId":"get_proactive_send_v1_admin_proactive_sends__run_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminProactiveSendDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/reply-quality":{"get":{"tags":["admin"],"summary":"List the lowest-scored replies","description":"The worst replies first, for internal QA inspection (scores are never tenant-facing).\n\n``dimension`` is validated against the known score columns (fail-closed to ``overall``), so\nit can't be an injection vector. ``scorer_version`` defaults to the current generation so the\ndefault view never mixes non-comparable versions; ``all`` lifts the filter. Cross-tenant by\ndefault; pass ``tenant_id`` to drill in.","operationId":"list_lowest_scored_replies_v1_admin_reply_quality_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Drill into one workspace; omit for the fleet view.","title":"Tenant Id"},"description":"Drill into one workspace; omit for the fleet view."},{"name":"dimension","in":"query","required":false,"schema":{"type":"string","description":"Sort worst-first by this dimension.","default":"overall","title":"Dimension"},"description":"Sort worst-first by this dimension."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only replies scored at/after this time (UTC).","title":"Since"},"description":"Only replies scored at/after this time (UTC)."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Only replies scored before this time (UTC).","title":"Until"},"description":"Only replies scored before this time (UTC)."},{"name":"scorer_version","in":"query","required":false,"schema":{"type":"string","description":"Which grading generation to show. Defaults to the current scorer version, because scores from different versions are NOT comparable, so mixing them (old low rows dominating the worst-first list) is misleading. Pass 'all' to inspect every version.","default":"m0.8","title":"Scorer Version"},"description":"Which grading generation to show. Defaults to the current scorer version, because scores from different versions are NOT comparable, so mixing them (old low rows dominating the worst-first list) is misleading. Pass 'all' to inspect every version."},{"name":"review_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Triage state. A reply nobody has reviewed counts as 'open'.","title":"Review Status"},"description":"Triage state. A reply nobody has reviewed counts as 'open'."},{"name":"outcome_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Judge-classified outcome of the reply.","title":"Outcome Code"},"description":"Judge-classified outcome of the reply."},{"name":"reply_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Judge-classified kind of reply.","title":"Reply Type Code"},"description":"Judge-classified kind of reply."},{"name":"max_overall","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"description":"Only replies at or below this overall score.","title":"Max Overall"},"description":"Only replies at or below this overall score."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReplyQualityRow"},"title":"Response List Lowest Scored Replies V1 Admin Reply Quality Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/reply-quality/causes":{"get":{"tags":["admin"],"summary":"GROUP BY judge causes with exact row counts for one rubric version, never a model summary","description":"Ranks replies below the passing band with a GROUP BY over the judge reply type and outcome taxonomy. It uses exact scorecard row counts and total score lost, never a model summary. The route covers one rubric version at a time by default. Every number is the judge's own grading; a staff review never adjusts it.","operationId":"get_reply_quality_causes_v1_admin_reply_quality_causes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Drill into one workspace; omit for the fleet view.","title":"Tenant Id"},"description":"Drill into one workspace; omit for the fleet view."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Window start (UTC). Defaults to 28 days before `until`.","title":"Since"},"description":"Window start (UTC). Defaults to 28 days before `until`."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Window end, exclusive (UTC). Defaults to now.","title":"Until"},"description":"Window end, exclusive (UTC). Defaults to now."},{"name":"scorer_version","in":"query","required":false,"schema":{"type":"string","description":"Restrict to one rubric version, or 'all' to read across every version.","default":"m0.8","title":"Scorer Version"},"description":"Restrict to one rubric version, or 'all' to read across every version."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":80,"minimum":1,"description":"Maximum judge-taxonomy groups returned.","default":80,"title":"Limit"},"description":"Maximum judge-taxonomy groups returned."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQualityCauses"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/reply-quality/count":{"get":{"tags":["admin"],"summary":"Count the replies matching the current filters","description":"How much work the current filter actually holds, so a page can say \"of N\".","operationId":"count_lowest_scored_replies_v1_admin_reply_quality_count_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"scorer_version","in":"query","required":false,"schema":{"type":"string","default":"m0.8","title":"Scorer Version"}},{"name":"review_status","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Review Status"}},{"name":"outcome_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome Code"}},{"name":"reply_type_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reply Type Code"}},{"name":"max_overall","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":5,"minimum":1},{"type":"null"}],"title":"Max Overall"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQualityCount"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/reply-quality/options":{"get":{"tags":["admin"],"summary":"The closed vocabularies the console renders as pickers","description":"Served from the backend so a vocabulary can never drift out of sync with the console.\n\nA hard-coded copy in the client is how a filter starts offering a value the server has\nstopped accepting, which shows up as an empty page rather than an error.","operationId":"get_reply_quality_options_v1_admin_reply_quality_options_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQualityOptions"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/reply-quality/reviews/bulk":{"post":{"tags":["admin"],"summary":"Move several replies to one triage state","description":"Apply a triage state to a selection of scored replies in one step. Each card keeps any verdict, label and note it already had; a sweep only changes where things sit in the queue. Admin users only.","operationId":"bulk_triage_reply_scores_v1_admin_reply_quality_reviews_bulk_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTriageRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BulkTriageResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/reply-quality/summary":{"get":{"tags":["admin"],"summary":"Volume, quality, triage backlog and judge↔human agreement","description":"One round trip for the whole console header, so its numbers share one instant.","operationId":"get_reply_quality_summary_v1_admin_reply_quality_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Drill into one workspace; omit for the fleet view.","title":"Tenant Id"},"description":"Drill into one workspace; omit for the fleet view."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"scorer_version","in":"query","required":false,"schema":{"type":"string","default":"m0.8","title":"Scorer Version"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQualitySummaryResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/reply-quality/teams":{"get":{"tags":["admin"],"summary":"Average reply quality per workspace","description":"Every workspace with a scored reply in the window, busiest first, each with its scored count beside its averages. Read the count before the average: scored volume is very uneven across workspaces and a mean over a handful of replies is not a ranking. Omitting both bounds reads the last 12 weeks, the same span /trend defaults to; pass `all_time` to aggregate every scorecard ever written. The response echoes the window that was actually read.","operationId":"get_reply_quality_teams_v1_admin_reply_quality_teams_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Window start (UTC). Defaults to 12 weeks before `until`.","title":"Since"},"description":"Window start (UTC). Defaults to 12 weeks before `until`."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Window end, exclusive (UTC). Defaults to now.","title":"Until"},"description":"Window end, exclusive (UTC). Defaults to now."},{"name":"all_time","in":"query","required":false,"schema":{"type":"boolean","description":"Drop the default lower bound and aggregate every scorecard on record. The upper bound is still captured, so the response can name the end it read and scorecards dated after the request are left out. An explicit `since` still applies and is not widened.","default":false,"title":"All Time"},"description":"Drop the default lower bound and aggregate every scorecard on record. The upper bound is still captured, so the response can name the end it read and scorecards dated after the request are left out. An explicit `since` still applies and is not widened."},{"name":"scorer_version","in":"query","required":false,"schema":{"type":"string","description":"Restrict to one rubric version, or 'all' to compare across every version.","default":"m0.8","title":"Scorer Version"},"description":"Restrict to one rubric version, or 'all' to compare across every version."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Maximum workspaces returned.","default":200,"title":"Limit"},"description":"Maximum workspaces returned."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQualityTeams"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/reply-quality/trend":{"get":{"tags":["admin"],"summary":"Scored volume and rubric averages over time","description":"The quality series for a window, bucketed by day, week or month. Each bucket is split by scorer version: a new rubric re-anchors the 1-to-5 scale, so a single blended line would report a rubric edit as a change in Patricia. Periods with no scored replies are absent from the series rather than reported as zero.","operationId":"get_reply_quality_trend_v1_admin_reply_quality_trend_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Drill into one workspace; omit for the fleet view.","title":"Tenant Id"},"description":"Drill into one workspace; omit for the fleet view."},{"name":"granularity","in":"query","required":false,"schema":{"$ref":"#/components/schemas/StatsGranularity","description":"Bucket size: day, week or month.","default":"week"},"description":"Bucket size: day, week or month."},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Window start (UTC). Defaults to 12 weeks before `until`.","title":"Since"},"description":"Window start (UTC). Defaults to 12 weeks before `until`."},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Window end, exclusive (UTC). Defaults to now.","title":"Until"},"description":"Window end, exclusive (UTC). Defaults to now."},{"name":"scorer_version","in":"query","required":false,"schema":{"type":"string","description":"Restrict to one rubric version, or 'all' to see every version in the window.","default":"m0.8","title":"Scorer Version"},"description":"Restrict to one rubric version, or 'all' to see every version in the window."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyQualityTrend"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/reply-quality/{score_id}/review":{"put":{"tags":["admin"],"summary":"Record a reviewer's triage decision and judge verdict","description":"Save the human read of one scored reply: where it belongs in the queue, whether the judge was right about it, what went wrong, and an optional note. Saving again replaces the previous review. Admin users only.","operationId":"review_reply_score_v1_admin_reply_quality__score_id__review_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"score_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Score Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReplyReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__reply_review__ReplyScoreReview__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/requests":{"get":{"tags":["admin"],"summary":"Cross-tenant Request ledger","operationId":"list_requests_v1_admin_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"}},{"name":"reporter_actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reporter Actor Id"}},{"name":"source","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/BugReportSource"},{"type":"null"}],"title":"Source"}},{"name":"intake_kind","in":"query","required":false,"schema":{"anyOf":[{"enum":["bug","feature"],"type":"string"},{"type":"null"}],"title":"Intake Kind"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/BugReportStatus"},{"type":"null"}],"title":"Status Code"}},{"name":"severity","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RequestSeverity"},{"type":"null"}],"title":"Severity"}},{"name":"area","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":255},{"type":"null"}],"title":"Area"}},{"name":"priority","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":4,"minimum":0},{"type":"null"}],"title":"Priority"}},{"name":"confidence_min","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Confidence Min"}},{"name":"confidence_max","in":"query","required":false,"schema":{"anyOf":[{"type":"number","maximum":1,"minimum":0},{"type":"null"}],"title":"Confidence Max"}},{"name":"linear_state_type","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/LinearStateType"},{"type":"null"}],"title":"Linear State Type"}},{"name":"duplicate_state","in":"query","required":false,"schema":{"$ref":"#/components/schemas/DuplicateState","default":"any"}},{"name":"related_run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Related Run Id"}},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created After"}},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Before"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":200},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"$ref":"#/components/schemas/RequestSort","default":"created_at:desc"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequestListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/requests/stats":{"get":{"tags":["admin"],"summary":"Request pipeline totals","operationId":"request_stats_v1_admin_requests_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"}},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created After"}},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Before"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequestStats"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/requests/{request_id}":{"get":{"tags":["admin"],"summary":"Request pipeline detail","operationId":"get_request_v1_admin_requests__request_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Request Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRequestDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs":{"get":{"tags":["admin"],"summary":"Cross-tenant Run ledger","operationId":"list_runs_v1_admin_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"}},{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"conversation_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"}},{"name":"parent_run_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Run Id"}},{"name":"status_code","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RunStatus"},{"type":"null"}],"title":"Status Code"}},{"name":"trigger_code","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/RunTrigger"},{"type":"null"}],"title":"Trigger Code"}},{"name":"source_kind","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/ClassASourceKind"},{"type":"null"}],"title":"Source Kind"}},{"name":"source_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":512},{"type":"null"}],"title":"Source Ref"}},{"name":"model","in":"query","required":false,"schema":{"anyOf":[{"type":"string","minLength":1,"maxLength":100},{"type":"null"}],"title":"Model"}},{"name":"cost_micro_usd_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Cost Micro Usd Min"}},{"name":"cost_micro_usd_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Cost Micro Usd Max"}},{"name":"duration_ms_min","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Duration Ms Min"}},{"name":"duration_ms_max","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","minimum":0},{"type":"null"}],"title":"Duration Ms Max"}},{"name":"started_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started After"}},{"name":"started_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started Before"}},{"name":"created_after","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created After"}},{"name":"created_before","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created Before"}},{"name":"truncated","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Truncated"}},{"name":"no_result","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"No Result"}},{"name":"silent","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Silent"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"sort_by","in":"query","required":false,"schema":{"$ref":"#/components/schemas/RunSort","default":"created_at:desc"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRunListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs/stats":{"get":{"tags":["admin"],"summary":"Run totals and metering","operationId":"run_stats_v1_admin_runs_stats_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRunStats"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/runs/{run_id}":{"get":{"tags":["admin"],"summary":"Run detail","operationId":"get_run_v1_admin_runs__run_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRunDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs/{run_id}/artifacts":{"get":{"tags":["admin"],"summary":"Run scratch metadata","operationId":"get_run_artifacts_v1_admin_runs__run_id__artifacts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRunArtifactList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs/{run_id}/messages":{"get":{"tags":["admin"],"summary":"Audited message metadata","operationId":"get_run_messages_v1_admin_runs__run_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMessageList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs/{run_id}/permission-requests":{"get":{"tags":["admin"],"summary":"Masked permission requests","operationId":"get_run_permission_requests_v1_admin_runs__run_id__permission_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminPermissionRequestList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs/{run_id}/timeline":{"get":{"tags":["admin"],"summary":"Run timeline","operationId":"get_run_timeline_v1_admin_runs__run_id__timeline_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}},{"name":"include","in":"query","required":false,"schema":{"anyOf":[{"const":"details","type":"string"},{"type":"null"}],"title":"Include"}},{"name":"sort_by","in":"query","required":false,"schema":{"enum":["at:desc","at:asc"],"type":"string","default":"at:desc","title":"Sort By"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminRunTimeline"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/runs/{run_id}/tool-calls":{"get":{"tags":["admin"],"summary":"Masked tool calls","operationId":"get_run_tool_calls_v1_admin_runs__run_id__tool_calls_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Run Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Pq"}},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","default":false,"title":"From Prev"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminToolCallList"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/service-keys":{"post":{"tags":["admin"],"summary":"Create service API key","description":"Mint a platform-level service API key. The plaintext key is returned once and cannot be retrieved again. ``expires_at`` is required (service credentials must expire). Admin-user only: a service key cannot mint service keys.","operationId":"create_service_api_key_v1_admin_service_keys_post","security":[{"HTTPBearer":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__service_api_key__ServiceApiKey__CreateValidator"}}}},"responses":{"201":{"description":"The created key, including the one-time plaintext.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__service_api_key__ServiceApiKey__CreatedValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["admin","admin"],"summary":"Search service api keys","description":"List service api keys with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_service_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated service api key list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__service_api_key__ServiceApiKey__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/service-keys/{id}":{"delete":{"tags":["admin"],"summary":"Revoke service API key","description":"Revoke a service API key by setting ``disabled_at``. Soft revoke: the row is kept for audit and the key stops authenticating. Idempotent. Admin-user only.","operationId":"revoke_service_api_key_v1_admin_service_keys__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["admin","admin"],"summary":"Get service api key","description":"Retrieve a single service api key by ID.","operationId":"get_item_v1_admin_service_keys__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested service api key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__service_api_key__ServiceApiKey__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/skills":{"get":{"tags":["admin"],"summary":"Search skills","description":"List skills with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_skills_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated skill list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/skills/{id}":{"get":{"tags":["admin"],"summary":"Get skill","description":"Retrieve a single skill by ID.","operationId":"get_item_v1_admin_skills__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested skill.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/slack-preview-channels":{"get":{"tags":["admin"],"summary":"List the channels a preview may be sent to","description":"Public, unarchived, non-shared channels of the allowlisted workspace that Patricia is already in. ``auth.test`` anchors the token to that workspace BEFORE the listing runs, so a mis-stored token cannot answer with another workspace's channel names. A convenience only: the send re-attests whatever channel id it is given. ``truncated`` says whether the list is complete.","operationId":"list_preview_channels_v1_admin_slack_preview_channels_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackPreviewChannelList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: ``errors[0].type`` is ``wrong_workspace``. The stored Slack credential is live but answers for a different workspace than the one previews may be posted into.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Preview sending is unavailable in this environment (no active Slack install for the allowlisted workspace), or Slack did not answer before anything was posted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/slack-preview-messages":{"get":{"tags":["admin"],"summary":"List the Slack message preview catalog","description":"Every catalogued Patricia message with the metadata the console needs to pick and explain one, plus whether this environment holds a credential for the one workspace a preview may be posted into. Reads the database only; makes no Slack call. Internal admin users only.","operationId":"list_preview_messages_v1_admin_slack_preview_messages_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackPreviewMessageList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/slack-preview-messages/{message_id}/render":{"get":{"tags":["admin"],"summary":"Render one catalogued Slack message","description":"Builds the entry from its dummy data through the REAL production builder and returns the frames: the notification line, a plain-text transcript, the control labels, and the raw Block Kit. Read-only: no Slack call, no database write. Works for render-only entries too.","operationId":"render_preview_message_v1_admin_slack_preview_messages__message_id__render_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"message_id","in":"path","required":true,"schema":{"type":"string","title":"Message Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackPreviewRender"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/slack-preview-send":{"post":{"tags":["admin"],"summary":"Send one catalogued Slack message as Patricia","description":"Posts one catalogued message, built from dummy data, into a public channel of the ONE allowlisted workspace. Nothing in it is clickable and every link in its text is defused. The request cannot name a workspace. Inspect ``errors[0].type`` on a 409 for the specific refusal (``wrong_workspace``, ``not_public``, ``shared``, ``archived``, ``is_dm``, ``mismatched_record``, ``not_in_channel``, ``partial_send``, ``delivery_unknown``, ``idempotency_conflict``, ``send_in_progress``). The required ``Idempotency-Key`` belongs to one principal and one message/channel pair. Repeat it to replay the recorded receipt or failure without posting another copy. An unsettled claim never re-sends. Only a proven-not-posted refusal releases the key, an unreachable Slack among them; a new key permits a deliberate second post.","operationId":"send_preview_message_v1_admin_slack_preview_send_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackPreviewSendRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackPreviewSendResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: inspect ``errors[0].type`` for the specific refusal (``wrong_workspace``, ``not_public``, ``shared``, ``archived``, ``is_dm``, ``mismatched_record``, ``not_in_channel``, ``partial_send``, ``delivery_unknown``, ``idempotency_conflict``, ``send_in_progress``). Repeat the same Idempotency-Key to ask for the recorded outcome without posting another copy. An interrupted claim or unproven delivery never authorizes another post.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Preview sending is unavailable in this environment (no active Slack install for the allowlisted workspace), or Slack did not answer before anything was posted.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited: more than 10 sends a minute from one staff principal.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/staff":{"get":{"tags":["admin"],"summary":"List staff","description":"Every live user, for granting or revoking platform-admin (is_internal) access.","operationId":"list_staff_v1_admin_staff_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":500,"minimum":1,"default":200,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StaffUserResponse"},"title":"Response List Staff V1 Admin Staff Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/staff/{user_id}/internal":{"put":{"tags":["admin"],"summary":"Grant/revoke platform admin","description":"Grant or revoke a user's is_internal flag. Admin-user only: a service key cannot change staff access (that would let a leaked key mint a permanent human admin). You cannot revoke your own access.","operationId":"set_internal_v1_admin_staff__user_id__internal_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"user_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"User Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetInternalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StaffUserResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/subscriptions":{"get":{"tags":["admin"],"summary":"Search subscriptions","description":"List subscriptions with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_subscriptions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated subscription list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__Subscription__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/subscriptions/{id}":{"get":{"tags":["admin"],"summary":"Get subscription","description":"Retrieve a single subscription by ID.","operationId":"get_item_v1_admin_subscriptions__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested subscription.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__Subscription__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/teams/app-package":{"get":{"tags":["admin"],"summary":"Download this deployment's Microsoft Teams app package","description":"The same archive ``GET /v1/integrations/teams/app-package`` serves, reachable by a platform staff user who holds no membership in the customer's workspace. Built in memory from the Teams manifest and icons in the runtime image; reads no database. Internal admin users only.","operationId":"admin_teams_app_package_v1_admin_teams_app_package_get","responses":{"200":{"description":"The deployment-specific Teams app package.","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"This deployment cannot build a package. ``teams_not_configured`` when the Microsoft application id is unset or malformed; ``teams_app_package_unavailable`` when the manifest or an icon in the runtime image cannot be read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/admin/teams/{tenant_id}/browser-handoffs/{handoff_id}/close":{"post":{"tags":["admin"],"summary":"Close a live browser sign-in","description":"End a person's live browser sign-in at once. Nothing they signed in to is kept.","operationId":"close_browser_handoff_v1_admin_teams__tenant_id__browser_handoffs__handoff_id__close_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"handoff_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Handoff Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants":{"get":{"tags":["admin"],"summary":"Search tenants","description":"List tenants with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_tenants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated tenant list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{id}":{"get":{"tags":["admin"],"summary":"Get tenant","description":"Retrieve a single tenant by ID.","operationId":"get_item_v1_admin_tenants__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/brain/stats":{"get":{"tags":["admin"],"summary":"Brain memory-structure stats for a tenant","description":"Scope×kind counts, salience histogram, totals, per-group + top docs.","operationId":"get_brain_stats_v1_admin_tenants__tenant_id__brain_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainStats"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/chat-style":{"get":{"tags":["admin"],"summary":"Owner chat style switch for a tenant","operationId":"get_chat_style_switch_v1_admin_tenants__tenant_id__chat_style_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminChatStyleResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["admin"],"summary":"Turn the owner chat style on or off for a tenant","description":"Platform-admin only. Off by default. Turning it off keeps the saved chat style.","operationId":"put_chat_style_switch_v1_admin_tenants__tenant_id__chat_style_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminChatStyleUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminChatStyleResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/curator/affected":{"get":{"tags":["admin"],"summary":"Recently pruned memories + archived docs (restorable)","operationId":"list_curator_affected_v1_admin_tenants__tenant_id__curator_affected_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuratorAffected"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/curator/config":{"get":{"tags":["admin"],"summary":"Effective Curator config for a tenant","operationId":"get_curator_config_v1_admin_tenants__tenant_id__curator_config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuratorConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["admin"],"summary":"Override Curator config for a tenant","description":"Persist per-tenant half-life / salience-floor / stale-doc-days into Tenant.settings.","operationId":"put_curator_config_v1_admin_tenants__tenant_id__curator_config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuratorConfigBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuratorConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/curator/sweep":{"post":{"tags":["admin"],"summary":"Run (or preview) a Curator sweep for a tenant","description":"``dry_run=true`` (default) computes the would-do counts WITHOUT mutating; ``dry_run=false`` applies the sweep (prunes/archives + writes an audit row).","operationId":"run_curator_sweep_v1_admin_tenants__tenant_id__curator_sweep_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"dry_run","in":"query","required":false,"schema":{"type":"boolean","default":true,"title":"Dry Run"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CuratorSweepResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/curator/sweeps":{"get":{"tags":["admin"],"summary":"Recent Curator sweep decisions for a tenant","operationId":"list_curator_sweeps_v1_admin_tenants__tenant_id__curator_sweeps_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/models__audit__AuditLog__FullValidator"},"title":"Response List Curator Sweeps V1 Admin Tenants  Tenant Id  Curator Sweeps Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/meeting-limits":{"get":{"tags":["admin"],"summary":"Meeting-recording limits for a tenant","operationId":"get_meeting_limits_v1_admin_tenants__tenant_id__meeting_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMeetingLimitsView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["admin"],"summary":"Set or clear a tenant's meeting-recording limits","description":"Platform-admin only. An omitted field is left unchanged; an explicit null clears the override so the tenant inherits the fleet default again.","operationId":"put_meeting_limits_v1_admin_tenants__tenant_id__meeting_limits_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMeetingLimitsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminMeetingLimitsView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/selected-notices/{notice_id}/repairs":{"post":{"tags":["admin"],"summary":"Requeue or cancel a settled selected-lane notice","description":"Platform-admin only. Reuses the same notice row: rechecks the cause from durable rows, resolves the owner's private DM, and returns the row to pending or cancelled. A delivery_unknown row needs confirm_not_delivered. The call attests that staff revalidated the destination; card provenance is not checked.","operationId":"repair_admin_selected_notice_v1_admin_tenants__tenant_id__selected_notices__notice_id__repairs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"notice_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Notice Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSelectedNoticeRepairRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSelectedNoticeRepairView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: admin write rejected on a state invariant. Inspect ``errors[0].type`` for the specific case (for example: ``self_action_forbidden``, ``already_disabled``, ``not_disabled``, ``last_internal_admin``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/subscription-package":{"get":{"tags":["admin"],"summary":"A tenant's negotiated subscription package","operationId":"get_subscription_package_v1_admin_tenants__tenant_id__subscription_package_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubscriptionPackageView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["admin"],"summary":"Attach a negotiated price and/or record a tenant's monthly credit allocation","description":"Platform-admin only. With no negotiated_stripe_price_id this only edits the live allocation, as before. With one, it's validated against Stripe and attached — the live allocation is untouched until the customer subscribes and the webhook syncs it.","operationId":"put_subscription_package_v1_admin_tenants__tenant_id__subscription_package_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubscriptionPackageUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubscriptionPackageView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/subscription-package/revert":{"post":{"tags":["admin"],"summary":"Detach the negotiated package and put the workspace back on the fleet default","description":"Platform-admin only. Detaches any attached price and resets the allocation to the fleet default FIRST, then cancels the subscription actually billing on it, if any — so a losing compare-and-set never leaves a canceled subscription behind. Safe to run twice.","operationId":"post_subscription_package_revert_v1_admin_tenants__tenant_id__subscription_package_revert_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubscriptionPackageRevert"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminSubscriptionPackageRevertResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tool-calls":{"get":{"tags":["admin"],"summary":"Search tool calls","description":"List tool calls with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_tool_calls_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated tool call list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__ToolCall__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tool-calls/{id}":{"get":{"tags":["admin"],"summary":"Get tool call","description":"Retrieve a single tool call by ID.","operationId":"get_item_v1_admin_tool_calls__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested tool call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__ToolCall__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tool-definitions":{"get":{"tags":["admin"],"summary":"Search tool definitions","description":"List tool definitions with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_tool_definitions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated tool definition list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__tool__ToolDefinition__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tool-definitions/{id}":{"get":{"tags":["admin"],"summary":"Get tool definition","description":"Retrieve a single tool definition by ID.","operationId":"get_item_v1_admin_tool_definitions__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested tool definition.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__tool__ToolDefinition__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/unhappiness":{"get":{"tags":["admin"],"summary":"Unhappy replies","operationId":"list_unhappiness_v1_admin_unhappiness_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Until"}},{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"label","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/UnhappinessLabel"},{"type":"null"}],"title":"Label"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUnhappinessListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/unhappiness/people":{"get":{"tags":["admin"],"summary":"People who have unhappiness check rows in the window","operationId":"list_unhappiness_people_v1_admin_unhappiness_people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Until"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUnhappinessPeopleResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/unhappiness/summary":{"get":{"tags":["admin"],"summary":"Unhappy replies against all checked replies, per day and per label","operationId":"summarize_unhappiness_v1_admin_unhappiness_summary_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"}},{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"type":"string","format":"date-time","title":"Until"}},{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUnhappinessSummaryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/admin/usage":{"get":{"tags":["admin"],"summary":"How Patricia is used, in counts","description":"Return the label tallies for the window, split into every run and scored replies.\n\nThe window itself is bounded at 366 days and every run inside it is counted. Retention narrows\nthe COVERAGE pair only, which starts at ``coverage_since`` — scorecards are pruned on each\nworkspace's own schedule while runs are not, so a ratio reaching further back would read a\ndeletion as an ungraded reply.","operationId":"summarize_usage_v1_admin_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"since","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"}},{"name":"until","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Until"}},{"name":"team_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Team Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminUsageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/usage-records":{"get":{"tags":["admin"],"summary":"Search usage records","description":"List usage records with filtering, sorting, and pagination.","operationId":"list_items_v1_admin_usage_records_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated usage record list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__UsageRecord__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/usage-records/daily":{"get":{"tags":["admin"],"summary":"Tenant Daily Usage","description":"Per-day usage TOTALS for one workspace, newest first.\n\nSince per-run sharding stores one ``usage_records`` row per run, a raw list would return\nshards, not days. This aggregates (``SUM ... GROUP BY date``) so the admin daily table shows\nreal per-day figures.","operationId":"tenant_daily_usage_v1_admin_usage_records_daily_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"query","required":true,"schema":{"type":"string","format":"uuid","description":"The workspace whose daily usage to total.","title":"Tenant Id"},"description":"The workspace whose daily usage to total."},{"name":"days","in":"query","required":false,"schema":{"type":"integer","maximum":90,"minimum":1,"description":"How many most-recent days to return.","default":14,"title":"Days"},"description":"How many most-recent days to return."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DailyAggregate"},"title":"Response Tenant Daily Usage V1 Admin Usage Records Daily Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/usage-records/{id}":{"get":{"tags":["admin"],"summary":"Get usage record","description":"Retrieve a single usage record by ID.","operationId":"get_item_v1_admin_usage_records__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}}],"responses":{"200":{"description":"The requested usage record.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__billing__UsageRecord__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Permission denied (PERMISSION_DENIED) or email not verified (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/proactive-programs":{"get":{"tags":["admin-proactive-programs"],"summary":"List a tenant's proactive programs","description":"Every live Heartbeat / Workflow Discovery row for one workspace, with the mode that decides whether it may speak, the fire cursor that decides whether it runs at all, and any auto-pause label. An empty `scope` denies channel posts but allows DMs, so it is returned alongside.","operationId":"list_proactive_programs_v1_admin_tenants__tenant_id__proactive_programs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminProactiveProgramListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/admin/tenants/{tenant_id}/proactive-programs/{program_id}/mode":{"patch":{"tags":["admin-proactive-programs"],"summary":"Change a proactive program's mode","description":"Set how much one program may do: `observe` (runs, never sends), `dm_only` (DMs and reactions), `full` (also channel posts), or `disabled` (does not run). Widening past `observe` permits unprompted messages, so the change is recorded durably against the acting admin. The fire cursor is reconciled in the same transaction: a program that becomes runnable gets one, a program that stops being runnable gives up its cursor and lease.","operationId":"set_proactive_program_mode_v1_admin_tenants__tenant_id__proactive_programs__program_id__mode_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tenant_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Tenant Id"}},{"name":"program_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Program Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetProactiveProgramModeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AdminProactiveProgramResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/api-keys":{"post":{"tags":["api-keys"],"summary":"Create API key","description":"Mint a tenant API key. The plaintext key is returned once and cannot be retrieved again.","operationId":"create_api_key_v1_api_keys_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__api_key__ApiKey__CreateValidator"}}}},"responses":{"201":{"description":"The created key, including the one-time plaintext.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__api_key__ApiKey__CreatedValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["api-keys","api-keys"],"summary":"Search api keys","description":"List api keys with filtering, sorting, and pagination.","operationId":"list_items_v1_api_keys_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated api key list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__api_key__ApiKey__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/api-keys/{id}":{"delete":{"tags":["api-keys"],"summary":"Revoke API key","description":"Revoke a tenant API key. Soft revoke: the row is kept for audit and the key stops authenticating.","operationId":"revoke_api_key_v1_api_keys__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["api-keys","api-keys"],"summary":"Get api key","description":"Retrieve a single api key by ID.","operationId":"get_item_v1_api_keys__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested api key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__api_key__ApiKey__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/approvals":{"get":{"tags":["approvals"],"summary":"List everything awaiting a human decision","description":"One cursor-paginated feed over both approval kinds, newest first: tool-approval requests (kind=tool) and skill share requests (kind=skill_share). Each caller sees only the rows they are in the audience of: their own tool-approval audience, plus share requests they can decide (skills:edit) or raised themselves. Tool-argument values are sanitized and visible only to callers who can decide requests (runs:execute); read-only callers receive a value-free input_summary instead.","operationId":"list_approvals_v1_approvals_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/queries__approvals_feed__ApprovalsFeedQuery__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets":{"get":{"tags":["assets"],"summary":"List the workspace's files","description":"One page of live assets, most recently changed first. Narrow with `category` (document | media | app), `kind` (pdf, image, …) and `search` (case-insensitive substring of the name). `total` is the true number of matches across all pages, not the number returned, so a truncated page can never read as a complete library. Deleted files are never listed.","operationId":"list_assets_v1_assets_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Narrow to 'document', 'media' or 'app'.","title":"Category"},"description":"Narrow to 'document', 'media' or 'app'."},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Narrow to one kind, e.g. 'pdf' or 'image'.","title":"Kind"},"description":"Narrow to one kind, e.g. 'pdf' or 'image'."},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Case-insensitive name substring.","title":"Search"},"description":"Case-insensitive name substring."},{"name":"folder_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Narrow to one folder. Omit for no folder narrowing: every file, filed or not, unless unfiled=true also narrows to the unfiled ones.","title":"Folder Id"},"description":"Narrow to one folder. Omit for no folder narrowing: every file, filed or not, unless unfiled=true also narrows to the unfiled ones."},{"name":"author_actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Narrow to files one workspace member is credited with.","title":"Author Actor Id"},"description":"Narrow to files one workspace member is credited with."},{"name":"favorite","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"True narrows to favourites (the Liked filter). False and unset both mean all.","title":"Favorite"},"description":"True narrows to favourites (the Liked filter). False and unset both mean all."},{"name":"unfiled","in":"query","required":false,"schema":{"type":"boolean","description":"Narrow to files in no folder — the dashboard's top level. Cannot combine with folder_id.","default":false,"title":"Unfiled"},"description":"Narrow to files in no folder — the dashboard's top level. Cannot combine with folder_id."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"default":0,"title":"Offset"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetPage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["assets"],"summary":"Add a file to the workspace","description":"Store a new file at version 1. Send text kinds (markdown, html) as `content`, everything else base64-encoded as `content_base64`. The name must be free among the workspace's live files — a deleted file frees its name. Send `folder_id` to file it as it is created; the whole request is refused when that folder is not this workspace's, so a file is never stored somewhere nobody asked for. The new file is readable by the workspace (`team`); this route does not itself mint a public link, EXCEPT when `folder_id` names a folder that is already shared — filing into a shared folder publishes the file at once, and needs the same authority sharing does. Answers 404 for an unknown folder, 409 when the name is taken, 413 when the body is over the size cap, and 422 for an unknown kind or a mismatched content type.","operationId":"create_asset_v1_assets_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"An asset with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such folder in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"The request body exceeds the per-version size cap. Refused at the platform body ceiling, which equals this cap, so the message is the generic 'That request is too large.'","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The file exists, but the store holding its bytes cannot be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/folders":{"get":{"tags":["assets"],"summary":"List the workspace's folders","description":"Every folder in the workspace, in alphabetical order. Each carries its `parent_id` and its full `path`, the number of live files filed directly in it, and the number in its whole branch. Folders nest, so two folders can share a name in different parents and the `path` is what tells them apart. `total` is the true number, so a capped list can never read as the whole set.","operationId":"list_asset_folders_v1_assets_folders_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["assets"],"summary":"Make a folder","description":"Create an empty folder. Send `parent_id` to make it INSIDE another folder, or omit it for a top-level one. Names are unique per parent ignoring letter case, so 'Q3' and 'q3' cannot both sit in one folder while '2026/Q3' and '2027/Q3' can both exist — answers 409 when the name is in use there, and 404 when the parent is not this workspace's.","operationId":"create_asset_folder_v1_assets_folders_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A folder with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such folder in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/folders/{folder_id}":{"patch":{"tags":["assets"],"summary":"Rename a folder","description":"Give a folder a different name. The files in it and the folders inside it are untouched. Answers 404 when the folder does not exist or belongs to another workspace, and 409 when a folder in the SAME parent already holds the name. Changing only the capitalisation of its own name is allowed.","operationId":"rename_asset_folder_v1_assets_folders__folder_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderRename"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such folder in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A folder with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["assets"],"summary":"Remove a folder","description":"Remove a folder. **Nothing inside it is deleted** — every file goes back to being unfiled and stays in the library, and every folder inside it moves up one level to where this folder was. The response says how many of each moved. Answers 404 when the folder does not exist or belongs to another workspace, and 409 when lifting one of its folders would collide with a name already at that level.","operationId":"delete_asset_folder_v1_assets_folders__folder_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderRemoved"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such folder in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A folder with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/folders/{folder_id}/parent":{"put":{"tags":["assets"],"summary":"Move a folder","description":"Move a folder into another folder, or send `parent_id: null` to move it to the top level. The files in it and the folders inside it move with it. Sending the same body twice leaves the same state. Answers 404 when the folder or the destination does not exist or belongs to another workspace, 409 when the destination already has a folder with this name, and 400 when the move would put a folder inside itself or nest folders too deeply.","operationId":"move_asset_folder_v1_assets_folders__folder_id__parent_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder to move.","title":"Folder Id"},"description":"The folder to move."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderReparent"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such folder in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A folder with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/folders/{folder_id}/share-links":{"post":{"tags":["assets"],"summary":"Create a public link that opens every file in a folder","description":"Mint a folder link: every LIVE file in it becomes readable through the link, and every file filed into it afterward joins automatically. Needs the same authority as publishing each file in it today (its author, or an admin) — refused with no count and no names when the caller cannot publish every file. Behind the asset_folder_sharing_enabled kill switch.","operationId":"create_asset_folder_share_link_v1_assets_folders__folder_id__share_links_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AssetFolderShareLinkCreate"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderShareLinkCreated"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["assets"],"summary":"List a folder's share links","description":"Every share link minted for this folder, newest first, revoked ones included.","operationId":"list_asset_folder_share_links_v1_assets_folders__folder_id__share_links_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetFolderShareLinkInfo"},"title":"Response List Asset Folder Share Links V1 Assets Folders  Folder Id  Share Links Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/folders/{folder_id}/share-links/revoke-all":{"post":{"tags":["assets"],"summary":"Turn folder sharing off","description":"Revoke every not-yet-revoked link on this folder — the folder's own off switch. Re-sharing mints a new URL; the old one never revives. Needs only assets:edit.","operationId":"revoke_all_asset_folder_share_links_v1_assets_folders__folder_id__share_links_revoke_all_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderShareLinksRevoked"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/folders/{folder_id}/share-links/{link_id}":{"patch":{"tags":["assets"],"summary":"Change when a folder link stops working","description":"Set a working folder link's expiry, or send `expires_in_days: null` to remove its deadline. Needs the same authority as sharing — publishing every live file in the folder as it stands now, because prolonging a publication is publishing.","operationId":"extend_asset_folder_share_link_v1_assets_folders__folder_id__share_links__link_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The share link's id.","title":"Link Id"},"description":"The share link's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkExtend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderShareLinkInfo"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["assets"],"summary":"Revoke a folder share link","description":"Shut one folder link off. Takes effect on the next request. Needs only assets:edit.","operationId":"revoke_asset_folder_share_link_v1_assets_folders__folder_id__share_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"folder_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The folder's id.","title":"Folder Id"},"description":"The folder's id."},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The share link's id.","title":"Link Id"},"description":"The share link's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderShareLinkInfo"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/stats":{"get":{"tags":["assets"],"summary":"Count the workspace's files by type","description":"How many live files of each kind the workspace holds and how much space they take. Backs the type filter's counts and the library's footprint line.","operationId":"get_asset_stats_v1_assets_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetLibraryStats"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/trash":{"get":{"tags":["assets"],"summary":"List the trash","description":"Files removed in the last 30 days, most recently removed first, with when each stops being restorable. Older removals never appear. Requires the same permission as removing a file: the trash is a management surface, and it is the one place a removal's reason is readable.","operationId":"list_trash_v1_assets_trash_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","maximum":100000,"minimum":0,"default":0,"title":"Offset"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TrashPage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}":{"get":{"tags":["assets"],"summary":"Read one file and its version history","description":"One live asset plus every version stored for it, newest first. Answers 404 when the file does not exist, has been deleted, or belongs to another workspace.","operationId":"get_asset_v1_assets__asset_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The private access audit is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["assets"],"summary":"Move a file to the trash","description":"Remove a file from the workspace. It stays restorable from the trash for 30 days (`GET /assets/trash`, `POST /assets/{id}/restore`); every other read of it fails from here on (older versions included), and the name becomes free for reuse. Its open share links are revoked for good, so restoring the file does not re-open them — share it again with a new link. The reason travels in the request BODY, not the query string, so a person's words about why a file went away never land in an access log. Answers 404 when the file does not exist, has already been removed, or belongs to another workspace.","operationId":"delete_asset_v1_assets__asset_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetDelete"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["assets"],"summary":"Rename a file or mark it a favourite","description":"Change a file's name and/or its favourite mark. The name must be free among the workspace's live files (409 otherwise); favouriting is idempotent. Content, kind and versions never change here. Answers 404 when the file does not exist, has been deleted, or belongs to another workspace.","operationId":"update_asset_v1_assets__asset_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"An asset with that name already exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/canva-design":{"post":{"tags":["assets"],"summary":"Open a media file as a Canva design","description":"Create an editable Canva design from the current version of a supported media image. Answers 404 when the file is not visible to this caller.","operationId":"create_asset_canva_design_v1_assets__asset_id__canva_design_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetCanvaDesign"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED). PRIVATE_ASSET_ACKNOWLEDGEMENT_REQUIRED: confirm a deliberate opening.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Canva, file storage, or the private access audit is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/content":{"get":{"tags":["assets"],"summary":"Download a file","description":"The current version's bytes, always as an attachment. Answers 404 when the file does not exist, has been deleted, or belongs to another workspace.","operationId":"get_asset_content_v1_assets__asset_id__content_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The stored bytes, as an attachment.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED). PRIVATE_ASSET_ACKNOWLEDGEMENT_REQUIRED: confirm a deliberate opening.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"File storage or the private access audit is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/folder":{"put":{"tags":["assets"],"summary":"Put a file in a folder","description":"File this asset into a folder, or send `folder_id: null` to take it out of the one it is in. Sending the same body twice leaves the same state. Answers 404 when the file or the folder does not exist, has been deleted, or belongs to another workspace.","operationId":"set_asset_folder_v1_assets__asset_id__folder_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetFolderAssign"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such file or folder here.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/restore":{"post":{"tags":["assets"],"summary":"Bring a deleted file back","description":"Restore a file from the trash: it rejoins the live library with every version intact, under its original name. It does NOT come back shared — the removal revoked its links, and sharing it again is a fresh, deliberate act. Answers 404 when there is no restorable file with that id (never removed, past the restore window, or another workspace's) and 409 when a live file has taken the name in the meantime — rename that file first.","operationId":"restore_asset_v1_assets__asset_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A live file has taken this file's name in the meantime; rename it first.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No restorable file with that id: unknown, still live, past the window, or another workspace's.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/share-links":{"post":{"tags":["assets"],"summary":"Create the file's link","description":"Mint the file's link. It is the file's ADDRESS and publishes nothing: who can open it stays whatever the file is set to, checked every time somebody opens it. A file set to 'Only me' gets a link only its author can open; a file set to 'My team' opens for members of this workspace after they sign in; a file set to 'Anyone with the link' opens for anybody with no sign-in. ONE exception, and it is about the FOLDER rather than the file: a file whose folder holds a live folder link is readable by anybody holding that folder's link, whatever the file's own level says, so `asset_visibility` on this answer can read 'private' for a file a stranger can already open. Change who can see a file on PUT /assets/{id}/visibility, which is a separate act with its own permission. The link shows the file's CURRENT version and works until it EXPIRES, is revoked, or the file is deleted (deleting revokes it, so a restore does not bring it back). A new link lasts 30 days unless the body says otherwise. Send `expires_in_days: null` for a link with NO end date, for something meant to stay reachable (a report linked from a website, a deck in a proposal); it still stops the moment anyone revokes it, deletes the file, or sets the file to 'Only me', and a revoked link never comes back. Asking again for a file YOU already have an open link for returns that same link and the same token (`reused: true`) instead of a second URL, so one link can be handed out once and go on serving the file's latest version; it consumes no new link slot, and its end date only ever moves further out, never nearer, and only when you are the file's author or a workspace admin or the file is already 'Anyone with the link'; otherwise the link comes back unchanged and `deadline_moved` is false. Reuse also requires the file's level to equal the recorded mint level, so a publish returns an external-minted URL. A team-minted URL is never reused for that publish. The recorded level also supplies the folder-share bound. Each existing live link follows the file's CURRENT visibility: widening opens existing links to anyone the file allows, and narrowing closes direct outside reads immediately. An external-minted file token can still open through a folder with a live folder link. Revoked and expired links stay closed; password-protected links still require their grant. Folder-share access keeps the token's minted-level bound, so a team-minted file token cannot open through somebody else's folder share. Reuse is per PERSON: it returns the link you created, so a colleague asking for the same file gets their own, and a caller with no actor on their membership always gets a new one. A revoked or expired link is never reused — minting again after either produces a new URL, and the closed one stays closed. The token is shown in API responses only; the server stores it as a hash plus an encrypted copy that only your own later ask can read, so revoke and mint again to get a DIFFERENT URL. Answers 404 when the file does not exist, has been deleted, or belongs to another workspace, or is a private file that is not yours.","operationId":"create_asset_share_link_v1_assets__asset_id__share_links_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AssetShareLinkCreate"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkCreated"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["assets"],"summary":"List a file's share links","description":"Every share link minted for this file, newest first, revoked ones included — who can reach the file right now, and what has been shut off. Tokens are never included: they are shown once, at creation. Answers 404 when the file does not exist, has been deleted, or belongs to another workspace.","operationId":"list_asset_share_links_v1_assets__asset_id__share_links_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AssetShareLinkInfo"},"title":"Response List Asset Share Links V1 Assets  Asset Id  Share Links Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/share-links/{link_id}":{"patch":{"tags":["assets"],"summary":"Change when a share link stops working","description":"Set a working link's expiry, counted from now rather than added to what is left, or send `expires_in_days: null` to take its end date away so it works until somebody turns it off. Only a link that still works can be changed: a revoked or already-expired one is refused, because its URL has been out of use and handing that same URL back is not an edit to a date. Share the file again with a new link instead. The file's LEVEL is never a refusal on its own: a date is not an audience, and a link on a `private` file is that file's address like any other. Prolonging a publication is publishing, so this needs the same authority as deciding who may read the file: the person who added it or a workspace admin. The one exception is a file already at 'Anyone with the link', whose audience is already decided and whose links any editor may keep working. That authority is answered before the link is looked up: 403 when you may read the file but may not decide its audience, whatever link id you name, and otherwise 404 when the file or the link does not exist, has been deleted, or belongs to another workspace.","operationId":"extend_asset_share_link_v1_assets__asset_id__share_links__link_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The share link's id.","title":"Link Id"},"description":"The share link's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkExtend"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkInfo"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["assets"],"summary":"Revoke a share link","description":"Shut one share link off. Takes effect immediately: the public URL answers 404 from the next request on. Revoking an already-revoked link is a no-op that returns it unchanged. It answers for a deleted file too, where removing the file already closed every open link. Answers 404 when the link does not exist or belongs to another workspace.","operationId":"revoke_asset_share_link_v1_assets__asset_id__share_links__link_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The share link's id.","title":"Link Id"},"description":"The share link's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkInfo"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/share-links/{link_id}/password":{"put":{"tags":["assets"],"summary":"Set or remove a share link password","operationId":"set_asset_share_link_password_v1_assets__asset_id__share_links__link_id__password_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Asset Id"}},{"name":"link_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Link Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkPassword"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetShareLinkInfo"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/thumbnail":{"get":{"tags":["assets"],"summary":"Fetch a file's grid preview","description":"A small server-generated WebP preview of the file's current version, for the library grids. Answers 202 while a preview is being prepared (requesting one that is missing queues its generation), and 404 when the file does not exist, has been deleted, belongs to another workspace, or will never have a preview — the type icon is the fallback either way. Supports `If-None-Match` with the returned ETag.","operationId":"get_asset_thumbnail_v1_assets__asset_id__thumbnail_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The server-generated preview image.","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED). PRIVATE_ASSET_ACKNOWLEDGEMENT_REQUIRED: confirm a deliberate opening.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"202":{"description":"No preview yet; generation is queued. Ask again shortly."},"304":{"description":"Unchanged — the ETag the client holds is still current."},"503":{"description":"The private access audit is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/versions":{"post":{"tags":["assets"],"summary":"Save a new version of a file","description":"Append the next version of an existing file. The kind never changes; omitting `content_type` keeps the file's current one. Older versions stay downloadable. Answers 404 when the file does not exist, has been deleted, or belongs to another workspace, and 409 when someone else saved a version while this one was being prepared.","operationId":"create_asset_version_v1_assets__asset_id__versions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVersionCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A newer version was stored while this one was being prepared; read it again and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such file in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"The request body exceeds the per-version size cap. Refused at the platform body ceiling, which equals this cap, so the message is the generic 'That request is too large.'","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The file exists, but the store holding its bytes cannot be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/versions/{version}/content":{"get":{"tags":["assets"],"summary":"Download one version of a file","description":"An older version's bytes, always as an attachment. Older versions stay downloadable until the file is deleted. Answers 404 for an unknown version as well as an unknown file.","operationId":"get_asset_version_content_v1_assets__asset_id__versions__version__content_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"version","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"The version number to download.","title":"Version"},"description":"The version number to download."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The stored bytes, as an attachment.","content":{"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED). PRIVATE_ASSET_ACKNOWLEDGEMENT_REQUIRED: confirm a deliberate opening.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"File storage or the private access audit is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/versions/{version}/restore":{"post":{"tags":["assets"],"summary":"Bring an older version back","description":"Make an older version the current one again. The older version is copied forward as a NEW version rather than the file being rewound, so nothing is lost and the restore can itself be undone. Answers 404 when the file or that version does not exist, has been deleted, or belongs to another workspace.","operationId":"restore_asset_version_v1_assets__asset_id__versions__version__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"version","in":"path","required":true,"schema":{"type":"integer","minimum":1,"description":"The version to bring back.","title":"Version"},"description":"The version to bring back."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"A newer version was stored while this one was being prepared; read it again and retry.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such file, or no such version of it, in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The file exists, but the store holding its bytes cannot be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/assets/{asset_id}/visibility":{"put":{"tags":["assets"],"summary":"Change who can read a file","description":"Set who this file is shared with: `private` (only the person who added it, plus workspace admins), `team` (everyone in the workspace, the default), or `external` (the workspace, and it may also be shared outside through a link). Sending the same level twice leaves the same state. Widening to 'Anyone with the link' opens every live link to the file for outsiders, including links colleagues created earlier.\n\nOnly the person who ADDED the file may change this, plus workspace admins — everyone else gets a 403 saying so, not a 404: they can already see the file, so pretending it is missing would be the confusing answer. A 404 here means the file does not exist, has been removed, belongs to another workspace, or is somebody else's private file.\n\nSetting a file to `private` FROM another level also REVOKES every share link whose `revoked_at` is still empty, including a link that already expired. A file that is already `private` KEEPS the links it has: a private file has an address like any other, and the revoke fires on the transition INTO `private`, not on the level, so re-sending `private` revokes nothing and answers `revoked_share_links: 0`. Use `DELETE /assets/{id}/share-links/{link_id}` to close one of them. Narrowing to `team` revokes none of them: a link is an address, so those URLs keep opening for the people the new level admits and stop opening for everybody else, except an external-minted file token can still open through a folder with a live folder link. `private` is the one level that ends the links themselves, and it ends them for the file's own author too. Revoking rather than pausing is deliberate — 'Only me' is the off-switch people reach for, so widening the file again must not re-arm a URL somebody believed they had killed. Share the file again with a new link instead. Read `GET /assets/{id}/share-links` first if you need to tell somebody what they are about to switch off.","operationId":"set_asset_visibility_v1_assets__asset_id__visibility_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"asset_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's id.","title":"Asset Id"},"description":"The asset's id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetVisibilityUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AssetSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"You can see this file, but only the person who added it (or an admin) can re-share it.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such file in this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/audit-log":{"get":{"tags":["audit"],"summary":"Search audit logs","description":"List audit logs with filtering, sorting, and pagination.","operationId":"list_items_v1_audit_log_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated audit log list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__audit__AuditLog__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/audit-log/{id}":{"get":{"tags":["audit"],"summary":"Get audit log","description":"Retrieve a single audit log by ID.","operationId":"get_item_v1_audit_log__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested audit log.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__audit__AuditLog__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/auth/continue-workspace-link":{"post":{"tags":["auth"],"summary":"Continue into a verified workspace when existing sign-in rules agree","description":"Recheck the server session and the linked member without reading a redirect flag.","operationId":"continue_workspace_link_v1_auth_continue_workspace_link_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"204":{"description":"The account is linked, but no company session is available"}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/email-verifications":{"post":{"tags":["auth"],"summary":"Complete signup","description":"Step two of email signup. Redeems the emailed token, chooses the password, and creates the verified account. The caller then signs in normally.","operationId":"complete_email_verification_v1_auth_email_verifications_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationRequest"}}},"required":true},"responses":{"201":{"description":"The verified address; the account now exists.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailVerificationResponse"}}}},"400":{"description":"The link is not valid — expired, already used, or unrecognized (``INVALID_AUTH_ACTION``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"The address was claimed while this link was outstanding","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/entra/callback":{"get":{"tags":["auth"],"summary":"Entra Callback","description":"Exchange the code, issue the session, and hand tokens to the dashboard.\n\nOne callback path serves two purposes, dispatched by the VERIFIED contents of the signed state,\nexactly as the Slack callback does. Sharing the path is deliberate: a second callback would need\na second ``redirect_uri``, which is a change to the live Entra app registration.\n\nThe connect-redemption purpose is checked first and is a strictly separate branch — it never\nreaches ``service.complete`` and therefore never reaches ``AuthService.login_with_identity``,\nwhich creates a ``User`` and activates a pending membership. Proving who asked for a connect link\nmust do neither.","operationId":"entra_callback_v1_auth_entra_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/entra/email-assurance/resend":{"post":{"tags":["auth"],"summary":"Entra Assurance Resend","description":"Mail another link for a ceremony still waiting on its mailbox.\n\nThe same per-minute limit as its siblings, which is deliberately not where this route is\nbounded: it is the one that SENDS, so its real ceilings are durable and live in the service —\nthe challenge's own send budget, the cooldown between messages, and the per-address and\nper-principal windows. The edge limit only stops a caller reaching those as fast as the\nnetwork allows.","operationId":"entra_assurance_resend_v1_auth_entra_email_assurance_resend_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceResumeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/entra/email-assurance/resume":{"post":{"tags":["auth"],"summary":"Entra Assurance Resume","description":"Finish the sign-in the ceremony held open, and issue the session.\n\nUnlike the callback, this answers JSON rather than a redirect: the browser is already on the\ndashboard's waiting page by now, so there is nowhere to send it and no fragment to hide a\ntoken pair in. It reaches ``AuthService`` only from ``mailbox_verified``, which only\n:func:`entra_assurance_verify` can produce.","operationId":"entra_assurance_resume_v1_auth_entra_email_assurance_resume_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceResumeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/entra/email-assurance/status":{"post":{"tags":["auth"],"summary":"Entra Assurance Status","description":"What the waiting page polls while somebody goes and reads their mail.\n\nThe most permissive limit of the four, because a page polling every few seconds is the\ndesigned behaviour and this route reaches ``AuthService`` on no path.","operationId":"entra_assurance_status_v1_auth_entra_email_assurance_status_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceResumeRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/entra/email-assurance/verify":{"post":{"tags":["auth"],"summary":"Entra Assurance Verify","description":"Spend the mailed token with the resume secret presented alongside it.\n\nThe only route that moves a ceremony to ``mailbox_verified``, and it requires BOTH secrets.\nThat is what makes a stolen mailbox and a stolen tab each useless on their own.","operationId":"entra_assurance_verify_v1_auth_entra_email_assurance_verify_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceVerifyRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EntraAssuranceStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/entra/login":{"post":{"tags":["auth"],"summary":"Entra Login","description":"Redirect to \"Continue with Microsoft\" with a signed, short-TTL state and a PKCE challenge.","operationId":"entra_login_v1_auth_entra_login_post","parameters":[{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"App-relative path to return to after sign-in.","title":"Redirect"},"description":"App-relative path to return to after sign-in."},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Which first-party app the sign-in started from.","title":"Surface"},"description":"Which first-party app the sign-in started from."}],"responses":{"303":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":false,"content":{"application/x-www-form-urlencoded":{"schema":{"type":"object","properties":{"handoff":{"type":"string","description":"The calling tab's per-flow value, echoed back in the success fragment so the tab can recognise its own tokens. Travels in the body rather than the query because the upstream request plane retains query strings. The whole body is capped at 261 bytes."},"first_time":{"type":"boolean","default":false,"description":"Confirm that this is the person's first time using Patricia."}}}}}}}},"/v1/auth/login":{"post":{"tags":["auth"],"summary":"Login","description":"Authenticate with email and password and receive a token pair scoped to one tenant.","operationId":"login_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Access and refresh tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"401":{"description":"Invalid credentials or token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Not a member of the requested tenant","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Captcha required or rejected — see ``code`` (``CAPTCHA_REQUIRED`` / ``CAPTCHA_REJECTED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Captcha verification unavailable (``CAPTCHA_ERROR``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many attempts against this address (``TOO_MANY_REQUESTS``), or too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/logout":{"post":{"tags":["auth"],"summary":"Logout","description":"Revoke a refresh session. Silent on unknown or invalid tokens.","operationId":"logout_v1_auth_logout_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LogoutRequest"}}},"required":true},"responses":{"204":{"description":"No content."},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mailbox-proof":{"get":{"tags":["auth"],"summary":"Open a member merge mailbox confirmation","description":"Show a confirmation form for a live member-merge mailbox proof.","operationId":"member_merge_mailbox_proof_page_v1_auth_mailbox_proof_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/mailbox-proof/redeem":{"post":{"tags":["auth"],"summary":"Confirm a member merge mailbox","description":"Consumes the single-use token mailed to a member's stored address and returns the proof id that a member-merge request can cite.","operationId":"redeem_member_merge_mailbox_proof_v1_auth_mailbox_proof_redeem_post","requestBody":{"content":{"application/json":{"schema":{"properties":{"token":{"type":"string","maxLength":512,"minLength":1,"title":"Token","description":"The opaque token from the emailed link."}},"additionalProperties":false,"type":"object","required":["token"],"title":"MailboxProofRedemptionRequest","description":"Redeem the opaque token mailed to a member-merge target."}},"application/x-www-form-urlencoded":{"schema":{"properties":{"token":{"type":"string","maxLength":512,"minLength":1,"title":"Token","description":"The opaque token from the emailed link."}},"additionalProperties":false,"type":"object","required":["token"],"title":"MailboxProofRedemptionRequest","description":"Redeem the opaque token mailed to a member-merge target."}}},"required":true},"responses":{"200":{"description":"The consumed mailbox proof id.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MailboxProofRedemptionResponse"}}}},"400":{"description":"The link is not valid — expired, already used, or unrecognized (``INVALID_AUTH_ACTION``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/auth/me":{"get":{"tags":["auth"],"summary":"Get current user","description":"Return the authenticated user, their active tenant, and all tenant memberships.","operationId":"me_v1_auth_me_get","responses":{"200":{"description":"The authenticated user's profile + memberships.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeResponse"}}}},"401":{"description":"Invalid credentials or token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/auth/password-reset-requests":{"post":{"tags":["auth"],"summary":"Request a set/reset password link","description":"Sends a link that lets the holder of the mailbox choose a password. Answers 202 whether or not the address has an account.","operationId":"request_password_link_v1_auth_password_reset_requests_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordLinkRequest"}}},"required":true},"responses":{"202":{"description":"Always the same acknowledgement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthEmailAcceptedResponse"}}}},"400":{"description":"Captcha required or rejected — see ``code`` (``CAPTCHA_REQUIRED`` / ``CAPTCHA_REJECTED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Captcha verification unavailable (``CAPTCHA_ERROR``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many attempts against this address (``TOO_MANY_REQUESTS``), or too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/password-resets":{"post":{"tags":["auth"],"summary":"Set or reset a password","description":"Redeems a set/reset link, writes the new password, and invalidates every session and access token the old credential could still reach. The caller then signs in normally.","operationId":"complete_password_reset_v1_auth_password_resets_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"Acknowledgement; the password is now set.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthEmailAcceptedResponse"}}}},"400":{"description":"The link is not valid — expired, already used, or unrecognized (``INVALID_AUTH_ACTION``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/providers":{"get":{"tags":["auth"],"summary":"List sign-in providers for a surface","description":"Which sign-in providers this surface may offer right now. Public — it is read before any session exists. `available` means the provider's credentials are configured AND this surface may use it; it says nothing about any particular directory.","operationId":"auth_providers_v1_auth_providers_get","parameters":[{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Surface"}}],"responses":{"200":{"description":"Every known provider, with its availability for this surface.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthProvidersResponse"}}}},"400":{"description":"Unknown surface","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/refresh":{"post":{"tags":["auth"],"summary":"Refresh token","description":"Exchange a valid refresh token for a rotated token pair.","operationId":"refresh_v1_auth_refresh_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshRequest"}}},"required":true},"responses":{"200":{"description":"Rotated access and refresh tokens.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"401":{"description":"Invalid credentials or token","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/register":{"post":{"tags":["auth"],"summary":"Request a signup link","description":"Step one of email signup. Creates no user or password. It may mail a verification link to a free address or a tokenless sign-in notice to a live owner. Repeat notices and non-live owners receive no message. Answers 202 whether or not the address can be registered.","operationId":"register_v1_auth_register_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterRequest"}}},"required":true},"responses":{"202":{"description":"Always the same acknowledgement.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthEmailAcceptedResponse"}}}},"400":{"description":"Captcha required or rejected — see ``code`` (``CAPTCHA_REQUIRED`` / ``CAPTCHA_REJECTED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"Captcha verification unavailable (``CAPTCHA_ERROR``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many attempts against this address (``TOO_MANY_REQUESTS``), or too many requests from this client (``RATE_LIMITED``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/slack/callback":{"get":{"tags":["auth"],"summary":"Slack Callback","description":"Exchange the code, issue the session, and hand tokens to the originating SPA.\n\nOne callback path serves three purposes, dispatched by the VERIFIED contents of the signed state.\nSharing the path is deliberate: a second callback would need a second ``redirect_uri``, which is\na change to the live Slack app.\n\nThe connect-redemption purpose is checked first and is a strictly separate branch — it never\nreaches ``service.complete`` and therefore never reaches ``AuthService.login_with_identity``,\nwhich creates a ``User`` and activates a pending membership. Proving who asked for a connect\nlink must do neither. The self-link branch is next and likewise never reaches login.","operationId":"slack_callback_v1_auth_slack_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/auth/slack/login":{"get":{"tags":["auth"],"summary":"Slack Login","description":"Redirect to \"Sign in with Slack\" (OIDC) with a signed, short-TTL state.\n\nThe Turnstile verdict is taken HERE, on the one request in the round trip that can carry a\nwidget token, and sealed into the signed state for the callback to read. The token is\nconsumed by Cloudflare on this verification, so its appearance in a query string costs\nnothing after the redirect. It never gates the sign-in: an existing member with no token\nis redirected exactly as before, and only a first-touch bootstrap reads the verdict.","operationId":"slack_login_v1_auth_slack_login_get","parameters":[{"name":"redirect","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"App-relative path to return to after sign-in.","title":"Redirect"},"description":"App-relative path to return to after sign-in."},{"name":"surface","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Which first-party app the sign-in started from.","title":"Surface"},"description":"Which first-party app the sign-in started from."},{"name":"captcha_token","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Turnstile token solved on the sign-in page (action ``slack_login``). Never required to sign in: a first sign-in that would mint a starter grant is held under ``challenge_verification`` without one, which a card proof releases and a Slack connect does not. A token that is absent, rejected or over-length reads as unsolved; none of them refuses the sign-in.","title":"Captcha Token"},"description":"Turnstile token solved on the sign-in page (action ``slack_login``). Never required to sign in: a first sign-in that would mint a starter grant is held under ``challenge_verification`` without one, which a card proof releases and a Slack connect does not. A token that is absent, rejected or over-length reads as unsolved; none of them refuses the sign-in."}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/authored-skills":{"post":{"tags":["authored-skills"],"summary":"Author a skill from a manifest (manual editor)","description":"Create or update a tenant skill from a manifest object. An owner or admin author's version activates immediately and can be installed. A version authored without that authority stays PROPOSED until an owner or admin approves it. Immutable per version: a changed body needs a new version number. Draft-only delivery means a tenant skill can never post to a channel on its own.","operationId":"author_skill_v1_authored_skills_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManifestBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["authored-skills"],"summary":"List this workspace's authored skills","description":"The tenant's OWN authored skills (never git-catalog or another tenant's). ``in_use`` says a skill is enabled somewhere in the workspace, whoever holds it, so the page can offer Enable only where it would actually succeed. ``authored_by_caller`` says the caller wrote at least one version — the My skills tab's question, never an authority one (see ``can_manage``).","operationId":"list_authored_skills_v1_authored_skills_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/AuthoredSkillSummary"},"title":"Response List Authored Skills V1 Authored Skills Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/files":{"post":{"tags":["authored-skills"],"summary":"Create an authored skill from editable files","description":"Create a tenant-authored skill from the complete manifest and file set held by the editor. The server stores the first version as 1.0.0 and refuses an existing tenant slug.","operationId":"create_authored_skill_files_v1_authored_skills_files_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAuthoredSkillFilesRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/from-github":{"post":{"tags":["authored-skills"],"summary":"Autodetect skills in a public GitHub repo","description":"Point at a PUBLIC github.com repo to autodetect every manifest.yaml in it. Patricia downloads the repo tarball over an SSRF-hardened, size-capped fetch (github hosts only, no redirects, private/internal addresses blocked, DNS-rebind-proof IP pinning), reads it safely in memory, and returns the skills it found with friendly validation results. No skill is created: pick a valid one and author it via /authored-skills/from-github/author.","operationId":"autodetect_from_github_v1_authored_skills_from_github_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GithubImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GithubAutodetectResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/from-github/author":{"post":{"tags":["authored-skills"],"summary":"Author a chosen GitHub-autodetected skill","description":"Author a candidate returned by /authored-skills/from-github. This route accepts semver_is_derived as its one preview-supplied hint because it does not hold the source bundle. The hint changes only whether Patricia refreshes identity.semver from the submitted SKILL.md and manifest. The manifest is re-validated and re-compiled through the same platform gates. The caller and archetype determine whether the version activates immediately, needs approval, or is refused. The skill remains draft-only, tenant-scoped, and recorded as source_kind='github'.","operationId":"author_from_github_v1_authored_skills_from_github_author_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportAuthorRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/from-markdown":{"post":{"tags":["authored-skills"],"summary":"Preview the skill a pasted SKILL.md describes","description":"Paste a SKILL.md and see what it would become before anything is saved: the slug, title and description Patricia read out of it, and whether this caller's import activates, needs approval, or is refused. Creates nothing. Edit the returned manifest and post it to /authored-skills/from-markdown/author, which re-validates and re-compiles it from scratch.","operationId":"preview_from_markdown_v1_authored_skills_from_markdown_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownImportRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportedSkillPreview"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/from-markdown/author":{"post":{"tags":["authored-skills"],"summary":"Author a previewed pasted SKILL.md","description":"Author the skill previewed by /authored-skills/from-markdown, optionally with the manifest edited on screen. The manifest is re-validated and re-compiled through the same platform gates, so nothing from the preview is trusted. The server derives version ownership from the submitted SKILL.md and ignores the semver_is_derived field shared with the GitHub route. The caller and archetype determine whether the version activates immediately, needs approval, or is refused. The skill remains draft-only, tenant-scoped, and recorded as source_kind='markdown'.","operationId":"author_from_markdown_v1_authored_skills_from_markdown_author_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ImportAuthorRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/health":{"post":{"tags":["authored-skills"],"summary":"Check an authored skill's health","description":"Inspect unsaved manifest and file bytes without persistence. Broken skills return 200 with specific blockers and warnings in the response. A blocker names something that will fail or cannot run. Health does not stop saving, enabling, or upgrading today.","operationId":"check_authored_skill_health_v1_authored_skills_health_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillHealthRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillHealthReport"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/import-proposal":{"post":{"tags":["authored-skills"],"summary":"Propose missing facets for an imported skill","description":"Propose taxonomy, keywords, tags, and connected integrations that the derived manifest does not already declare. Every field is a suggestion that a person confirms or edits before saving. This single endpoint serves pasted and GitHub imports because both now supply the same derived manifest and prose. It stays separate from the local preview because a person may re-run that preview after each edit, while this proposal makes a metered model call. A GitHub scan previews every candidate, so combining the calls would spend once per candidate before the person chooses one. A proposal timeout also returns an empty suggestion without removing a valid preview from the screen.","operationId":"propose_import_facets_v1_authored_skills_import_proposal_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillFacetProposalRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillFacetProposalResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/instructions":{"post":{"tags":["authored-skills"],"summary":"Author an instruction skill (simple editor)","description":"Create or update an instruction skill from the simple form: a name, a short description, and plain-markdown instructions. An owner or admin author's version is ready to enable immediately. A version authored without that authority needs an owner or admin to approve it first. The version is managed automatically, so you never type a version.","operationId":"author_instruction_v1_authored_skills_instructions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstructionSkillBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/instructions/markdown":{"post":{"tags":["authored-skills"],"summary":"Author an instruction skill from a pasted SKILL.md (default editor)","description":"Create or update an instruction skill from a single pasted (or imported) SKILL.md: optional YAML front matter (name, description) then plain-markdown instructions. Parsed server-side into the SAME 'instructions' archetype as the typed path. An owner or admin author's version is ready to enable immediately; a version authored without that authority needs an owner or admin's approval first. The version is managed automatically. The raw markdown is preserved verbatim for later editing.","operationId":"author_markdown_instruction_v1_authored_skills_instructions_markdown_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownInstructionSkillBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/instructions/markdown/validate":{"post":{"tags":["authored-skills"],"summary":"Validate a pasted SKILL.md (live editor validation)","description":"Validate the DEFAULT paste-a-SKILL.md form WITHOUT saving. Parses the markdown (optional front matter → name + description, a leading '# H1' as the name fallback, the rest as the instruction body), then compiles it through the platform gates. Returns the parsed name + description plus friendly, non-technical errors for the editor's live preview. Always 200 (the result is in the body).","operationId":"validate_markdown_instruction_skill_v1_authored_skills_instructions_markdown_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MarkdownInstructionSkillBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/instructions/validate":{"post":{"tags":["authored-skills"],"summary":"Validate an instruction skill (live editor validation)","description":"Validate the simple instruction-skill form (name + description + plain-markdown instructions) WITHOUT saving. Returns friendly, non-technical errors for the editor to show inline. Always 200.","operationId":"validate_instruction_skill_v1_authored_skills_instructions_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstructionSkillBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/upload":{"post":{"tags":["authored-skills"],"summary":"Author a skill from an uploaded ZIP package","description":"Upload a .zip containing a manifest.yaml (+ optional SKILL.md). The archive is read safely in memory (no extraction, hard size/bomb/traversal caps); the manifest is validated + compiled like the manual path. Send the raw .zip as the request body. An owner or admin author's version activates immediately; a version authored without that authority needs an owner or admin's approval. Tenant-authored delivery remains draft-only.","operationId":"upload_skill_zip_v1_authored_skills_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/validate":{"post":{"tags":["authored-skills"],"summary":"Validate a skill manifest (live editor validation)","description":"Validate + compile a manifest through the platform gates WITHOUT saving. Returns friendly, non-technical errors for the editor to show inline. Always 200 (the result is in the body).","operationId":"validate_manifest_v1_authored_skills_validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ManifestBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ValidationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/{manifest_version_id}/approve":{"post":{"tags":["authored-skills"],"summary":"Approve a proposed tenant skill version","description":"Activate a proposed tenant version. Owners and admins may approve their own authored versions. A version authored without that authority must be approved by a different owner or admin.","operationId":"approve_authored_version_v1_authored_skills__manifest_version_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"manifest_version_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Manifest Version Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApproveResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/{skill_id}":{"get":{"tags":["authored-skills"],"summary":"Get one authored skill + its versions + editable manifest","description":"One authored skill scoped to the caller's tenant (foreign/global id → 404). ``in_use`` says the skill is enabled somewhere in the workspace; ``installation`` carries the install itself only when this caller may see it, so a teammate's personal install reads as in use with no install to open.","operationId":"get_authored_skill_v1_authored_skills__skill_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthoredSkillDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["authored-skills"],"summary":"Delete an authored skill (DSAR hard-delete)","description":"Hard-delete the skill + its versions, compiled rows, files, installs, and occurrences. A skills:delete holder (owner/admin, or a delete-scoped API key) removes ANY authored skill, installed or not. Without that authority, only the skill's own author may delete it, and only once it has NO install left, whatever its scope and whoever owns it — including the author's own. Uninstall first (a route the author already has), then delete.","operationId":"delete_authored_skill_v1_authored_skills__skill_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/{skill_id}/files":{"get":{"tags":["authored-skills"],"summary":"Get an authored skill's editable files","description":"Return the newest tenant-authored version as editable YAML and bundle files. Foreign and global skill ids return 404. A blocker names something that will fail or cannot run. Health does not stop saving, enabling, or upgrading today.","operationId":"get_authored_skill_files_v1_authored_skills__skill_id__files_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthoredSkillFilesResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["authored-skills"],"summary":"Replace an authored skill's editable files","description":"Replace the newest tenant-authored skill with the complete manifest and file set held by the editor. An unchanged save reuses the current version. A changed save creates the next patch version. A blocker names something that will fail or cannot run. Health does not stop saving, enabling, or upgrading today.","operationId":"save_authored_skill_files_v1_authored_skills__skill_id__files_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthoredSkillFilesRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/{skill_id}/install":{"post":{"tags":["authored-skills"],"summary":"Enable an authored skill in this workspace","description":"Enable the tenant skill's active (approved) version. An INSTRUCTION skill is enabled immediately (its guidance reaches Patricia through the prompt, so there is nothing to schedule); the response lists any recommended integrations the workspace hasn't connected yet, to nudge the teammate. A SANS (scheduled) skill is born PAUSED + a default config, exactly like a catalog skill: the admin completes settings + runs activation review before delivery.\n\nThe optional body chooses how widely to enable it. Omit it (or send `team`) for the whole workspace, exactly as before, when the caller holds skills:install. Without skills:install, an absent body enables it for yourself alone instead; an EXPLICIT `team` is refused (403) rather than silently narrowed. Send `personal` to enable it for yourself alone: only your conversations carry the skill's guidance. Personal needs an INSTRUCTION skill (400 otherwise) and a caller whose membership links to a chat profile (400 otherwise, so an API key can never own one). Either way the workspace holds ONE install of a skill, so a second Enable is a 409.","operationId":"install_authored_skill_v1_authored_skills__skill_id__install_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/InstallAuthoredSkillRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthoredInstallResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/authored-skills/{skill_id}/installation/kill":{"patch":{"tags":["authored-skills"],"summary":"Emergency stop: halt (or resume) this workspace's install of an authored skill","description":"Break-glass for a skill of this workspace's own: set or clear the kill switch on whichever install the workspace holds of it, whoever took it. A killed instruction skill's guidance stops reaching prompts immediately, including its owner's.\n\nThis exists because a PERSONAL install is invisible to everyone but its owner, and so is its installation id, which left the per-install kill switch at ``PATCH /skill-installations/{id}/kill`` unreachable for exactly the untrusted prose it matters most for. Use that route whenever you can see the install; use this one when the workspace needs to stop a skill it cannot open. It answers 204 and nothing else: no installation id, no owner, no scope, no current state, so it restores the stop without disclosing anything the privacy fence protects. 404 only when this workspace has no install of the skill at all. Requires skills:edit.","operationId":"kill_authored_skill_installation_v1_authored_skills__skill_id__installation_kill_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KillRequest"}}}},"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/auto-approve":{"get":{"tags":["auto-approve"],"summary":"Get an actor's auto-approve settings","description":"Read an actor's durable auto-approve grants + the tenant master state (your own, or anyone's if you are an admin).","operationId":"get_auto_approve_v1_actor_preferences_auto_approve_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoApproveActorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/auto-approve/tools/{tool_ref}":{"delete":{"tags":["auto-approve"],"summary":"Revoke a durable auto-approve grant for one tool","description":"Remove the actor's 'auto-approve this tool going forward' grant (your own, or anyone's if you are an admin).","operationId":"revoke_auto_approve_tool_v1_actor_preferences_auto_approve_tools__tool_ref__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"tool_ref","in":"path","required":true,"schema":{"type":"string","description":"The canonical tool ref of the durable grant to revoke.","title":"Tool Ref"},"description":"The canonical tool ref of the durable grant to revoke."},{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoApproveActorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/auto-approve/tenant":{"get":{"tags":["auto-approve"],"summary":"Get the tenant auto-approve controls","description":"Read the workspace master switch, kill-switch epoch, and allowlist (admin).","operationId":"get_tenant_auto_approve_v1_auto_approve_tenant_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantAutoApproveResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["auto-approve"],"summary":"Set the tenant auto-approve controls","description":"Set the workspace master switch and allowlist. An explicit bump, a master disable, or an unreadable stored block moves the epoch at most once per request. When the stored epoch is readable, a bump invalidates every durable and in-flight grant. An unreadable epoch cannot be recovered, so its repair still bumps from the fail-closed epoch. Admin only.","operationId":"set_tenant_auto_approve_v1_auto_approve_tenant_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantAutoApproveBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantAutoApproveResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/creation-attempts/{attempt_id}/retries":{"post":{"tags":["autonomy-creation"],"summary":"Retry a permission setup","description":"Start a new permission setup attempt from a prior attempt's input. The new attempt has a new id.","operationId":"retry_creation_attempt_v1_autonomy_creation_attempts__attempt_id__retries_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationAttemptStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/creation-candidates":{"post":{"tags":["autonomy-creation"],"summary":"Request permission details for a saved task","description":"Report the latest permission setup of a saved task you created, or record new explicit choices for it under a new attempt id.","operationId":"create_creation_candidate_v1_autonomy_creation_candidates_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationCandidateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationAttemptStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/creation-candidates/{candidate_id}":{"get":{"tags":["autonomy-creation"],"summary":"Read prepared permission details","description":"The prepared permission details of a saved task you created.","operationId":"get_creation_candidate_v1_autonomy_creation_candidates__candidate_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Candidate Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationCandidateView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/creation-candidates/{candidate_id}/review-intents":{"post":{"tags":["autonomy-creation"],"summary":"Open the review of prepared permission details","description":"Issue a private review of the prepared permission details of a saved task you created. Lowered limits in the body produce a revision of the details first.","operationId":"create_creation_review_v1_autonomy_creation_candidates__candidate_id__review_intents_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"candidate_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Candidate Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationReviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationReviewView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/creation-options":{"get":{"tags":["autonomy-creation"],"summary":"List permission choices for a new task","description":"Actions and read accounts the caller can pick before saving a scheduled task or trigger.","operationId":"list_creation_options_v1_autonomy_creation_options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationOptionsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/creation-sources/{source_kind}/{source_id}":{"get":{"tags":["autonomy-creation"],"summary":"Read a saved task's or trigger's permission setup","description":"Read the latest permission setup of a task or trigger you created, without changing it.","operationId":"get_creation_source_status_v1_autonomy_creation_sources__source_kind___source_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_kind","in":"path","required":true,"schema":{"enum":["task_cron","event_trigger"],"type":"string","title":"Source Kind"}},{"name":"source_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Source Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationSourceStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/autonomy/review-intents/{intent_id}/decision":{"post":{"tags":["autonomy-creation"],"summary":"Allow or decline a permission review","description":"Allow or decline a review you opened. Declining leaves the task running with its approval settings.","operationId":"decide_creation_review_v1_autonomy_review_intents__intent_id__decision_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"intent_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Intent Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationReviewDecisionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreationReviewDecisionResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing":{"get":{"tags":["billing"],"summary":"Get the workspace billing summary","description":"The caller's subscription tier/status, seats, remaining credits, and the Stripe publishable key.","operationId":"get_billing_v1_billing_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillingSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/auto-refill":{"get":{"tags":["billing"],"summary":"Get the workspace auto-refill settings","description":"The tenant's auto-refill config (enable/threshold/amount/cap), or null if never set.","operationId":"get_auto_refill_v1_billing_auto_refill_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/AutoRefillConfigView"},{"type":"null"}],"title":"Response Get Auto Refill V1 Billing Auto Refill Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["billing"],"summary":"Set the workspace auto-refill settings","description":"Create or replace the tenant's auto-refill config (enable/threshold/amount/cap).","operationId":"set_auto_refill_v1_billing_auto_refill_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRefillConfigUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutoRefillConfigView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/bill-to":{"get":{"tags":["billing"],"summary":"Get the billing details","description":"The workspace's billing details (company name, address, tax id) shown on its invoices.","operationId":"get_bill_to_v1_billing_bill_to_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillToView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["billing"],"summary":"Update the billing details","description":"Replace the billing details snapshotted onto future invoices (existing invoices keep theirs).","operationId":"set_bill_to_v1_billing_bill_to_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillToUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BillToView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/checkout":{"post":{"tags":["billing"],"summary":"Start a Stripe Checkout Session","description":"Create a hosted Checkout Session for a seat subscription or a credit pack; returns its URL.","operationId":"start_checkout_v1_billing_checkout_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/invoices":{"get":{"tags":["billing"],"summary":"List invoices","description":"The tenant's invoices, newest first (totals only; line items via the single-invoice read).","operationId":"list_invoices_v1_billing_invoices_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/invoices/{invoice_id}":{"get":{"tags":["billing"],"summary":"Get one invoice (with line items)","description":"A single invoice and its line items: the structured source for the client-side PDF.","operationId":"get_invoice_v1_billing_invoices__invoice_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"invoice_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Invoice Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvoiceView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/payment-methods":{"get":{"tags":["billing"],"summary":"List saved payment methods","description":"The tenant's saved cards (brand/last4/expiry), default first.","operationId":"list_payment_methods_v1_billing_payment_methods_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/payment-methods/setup-session":{"post":{"tags":["billing"],"summary":"Start adding a payment method","description":"Create a Stripe Checkout session (setup mode) to save a card; returns its URL.","operationId":"create_setup_session_v1_billing_payment_methods_setup_session_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetupSessionResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/payment-methods/sync":{"post":{"tags":["billing"],"summary":"Refresh saved payment methods from Stripe","description":"Re-sync the saved-card list from Stripe (self-heal), then return it with ``refreshed`` saying whether Stripe was actually read. A false ``refreshed`` means the list is the last state we saved, not the current one.","operationId":"sync_payment_methods_v1_billing_payment_methods_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PaymentMethodSyncResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/payment-methods/{payment_method_id}":{"delete":{"tags":["billing"],"summary":"Remove a payment method","description":"Detach the card from Stripe and delete the local record. Does not disable auto-refill.","operationId":"delete_payment_method_v1_billing_payment_methods__payment_method_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"payment_method_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Payment Method Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such payment method for this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/payment-methods/{payment_method_id}/default":{"post":{"tags":["billing"],"summary":"Set a payment method as default","description":"Make a saved card the customer's default for off-session (auto-refill) charges.","operationId":"set_default_payment_method_v1_billing_payment_methods__payment_method_id__default_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"payment_method_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Payment Method Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No such payment method for this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/portal":{"post":{"tags":["billing"],"summary":"Open the Stripe Billing Portal","description":"Create a Billing Portal session so the tenant can manage its subscription; returns its URL.","operationId":"open_portal_v1_billing_portal_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PortalResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/starter-verification":{"post":{"tags":["billing"],"summary":"Start the $1 starter card verification","description":"Create a Stripe Checkout Session that authorizes (never charges) $1 to verify a card and unlock a held workspace's starter credits; returns its URL.","operationId":"start_starter_verification_v1_billing_starter_verification_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CheckoutResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Malformed request (unknown plan, or no billing account yet).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"This workspace has no starter card verification pending.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/switch-to-founding":{"post":{"tags":["billing"],"summary":"Switch back to the Founding plan","description":"Move this workspace off its attached negotiated price and back onto the flat Founding subscription, with a prorated credit for the unused portion. Safe to call twice.","operationId":"switch_to_founding_v1_billing_switch_to_founding_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"This workspace has no active subscription to switch.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/switch-to-negotiated":{"post":{"tags":["billing"],"summary":"Switch onto the attached custom plan","description":"Move this workspace's Founding subscription onto its attached negotiated price. Stripe invoices the prorated difference immediately; a declined card leaves the workspace on Founding.","operationId":"switch_to_negotiated_v1_billing_switch_to_negotiated_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"This workspace has no active subscription, or no negotiated package attached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/billing/switch-to-negotiated/preview":{"get":{"tags":["billing"],"summary":"Preview the charge for switching onto the attached custom plan","description":"What Stripe would invoice right now for moving this workspace onto its attached negotiated price — a read, nothing is charged or changed.","operationId":"preview_switch_to_negotiated_v1_billing_switch_to_negotiated_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NegotiatedSwitchPreview"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"This workspace has no active subscription, or no negotiated package attached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"502":{"description":"The payment provider call failed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Billing is not configured on this deployment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/brain-docs":{"get":{"tags":["brain-docs","brain-docs"],"summary":"Search brain docs","description":"List brain docs with filtering, sorting, and pagination.","operationId":"list_items_v1_brain_docs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated brain doc list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["brain-docs","brain-docs"],"summary":"Create brain doc","description":"Create a new brain doc.","operationId":"create_item_v1_brain_docs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__CreateValidator"}}}},"responses":{"201":{"description":"The created brain doc.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/brain-docs/{id}":{"get":{"tags":["brain-docs","brain-docs"],"summary":"Get brain doc","description":"Retrieve a single brain doc by ID.","operationId":"get_item_v1_brain_docs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested brain doc.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["brain-docs","brain-docs"],"summary":"Update brain doc","description":"Full update (PUT) of a brain doc.","operationId":"update_item_v1_brain_docs__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__UpdateValidator"}}}},"responses":{"200":{"description":"The updated brain doc.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["brain-docs","brain-docs"],"summary":"Partial update brain doc","description":"Partial update (PATCH) of a brain doc.","operationId":"merge_item_v1_brain_docs__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__MergeValidator"}}}},"responses":{"200":{"description":"The updated brain doc.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["brain-docs","brain-docs"],"summary":"Delete brain doc","description":"Soft-delete a brain doc by ID.","operationId":"delete_item_v1_brain_docs__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/brain-docs/{doc_id}/pin":{"post":{"tags":["brain-overrides"],"summary":"Pin a brain doc","description":"Protect a doc from Curator archival and consolidation.","operationId":"pin_brain_doc_v1_brain_docs__doc_id__pin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/brain-docs/{doc_id}/restore":{"post":{"tags":["brain-overrides"],"summary":"Restore a brain doc","description":"Un-archive (and un-soft-delete) a doc, returning it to the active set.","operationId":"restore_brain_doc_v1_brain_docs__doc_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/brain-docs/{doc_id}/unpin":{"post":{"tags":["brain-overrides"],"summary":"Unpin a brain doc","operationId":"unpin_brain_doc_v1_brain_docs__doc_id__unpin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"doc_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Doc Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory-items/{item_id}/pin":{"post":{"tags":["brain-overrides"],"summary":"Pin a memory item","description":"Make a memory a standing rule. Every run in its scope carries up to 10 pinned memories, most recently pinned first, whatever the run asks, and a pin protects the memory from Curator decay, prune, and consolidation. A personal memory stands only in a run that answers its owner in the owner's own chat-platform direct message. A meeting memory keeps that protection but reaches a run only through ordinary recall.","operationId":"pin_memory_item_v1_memory_items__item_id__pin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory-items/{item_id}/restore":{"post":{"tags":["brain-overrides"],"summary":"Restore a memory item","description":"Bring a pruned or soft-deleted memory back into the live recall set.","operationId":"restore_memory_item_v1_memory_items__item_id__restore_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory-items/{item_id}/unpin":{"post":{"tags":["brain-overrides"],"summary":"Unpin a memory item","operationId":"unpin_memory_item_v1_memory_items__item_id__unpin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/me/browser-logins":{"get":{"tags":["browser-logins"],"summary":"List my saved browser sign-ins","description":"The sites the signed-in teammate chose to stay signed in to for Patricia's browser.","operationId":"list_my_browser_logins_v1_me_browser_logins_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserLoginListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/me/browser-logins/{login_id}":{"delete":{"tags":["browser-logins"],"summary":"Forget one of my saved browser sign-ins","description":"Patricia can't use the sign-in anymore, and the browser service deletes it shortly after.","operationId":"forget_my_browser_login_v1_me_browser_logins__login_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"login_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Login Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/browser-views/answer":{"post":{"tags":["browser-views"],"summary":"Answer Browser View","description":"I'm done or Cancel, from the browser the page is bound to.","operationId":"answer_browser_view_v1_browser_views_answer_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewAnswerBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewAnswer"}}}},"403":{"description":"The page was first opened in another browser.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The link is unknown, expired or finished. One answer for each.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The browser service or the answer channel is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/browser-views/binding":{"post":{"tags":["browser-views"],"summary":"Bind Browser View","description":"The person pressed \"Open the browser\": the page is theirs, in this browser only.","operationId":"bind_browser_view_v1_browser_views_binding_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewSession"}}}},"403":{"description":"The page was first opened in another browser.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The link is unknown, expired or finished. One answer for each.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/browser-views/live-view":{"post":{"tags":["browser-views"],"summary":"Read Browser Live View","description":"The live browser for the page's frame, only for the browser the page is bound to.","operationId":"read_browser_live_view_v1_browser_views_live_view_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewLiveView"}}}},"403":{"description":"The page was first opened in another browser.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The link is unknown, expired or finished. One answer for each.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The browser service or the answer channel is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/browser-views/session":{"post":{"tags":["browser-views"],"summary":"Read Browser View","description":"What the page shows on arrival. Binds nothing, so a link scanner that runs the page takes nothing.","operationId":"read_browser_view_v1_browser_views_session_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewCodeBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrowserViewSession"}}}},"403":{"description":"The page was first opened in another browser.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"The link is unknown, expired or finished. One answer for each.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this address.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/built-in-templates":{"get":{"tags":["built-in-templates"],"summary":"List built-in templates","description":"List built-in scheduled-task templates and the caller's own schedule state. The Ad Anomaly Watch is one per workspace: its creator and workspace admins get the workspace's watch, the one that is on, or else the paused one changed most recently.","operationId":"list_built_in_templates_v1_built_in_templates_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The built-in templates and the caller's own schedule state.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuiltInTemplateListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/built-in-templates/{key}/config":{"put":{"tags":["built-in-templates"],"summary":"Change a built-in template's config","description":"Change the caller's own config for a built-in task, such as the sources a Daily Brief reads. For the Ad Anomaly Watch, its creator or a workspace admin changes the workspace's watch. Fields left out keep their stored value.","operationId":"update_template_config_v1_built_in_templates__key__config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBuiltInTemplateConfigRequest"}}}},"responses":{"200":{"description":"The built-in template with its new config.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuiltInTemplateStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/built-in-templates/{key}/disable":{"post":{"tags":["built-in-templates"],"summary":"Disable a built-in template","description":"Disable a built-in scheduled task while preserving its schedule.","operationId":"disable_template_v1_built_in_templates__key__disable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The disabled built-in template and its preserved schedule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BuiltInTemplateStatus"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/built-in-templates/{key}/enable":{"post":{"tags":["built-in-templates"],"summary":"Enable a built-in template","description":"Enable a built-in scheduled task. A local start time may be chosen on the first enable only, except for a template with a fixed schedule, which refuses one. A later enable restores the task's own preserved schedule and refuses a supplied local_time.","operationId":"enable_template_v1_built_in_templates__key__enable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/EnableBuiltInTemplateRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"The enabled built-in template and its schedule.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EnableBuiltInTemplateResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable: no reachable delivery destination could be resolved for this actor.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds":{"get":{"tags":["channel-feeds"],"summary":"List the workspace's channel triggers","description":"List active triggers by default, stopped triggers, or all visible triggers.","operationId":"list_channel_feeds_v1_channel_feeds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"status","in":"query","required":false,"schema":{"enum":["active","stopped","all"],"type":"string","default":"active","title":"Status"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["channel-feeds"],"summary":"Create a channel trigger","operationId":"create_channel_feed_v1_channel_feeds_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerCreateRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerCreateResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/catalog":{"get":{"tags":["channel-feeds"],"summary":"List trigger sources and events","operationId":"get_channel_feed_catalog_v1_channel_feeds_catalog_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerCatalogResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/channels":{"get":{"tags":["channel-feeds"],"summary":"List deliverable Slack channels for triggers","operationId":"list_channel_feed_channels_v1_channel_feeds_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerChannelsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/people":{"get":{"tags":["channel-feeds"],"summary":"List teammates for trigger conditions","operationId":"list_channel_feed_people_v1_channel_feeds_people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerPeopleResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/{feed_id}":{"patch":{"tags":["channel-feeds"],"summary":"Update a channel trigger","operationId":"update_channel_feed_v1_channel_feeds__feed_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerPatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["channel-feeds"],"summary":"Delete a channel trigger","operationId":"delete_channel_feed_v1_channel_feeds__feed_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/{feed_id}/fires":{"get":{"tags":["channel-feeds"],"summary":"List a channel trigger's recent fires","operationId":"list_channel_feed_fires_v1_channel_feeds__feed_id__fires_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":20,"minimum":1,"default":20,"title":"Limit"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerFireListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/{feed_id}/preview":{"post":{"tags":["channel-feeds"],"summary":"Preview a channel trigger","operationId":"preview_channel_feed_v1_channel_feeds__feed_id__preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerPreviewRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerPreviewResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/{feed_id}/resume":{"post":{"tags":["channel-feeds"],"summary":"Resume a stopped channel trigger","description":"Resumes one stopped trigger. Repeating the request is a successful no-op.","operationId":"resume_channel_feed_v1_channel_feeds__feed_id__resume_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/channel-feeds/{feed_id}/stop":{"post":{"tags":["channel-feeds"],"summary":"Stop a channel trigger","description":"Stops one trigger. Repeating the request is a successful no-op.","operationId":"stop_channel_feed_v1_channel_feeds__feed_id__stop_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"feed_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Feed Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TriggerView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/chat-platforms":{"get":{"tags":["chat-platforms"],"summary":"List the chat platforms a workspace can connect","description":"Every chat platform a workspace can connect, with the name the dashboard shows and the capabilities it reads. Public: the answer holds no workspace data.","operationId":"list_chat_platforms_v1_chat_platforms_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatPlatformsResponse"}}}}}}},"/v1/chat-style":{"get":{"tags":["chat-style"],"summary":"Get the workspace chat style","description":"How Patricia talks in chat for the caller's workspace. The style is null until one is saved or while workspace data use is off.","operationId":"get_chat_style_v1_chat_style_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatStyleResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["chat-style"],"summary":"Replace the workspace chat style","description":"Replace the whole chat style. Fields left out become empty, and the style is marked as edited.","operationId":"put_chat_style_v1_chat_style_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatStyle"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChatStyleResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-assets/{public_token}":{"get":{"tags":["company-assets"],"summary":"Serve a self-hosted brand asset (public, by capability token)","description":"Returns the raster logo bytes for the given capability token. Public + cacheable.","operationId":"get_company_asset_v1_company_assets__public_token__get","parameters":[{"name":"public_token","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The asset's random capability token.","title":"Public Token"},"description":"The asset's random capability token."}],"responses":{"200":{"description":"The asset bytes.","content":{"application/json":{"schema":{}},"image/*":{}}},"404":{"description":"No asset for that token.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Too many requests from this client (``RATE_LIMITED``).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/company-profile":{"get":{"tags":["company-profile"],"summary":"Get the workspace company profile","description":"The onboarding company profile for the caller's workspace (empty shape if unset).","operationId":"get_company_profile_v1_company_profile_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["company-profile"],"summary":"Update the workspace company profile","description":"Partial update of company-profile fields (only provided fields are written).","operationId":"update_company_profile_v1_company_profile_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-profile/analysis-progress":{"get":{"tags":["company-profile"],"summary":"Live progress of the website analysis","description":"What the website read currently running for the caller's workspace has done so far. Returns an idle, empty result whenever nothing is running.","operationId":"get_analysis_progress_v1_company_profile_analysis_progress_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalysisProgressResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-profile/analyze":{"post":{"tags":["company-profile"],"summary":"Analyze the company website","description":"Read the given site, extract the company profile (LLM, structured), self-host the brand marks (primary logo + icon), and persist. The response carries how every step of the read finished.","operationId":"analyze_company_website_v1_company_profile_analyze_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeWebsiteRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AnalyzeWebsiteResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"The site could not be analyzed (unreachable/blocked/unreadable).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Billing blocks the read: a monthly spend cap, an inactive subscription, no credits, or a held starter grant. `code` names which. A workspace that has used its free reads carries `free_website_reads_used` as `errors[0].type`.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"An analysis is already in progress for this workspace.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Rate limited: too many analyses; retry after a moment.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-profile/complete-onboarding":{"post":{"tags":["company-profile"],"summary":"Mark onboarding complete","description":"Flip the workspace's onboarding gate (idempotent).","operationId":"complete_onboarding_v1_company_profile_complete_onboarding_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingCompleteResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-profile/confirm":{"post":{"tags":["company-profile"],"summary":"Confirm suggested brand kit fields","description":"Confirm suggested fields that already have values. Repeated confirmations are safe.","operationId":"confirm_company_profile_fields_v1_company_profile_confirm_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmFieldsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-profile/logo":{"put":{"tags":["company-profile"],"summary":"Replace the workspace brand logo","description":"Self-host an uploaded brand logo, replacing any existing one. Send the raw image bytes as the request body with a Content-Type naming the type (PNG/JPEG/GIF/WEBP/ICO; max 2 MiB). Returns the updated profile.","operationId":"replace_company_logo_v1_company_profile_logo_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Missing or empty logo body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"The logo exceeds the maximum size.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Unsupported logo media type (raster image required).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/gif":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"image/x-icon":{"schema":{"type":"string","format":"binary"}},"image/vnd.microsoft.icon":{"schema":{"type":"string","format":"binary"}}}}},"delete":{"tags":["company-profile"],"summary":"Remove the workspace brand logo","description":"Unlink and delete the self-hosted brand logo (idempotent). Returns the updated profile.","operationId":"remove_company_logo_v1_company_profile_logo_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/company-profile/logos/{slot}/{mode}":{"put":{"tags":["company-profile"],"summary":"Replace a workspace brand logo slot","description":"Self-host an uploaded logo for one slot and mode. Send raw image bytes with a supported Content-Type (PNG/JPEG/GIF/WEBP/ICO; max 2 MiB). Returns the updated profile.","operationId":"replace_company_logo_slot_v1_company_profile_logos__slot___mode__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}},{"name":"mode","in":"path","required":true,"schema":{"type":"string","title":"Mode"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Missing or empty logo body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"413":{"description":"The logo exceeds the maximum size.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"415":{"description":"Unsupported logo media type (raster image required).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"requestBody":{"required":true,"content":{"image/png":{"schema":{"type":"string","format":"binary"}},"image/jpeg":{"schema":{"type":"string","format":"binary"}},"image/gif":{"schema":{"type":"string","format":"binary"}},"image/webp":{"schema":{"type":"string","format":"binary"}},"image/x-icon":{"schema":{"type":"string","format":"binary"}},"image/vnd.microsoft.icon":{"schema":{"type":"string","format":"binary"}}}}},"delete":{"tags":["company-profile"],"summary":"Remove a workspace brand logo slot","description":"Unlink one logo slot and delete its asset when no other slot uses it. Returns the updated profile.","operationId":"remove_company_logo_slot_v1_company_profile_logos__slot___mode__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slot","in":"path","required":true,"schema":{"type":"string","title":"Slot"}},{"name":"mode","in":"path","required":true,"schema":{"type":"string","title":"Mode"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyProfileResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/console-chat/conversations":{"get":{"tags":["console-chat"],"summary":"List console chat conversations","operationId":"list_console_conversations_v1_console_chat_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["console-chat"],"summary":"Create a console chat conversation","operationId":"create_console_conversation_v1_console_chat_conversations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/console-chat/conversations/{conversation_id}":{"get":{"tags":["console-chat"],"summary":"Get a console chat conversation","operationId":"get_console_conversation_v1_console_chat_conversations__conversation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleThreadResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["console-chat"],"summary":"Rename a console chat conversation","operationId":"rename_console_conversation_v1_console_chat_conversations__conversation_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationRenameRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleConversationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["console-chat"],"summary":"Delete a console chat conversation","operationId":"delete_console_conversation_v1_console_chat_conversations__conversation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/console-chat/messages":{"post":{"tags":["console-chat"],"summary":"Start a console chat turn","description":"Start a Patricia run in the authenticated member's private console thread.","operationId":"create_console_message_v1_console_chat_messages_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"title":"Idempotency-Key"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleMessageRequest"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleMessageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Console chat or the task queue is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/console-chat/thread":{"get":{"tags":["console-chat"],"summary":"Get the console chat thread","description":"Get the authenticated member's private console thread and live run progress.","operationId":"get_console_thread_v1_console_chat_thread_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConsoleThreadResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Console chat is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/conversations":{"get":{"tags":["conversations","conversations"],"summary":"Search conversations","description":"List conversations with filtering, sorting, and pagination.","operationId":"list_items_v1_conversations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated conversation list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/conversations/conversation-directory":{"get":{"tags":["conversations"],"summary":"Search the conversation directory","description":"Read-only directory view backed by a SearchQuery (QueryProxy).","operationId":"list_conversation_directory_v1_conversations_conversation_directory_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/queries__conversation_directory__ConversationDirectoryQuery__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/conversations/{conversation_id}/messages":{"get":{"tags":["conversations"],"summary":"Search messages","description":"List messages with filtering, sorting, and pagination. Use 'any' as conversation_id to search across all parents in the tenant.","operationId":"list_messages_v1_conversations__conversation_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","description":"Conversation ID. Use 'any' to search across all parents.","title":"Conversation Id"},"description":"Conversation ID. Use 'any' to search across all parents."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated message list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Message__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/conversations/{conversation_id}/messages/{id}":{"get":{"tags":["conversations"],"summary":"Get message","description":"Retrieve a single message by ID. Use 'any' as conversation_id to skip parent validation.","operationId":"get_message_v1_conversations__conversation_id__messages__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","description":"Conversation ID. Use 'any' to search across all parents.","title":"Conversation Id"},"description":"Conversation ID. Use 'any' to search across all parents."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Message__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/conversations/{conversation_id}/proactive-mode":{"get":{"tags":["conversations"],"summary":"Get whether Patricia replies on her own in this conversation","description":"How freely Patricia replies in one conversation: whether she stays out, answers only when asked, or joins in on her own. Also reports where the setting comes from, so a conversation nobody has configured says it is following the workspace setting (or Patricia's standard one) instead of coming back empty. Read-only.","operationId":"get_conversation_proactive_mode_v1_conversations__conversation_id__proactive_mode_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationProactiveModeResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/conversations/{id}":{"get":{"tags":["conversations","conversations"],"summary":"Get conversation","description":"Retrieve a single conversation by ID.","operationId":"get_item_v1_conversations__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["conversations","conversations"],"summary":"Update conversation","description":"Full update (PUT) of a conversation.","operationId":"update_item_v1_conversations__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__UpdateValidator"}}}},"responses":{"200":{"description":"The updated conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["conversations","conversations"],"summary":"Partial update conversation","description":"Partial update (PATCH) of a conversation.","operationId":"merge_item_v1_conversations__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__MergeValidator"}}}},"responses":{"200":{"description":"The updated conversation.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Conversation__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["conversations","conversations"],"summary":"Delete conversation","description":"Soft-delete a conversation by ID.","operationId":"delete_item_v1_conversations__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs":{"post":{"tags":["cron-jobs"],"summary":"Create cron job","description":"Create a new scheduled job, attributed to the requesting actor.","operationId":"create_cron_job_v1_cron_jobs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobCreateRequest"}}}},"responses":{"201":{"description":"The created cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobCreateResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["cron-jobs","cron-jobs"],"summary":"Search cron jobs","description":"List cron jobs with filtering, sorting, and pagination.","operationId":"list_items_v1_cron_jobs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","description":"When true (default) list only the caller's OWN scheduled jobs. Set false for the team/all view (admins/owners only). That view also includes jobs with no resolved creator.","default":true,"title":"Mine"},"description":"When true (default) list only the caller's OWN scheduled jobs. Set false for the team/all view (admins/owners only). That view also includes jobs with no resolved creator."},{"name":"created_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to one creator actor id (admins/owners only; others are always scoped to self).","title":"Created By"},"description":"Filter to one creator actor id (admins/owners only; others are always scoped to self)."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated cron job list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/deliverable-channels":{"get":{"tags":["cron-jobs"],"summary":"List deliverable channels","description":"List channels available to the scheduled-delivery picker, from the caller's own chat platform when the workspace has installed it, and otherwise from the workspace's first installed platform.","operationId":"list_deliverable_channels_v1_cron_jobs_deliverable_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The caller's best-effort channel choices.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliverableChannelsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/loops":{"get":{"tags":["cron-jobs"],"summary":"List follow-up loops","description":"The follow-ups Patricia is running behind the scheduled tasks you can see: the reason, the checks used, and when each one ends. Creator scoping matches the list route: your own by default, the team view (`mine=false`) for admins. Not paginated.","operationId":"read_cron_job_loops_v1_cron_jobs_loops_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","description":"When true (default) list only the caller's OWN scheduled jobs. Set false for the team/all view (admins/owners only). That view also includes jobs with no resolved creator.","default":true,"title":"Mine"},"description":"When true (default) list only the caller's OWN scheduled jobs. Set false for the team/all view (admins/owners only). That view also includes jobs with no resolved creator."},{"name":"created_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to one creator actor id (admins/owners only; others are always scoped to self).","title":"Created By"},"description":"Filter to one creator actor id (admins/owners only; others are always scoped to self)."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"One row per live or waiting follow-up loop whose task is visible.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobLoopsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/usage":{"get":{"tags":["cron-jobs"],"summary":"List scheduled-task credit usage","description":"Accumulated credits consumed by every run each scheduled task has fired. Creator scoping matches the list route: your own tasks by default, the team view (`mine=false`) for admins. Unlike the list, this is not paginated - it returns one row per visible task.","operationId":"read_cron_job_usage_v1_cron_jobs_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","description":"When true (default) list only the caller's OWN scheduled jobs. Set false for the team/all view (admins/owners only). That view also includes jobs with no resolved creator.","default":true,"title":"Mine"},"description":"When true (default) list only the caller's OWN scheduled jobs. Set false for the team/all view (admins/owners only). That view also includes jobs with no resolved creator."},{"name":"created_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Filter to one creator actor id (admins/owners only; others are always scoped to self).","title":"Created By"},"description":"Filter to one creator actor id (admins/owners only; others are always scoped to self)."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"One row per visible scheduled task, including tasks that never fired (0).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronJobUsageResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/{cron_job_id}/auto-approve/off":{"post":{"tags":["cron-jobs"],"summary":"Turn off a task's auto-approve","description":"Stops a scheduled task from acting without asking. Its creator or a workspace admin may. Nothing turns auto-approve on over the API: the creator does that by pressing a button in chat. The pages saved for the task stay.","operationId":"turn_off_cron_job_auto_approve_v1_cron_jobs__cron_job_id__auto_approve_off_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cron_job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cron Job Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The updated cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/{cron_job_id}/delivery-channel":{"put":{"tags":["cron-jobs"],"summary":"Update cron job delivery channel","description":"Passing null clears the explicit channel marker; a job that had an explicit channel reverts to headless, while a job that never had one keeps its origin delivery.","operationId":"update_cron_job_delivery_channel_v1_cron_jobs__cron_job_id__delivery_channel_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cron_job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cron Job Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DeliveryChannelUpdateRequest"}}}},"responses":{"200":{"description":"The updated cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/{cron_job_id}/instructions":{"put":{"tags":["cron-jobs"],"summary":"Set built-in automation instructions","operationId":"update_cron_job_instructions_v1_cron_jobs__cron_job_id__instructions_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"cron_job_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Cron Job Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AutomationInstructionsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/cron-jobs/{id}":{"get":{"tags":["cron-jobs","cron-jobs"],"summary":"Get cron job","description":"Retrieve a single cron job by ID.","operationId":"get_item_v1_cron_jobs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["cron-jobs","cron-jobs"],"summary":"Update cron job","description":"Full update (PUT) of a cron job.","operationId":"update_item_v1_cron_jobs__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__UpdateValidator"}}}},"responses":{"200":{"description":"The updated cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["cron-jobs","cron-jobs"],"summary":"Partial update cron job","description":"Partial update (PATCH) of a cron job.","operationId":"merge_item_v1_cron_jobs__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__MergeValidator"}}}},"responses":{"200":{"description":"The updated cron job.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["cron-jobs","cron-jobs"],"summary":"Delete cron job","description":"Soft-delete a cron job by ID.","operationId":"delete_item_v1_cron_jobs__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/data-deletion/requests":{"post":{"tags":["data-deletion"],"summary":"Request deletion of a connected account","operationId":"create_data_deletion_request_v1_data_deletion_requests_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataDeletionCreate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataDeletionCreated"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/data-deletion/status/{token}":{"get":{"tags":["data-deletion"],"summary":"Get a data-deletion request status","operationId":"get_data_deletion_status_v1_data_deletion_status__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The request status capability token.","title":"Token"},"description":"The request status capability token."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataDeletionStatus"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/data-privacy":{"get":{"tags":["data-privacy"],"summary":"Get the workspace data & privacy settings","description":"The workspace's data-retention window (90 / 365 days, or unlimited), whether Patricia may learn from the workspace's data to improve, the topics she must never repeat, and the channels kept out of the Slack message cache. Patricia's own conversations remain stored separately. Defaults: 365-day retention, learning on, a recommended forbidden-topic list, and no excluded channels.","operationId":"get_data_privacy_v1_data_privacy_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataPrivacyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["data-privacy"],"summary":"Update the workspace data & privacy settings","description":"Set the data-retention window (90 or 365 days, or 0 for unlimited), whether Patricia may learn from the workspace's data, the topics she must never repeat, and/or the Slack channels kept out of the Slack message cache. Retention drives the deletion sweeps; turning learning off stops Patricia learning from this workspace's activity; each list is replaced whole, so an empty list turns that control off. Excluding a channel prevents caching its posted and fetched messages, bypasses cached history reads, and queues deletion of its cached messages. Patricia's own conversations remain stored separately. Only the fields provided are changed.","operationId":"update_data_privacy_v1_data_privacy_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataPrivacyUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DataPrivacyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/email/unsubscribe/{token}":{"get":{"tags":["email"],"summary":"Unsubscribe Page","description":"The footer link's preference page. Shows unsubscribe or (once opted out) resubscribe, so the\nresubscribe path is reachable by a human instead of being an API-only dead end.","operationId":"unsubscribe_page_v1_email_unsubscribe__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"tags":["email"],"summary":"Unsubscribe","description":"RFC 8058 one-click unsubscribe (also the preference page's form target). Idempotent, empty 200.\n\nAny POST to this URL is an unsubscribe: the mail client's one-click body\n(``List-Unsubscribe=One-Click``) and the page form both land here, and the body is deliberately\nignored: fail toward honoring the opt-out.","operationId":"unsubscribe_v1_email_unsubscribe__token__post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/email/unsubscribe/{token}/resubscribe":{"post":{"tags":["email"],"summary":"Resubscribe","description":"Undo an opt-out from the preference page (never called by mail clients).","operationId":"resubscribe_v1_email_unsubscribe__token__resubscribe_post","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/event-sources":{"get":{"tags":["event-sources"],"summary":"List the workspace's connected event sources","description":"The outside systems this workspace has connected so their events can drive an armed channel action, plus the ones it could connect. Shows whether each one's signing secret is in place and when an event last arrived. Never returns a secret or an endpoint URL.","operationId":"list_event_sources_v1_event_sources_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSourceListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/event-sources/{source}":{"post":{"tags":["event-sources"],"summary":"Connect an event source and mint its endpoint","description":"Creates the workspace's endpoint for one outside system and returns the URL to paste into that system's dashboard. **The URL is returned once and cannot be read again** — only its digest is stored. Re-connecting an already-connected source mints a NEW URL and clears the stored signing secret, which is what makes this the remedy if a URL leaks.","operationId":"connect_event_source_v1_event_sources__source__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSourceCreated"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["event-sources"],"summary":"Disconnect an event source","description":"Turns the endpoint off and forgets its signing secret. Events sent to the old URL are refused from then on. Feeds following this source stay armed but go quiet, so reconnecting resumes them without anybody re-arming a channel.","operationId":"disconnect_event_source_v1_event_sources__source__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSourceView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/event-sources/{source}/signing-secret":{"put":{"tags":["event-sources"],"summary":"Store the event source's signing secret","description":"Saves the signing secret from the outside system's dashboard, encrypted at rest. Until it is set, the endpoint refuses every event: a payload we cannot verify is one we must not act on. The secret is never returned by any endpoint.","operationId":"set_event_source_secret_v1_event_sources__source__signing_secret_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source","in":"path","required":true,"schema":{"type":"string","title":"Source"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSourceSecretUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventSourceView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/events":{"post":{"tags":["events"],"summary":"Ingest a batch of first-party product events","description":"Validate + persist a batch of dashboard events for the authenticated tenant.","operationId":"ingest_v1_events_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestEventsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IngestEventsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/group-suggestions":{"get":{"tags":["group-suggestions","group-suggestions"],"summary":"Search group suggestions","description":"List group suggestions with filtering, sorting, and pagination.","operationId":"list_items_v1_group_suggestions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated group suggestion list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupSuggestion__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/group-suggestions/{id}":{"get":{"tags":["group-suggestions","group-suggestions"],"summary":"Get group suggestion","description":"Retrieve a single group suggestion by ID.","operationId":"get_item_v1_group_suggestions__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested group suggestion.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupSuggestion__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/group-suggestions/{suggestion_id}/accept":{"post":{"tags":["group-suggestions"],"summary":"Accept a group suggestion","description":"Create or link the proposed group and its channels, then mark the suggestion accepted.","operationId":"accept_group_suggestion_v1_group_suggestions__suggestion_id__accept_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Suggestion Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AcceptResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/group-suggestions/{suggestion_id}/dismiss":{"post":{"tags":["group-suggestions"],"summary":"Dismiss a group suggestion","description":"Mark a suggestion dismissed. No workspace state changes.","operationId":"dismiss_group_suggestion_v1_group_suggestions__suggestion_id__dismiss_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"suggestion_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Suggestion Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupSuggestion__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/groups":{"get":{"tags":["groups","groups"],"summary":"Search groups","description":"List groups with filtering, sorting, and pagination.","operationId":"list_items_v1_groups_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated group list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["groups","groups"],"summary":"Create group","description":"Create a new group.","operationId":"create_item_v1_groups_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__CreateValidator"}}}},"responses":{"201":{"description":"The created group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/groups/{group_id}/channels":{"get":{"tags":["groups"],"summary":"List a group's channels","description":"List the channels (conversations) linked to a group.","operationId":"list_group_channels_v1_groups__group_id__channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/models__group__GroupChannel__FullValidator"},"title":"Response List Group Channels V1 Groups  Group Id  Channels Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["groups"],"summary":"Link a channel to a group","description":"Add a channel (conversation) to a group. Idempotent: re-linking returns the existing link.","operationId":"link_group_channel_v1_groups__group_id__channels_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkChannelBody"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__GroupChannel__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/groups/{group_id}/channels/{conversation_id}":{"delete":{"tags":["groups"],"summary":"Unlink a channel from a group","description":"Remove a channel (conversation) from a group.","operationId":"unlink_group_channel_v1_groups__group_id__channels__conversation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"group_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Group Id"}},{"name":"conversation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Conversation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/groups/{id}":{"get":{"tags":["groups","groups"],"summary":"Get group","description":"Retrieve a single group by ID.","operationId":"get_item_v1_groups__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["groups","groups"],"summary":"Update group","description":"Full update (PUT) of a group.","operationId":"update_item_v1_groups__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__UpdateValidator"}}}},"responses":{"200":{"description":"The updated group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["groups","groups"],"summary":"Partial update group","description":"Partial update (PATCH) of a group.","operationId":"merge_item_v1_groups__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__MergeValidator"}}}},"responses":{"200":{"description":"The updated group.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__group__Group__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["groups","groups"],"summary":"Delete group","description":"Soft-delete a group by ID.","operationId":"delete_item_v1_groups__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/health":{"get":{"tags":["health"],"summary":"Health","description":"Lightweight liveness probe: no I/O, always fast.","operationId":"health_v1_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Health V1 Health Get"}}}}}}},"/v1/readiness":{"get":{"tags":["health"],"summary":"Readiness","description":"Readiness probe: the database is the ONLY hard dependency on the web tier.\n\nDELIBERATELY DIVERGES from Runflow: Runflow's readiness returns 503 when Redis\nis ``disabled`` (its workers self-replace when they lose Redis). Patricia's\nRedis is OPTIONAL on the web path (the engine degrades to ``NullCacheService``),\nso a Redis outage must NEVER 503 the web tier. Doing so would restart-loop\nthe API during an ordinary Redis blip even though it can still serve traffic.\n\nRedis and the TaskIQ broker are still reported in ``checks`` for observability, but\nONLY a failing DB ``SELECT 1`` sets the status code to 503. Worker liveness is handled\nseparately by the worker heartbeat (``tasks/broker.py``), not by this endpoint.\n\n``checks.redis.status``:\n\n- ``connected``: the published Redis manager answers a ping.\n- ``degraded``: the published Redis manager does not answer a ping.\n- ``not_connected``: ``API_REDIS_URL`` is set and no Redis manager is published. After a\n  failed boot connect, the API retries in the background and publishes the manager once a\n  ping succeeds, unless its recovery task stopped (``redis_recovery_stopped`` in the API logs).\n- ``disabled``: ``API_REDIS_URL`` is not set and no Redis manager is published.\n\n``checks.broker.status``:\n\n- ``disabled``: no TaskIQ broker is published. With ``API_REDIS_URL`` set, the API starts\n  the broker after it publishes the Redis manager, so this can appear beside a\n  ``connected`` Redis check.\n- ``connected``: a broker is published and the Redis check reads ``connected``.\n- ``degraded``: a broker is published and the Redis check reads any other value.\n\nA published broker takes its status from the Redis check. A Redis-backed broker uses its\nown connection pool, which this probe does not use, so ``connected`` does not prove that\nthe broker can enqueue.\n\n``status`` is ``ok`` when the DB check passes, the Redis check reads ``connected``, and a\nbroker is published. Otherwise it is ``degraded``. Without ``API_REDIS_URL`` the Redis check\nreads ``disabled``, so ``status`` is ``degraded``.\n\nPREVIEW CARVE-OUT: in a preview the DB probe is not run and the endpoint cannot\n503; see :func:`_database_check`. Consumers gating on ``checks.database.status``\nmust accept ``skipped`` alongside ``connected`` (``preview-login.yml`` does).\n\n``checks.model_provider`` is reported for the same reason and goes one step further:\nit moves neither the status code NOR ``status``, because the web tier serves its\nwhole non-agent surface without a model key.\n\nManages its own DB session (not ``Depends(get_db)``) so a DB outage surfaces as\na 503 here instead of the ``get_db`` teardown turning it into a 500. A registered\nmanager alone does not prove the connection is live, so we issue a real query.","operationId":"readiness_v1_readiness_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Readiness V1 Readiness Get"}}}}}}},"/v1/me/identities":{"get":{"tags":["identities"],"summary":"List my linked accounts","description":"Every federated credential the signed-in teammate holds, removed ones included.","operationId":"list_my_identities_v1_me_identities_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedIdentityListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/identities/link-url-independent/microsoft":{"post":{"tags":["identities"],"summary":"Start a company-independent Microsoft account link","description":"Begin a link from a user session without selecting a company.","operationId":"mint_microsoft_workspace_link_url_v1_me_identities_link_url_independent_microsoft_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberLinkUrlResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/identities/link-url-independent/slack":{"post":{"tags":["identities"],"summary":"Start a company-independent Slack account link","description":"Begin a link from a user session without selecting a company.","operationId":"mint_independent_link_url_v1_me_identities_link_url_independent_slack_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberLinkUrlResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/me/identities/microsoft/link-url":{"post":{"tags":["identities"],"summary":"Start linking a Microsoft account","description":"Mint a Microsoft sign-in URL that proves the signed-in teammate's own Entra identity, and set the short-lived browser cookie the callback requires.","operationId":"mint_microsoft_link_url_v1_me_identities_microsoft_link_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberLinkUrlResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/me/identities/slack/link-url":{"post":{"tags":["identities"],"summary":"Start linking a Slack account","description":"Mint a Slack sign-in URL that proves the signed-in teammate's own Slack identity, and set the short-lived browser cookie the callback requires.","operationId":"mint_slack_link_url_v1_me_identities_slack_link_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberLinkUrlResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/me/identities/{identity_id}":{"delete":{"tags":["identities"],"summary":"Unlink one of my accounts","description":"Remove one of the signed-in teammate's federated credentials. Writes Patricia rows only and calls no provider endpoint, so it works even when the provider account is gone.","operationId":"revoke_my_identity_v1_me_identities__identity_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"identity_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Identity Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/instruction-skill-priority/tenant":{"get":{"tags":["instruction-skill-priority"],"summary":"Get the workspace instruction-skill spend-order preference","description":"Read whether this workspace has restored team-first spend order for the shared instruction-skill prompt budget (admin). A workspace that has configured nothing reads back the platform default, personal-first.","operationId":"get_instruction_skill_priority_v1_instruction_skill_priority_tenant_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstructionSkillPriorityResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["instruction-skill-priority"],"summary":"Set the workspace instruction-skill spend-order preference","description":"Set whether team instruction skills get first claim on the shared instruction-skill prompt budget for this workspace, instead of the platform default of personal skills first. Admin only. Does not change which team skills are eligible to spend the budget at all — the relevance gate still narrows that pool the same way regardless of this preference.","operationId":"set_instruction_skill_priority_v1_instruction_skill_priority_tenant_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstructionSkillPriorityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstructionSkillPriorityResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integration-accounts":{"get":{"tags":["integration-accounts","integration-accounts"],"summary":"Search integration accounts","description":"List integration accounts with filtering, sorting, and pagination.","operationId":"list_items_v1_integration_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated integration account list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__integration__IntegrationAccount__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integration-accounts/{id}":{"get":{"tags":["integration-accounts","integration-accounts"],"summary":"Get integration account","description":"Retrieve a single integration account by ID.","operationId":"get_item_v1_integration_accounts__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested integration account.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__integration__IntegrationAccount__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/tool-overrides":{"get":{"tags":["integrations"],"summary":"List the actions set to run without asking","description":"Every per-tool consent this member holds, with the connection it belongs to, its computed state and when it last waived a call. Consents on Patricia's own tools have no connection. Rendered from the stored consents rather than from the live tool list, so a consent whose action the provider stopped publishing is still here to revoke. ``actor_id`` reads another member's list and is admin-only; it never permits minting or revoking for them.","operationId":"list_tool_overrides_v1_actor_preferences_tool_overrides_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideInventoryResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/actor-preferences/tool-overrides/{override_id}":{"delete":{"tags":["integrations"],"summary":"Make one of your Always allow settings ask again","description":"Remove the calling member's own consent of any kind, a consent on one of Patricia's own tools included, by the id the inventory lists. It names no connection. A consent on one of Patricia's own tools is removed with the rest of its action group. Idempotent and self-scoped exactly like the connection route: another member's id behaves like an id that does not exist.","operationId":"revoke_own_tool_override_v1_actor_preferences_tool_overrides__override_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"override_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Override Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts":{"get":{"tags":["integrations"],"summary":"List connected accounts","description":"The tenant's connected accounts with status, sharing scope, and connector. Filter by scope.","operationId":"list_connected_accounts_v1_integrations_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"scope","in":"query","required":false,"schema":{"type":"string","pattern":"^(all|team|mine)$","default":"all","title":"Scope"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}":{"delete":{"tags":["integrations"],"summary":"Disconnect a connected account","description":"Soft-deletes the account and disables its tools, then best-effort revokes it at the provider. The response reports what the PROVIDER did (``upstream``/``upstream_confirmed``): the local disconnect always succeeds, so only ``upstream_confirmed`` may be shown as access removed. Requires either account-delete authority (owner/admin, which may disconnect ANY account) or the connect authority a member holds, which disconnects only a PERSONAL account they own. A Patricia-managed account is a 400. A foreign/unknown account, and any account the caller cannot see, both 404, so the route is never an existence oracle for another member's private connection; an account the caller CAN see but may not disconnect is a 403. An account that is visible AND the caller's own is also a 404 whenever its status is not ACTIVE (for example after a token failure parked it at `error`): there is no live access left to revoke, and reconnecting is the only route back to a disconnectable state. So a 404 here does not always mean the account is absent or foreign.","operationId":"disconnect_account_v1_integrations_accounts__account_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisconnectAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/google-ads/customer":{"patch":{"tags":["integrations"],"summary":"Pick which Google Ads customer Patricia uses","description":"Pins a Google Ads connection to one discovered advertising customer. The route refuses an unknown customer and a manager account. Tenant- and owner-scoped: a foreign, unknown, non-Google-Ads, or not-visible account id returns 404.","operationId":"select_google_ads_customer_v1_integrations_accounts__account_id__google_ads_customer_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsCustomerBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsCustomersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/google-ads/customers":{"get":{"tags":["integrations"],"summary":"List a Google Ads connection's customers","description":"Every customer the Google Ads connection discovered at connect time, which of them Patricia may report on, and the pinned customer. The route reads stored discovery and does not call Google Ads. Tenant- and owner-scoped: a foreign, unknown, non-Google-Ads, or not-visible account id returns 404.","operationId":"list_google_ads_customers_v1_integrations_accounts__account_id__google_ads_customers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsCustomersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/google-ads/enabled-customers":{"patch":{"tags":["integrations"],"summary":"Choose which Google Ads customers Patricia may use","description":"Sets the whole enabled set for a Google Ads connection. Every customer the connection can report on is switched on at connect, so this is how a person switches one off: one grant can reach many clients at once, and taking a former client out of range should not mean disconnecting the integration. A customer this connection never discovered, and a manager account, are refused rather than stored. An empty set is refused too, because a connection that reaches nothing answers nothing. Tenant- and owner-scoped: a foreign, unknown, non-Google-Ads, or not-visible account id returns 404.","operationId":"set_google_ads_enabled_customers_v1_integrations_accounts__account_id__google_ads_enabled_customers_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsEnabledCustomersBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GoogleAdsCustomersResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/label":{"patch":{"tags":["integrations"],"summary":"Set or clear a connected account's nickname","description":"Sets a human nickname on a connected account (e.g. 'Stripe US') so a tenant can tell multiple accounts of the same app apart; the agent uses it to route to the right one. Send an empty/null label to clear it. Tenant-scoped: a foreign/unknown account id 404s.","operationId":"set_account_label_v1_integrations_accounts__account_id__label_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LabelBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/linkedin/ad-account":{"patch":{"tags":["integrations"],"summary":"Pick the LinkedIn ad account Patricia uses by default","description":"Makes one discovered, active, switched-on ad account the default. Anything else is refused. Reads the connection's stored discovery rather than calling LinkedIn, so opening the picker costs nothing against LinkedIn's daily limits. Tenant- AND owner-scoped: a foreign, unknown, non-LinkedIn or not-visible account id 404s.","operationId":"select_linkedin_ad_account_v1_integrations_accounts__account_id__linkedin_ad_account_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAdAccountBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAdAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/linkedin/ad-accounts":{"get":{"tags":["integrations"],"summary":"List a LinkedIn connection's ad accounts","description":"Every ad account the LinkedIn connection discovered, which are switched on, and the default. Reads the connection's stored discovery rather than calling LinkedIn, so opening the picker costs nothing against LinkedIn's daily limits. Tenant- AND owner-scoped: a foreign, unknown, non-LinkedIn or not-visible account id 404s.","operationId":"list_linkedin_ad_accounts_v1_integrations_accounts__account_id__linkedin_ad_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAdAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/linkedin/enabled-ad-accounts":{"patch":{"tags":["integrations"],"summary":"Choose which LinkedIn ad accounts Patricia may use","description":"Sets the whole enabled set. An id this connection never discovered, or one LinkedIn reports as not active, is refused. An empty list is refused. Reads the connection's stored discovery rather than calling LinkedIn, so opening the picker costs nothing against LinkedIn's daily limits. Tenant- AND owner-scoped: a foreign, unknown, non-LinkedIn or not-visible account id 404s.","operationId":"set_linkedin_enabled_ad_accounts_v1_integrations_accounts__account_id__linkedin_enabled_ad_accounts_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInEnabledAdAccountsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInAdAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/linkedin/enabled-pages":{"patch":{"tags":["integrations"],"summary":"Choose which LinkedIn pages Patricia may use","description":"Sets the whole enabled set. An id this connection never discovered is refused. An empty list parks the pages. Reads the connection's stored discovery rather than calling LinkedIn, so opening the picker costs nothing against LinkedIn's daily limits. Tenant- AND owner-scoped: a foreign, unknown, non-LinkedIn or not-visible account id 404s.","operationId":"set_linkedin_enabled_pages_v1_integrations_accounts__account_id__linkedin_enabled_pages_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInEnabledPagesBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInPagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/linkedin/page":{"patch":{"tags":["integrations"],"summary":"Pick the LinkedIn page Patricia uses by default","description":"Makes one discovered, switched-on page the default. Anything else is refused. Reads the connection's stored discovery rather than calling LinkedIn, so opening the picker costs nothing against LinkedIn's daily limits. Tenant- AND owner-scoped: a foreign, unknown, non-LinkedIn or not-visible account id 404s.","operationId":"select_linkedin_page_v1_integrations_accounts__account_id__linkedin_page_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInPageBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInPagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/linkedin/pages":{"get":{"tags":["integrations"],"summary":"List a LinkedIn connection's company pages","description":"Every company page the LinkedIn connection discovered, which are switched on, the default, and the connecting member. Reads the connection's stored discovery rather than calling LinkedIn, so opening the picker costs nothing against LinkedIn's daily limits. Tenant- AND owner-scoped: a foreign, unknown, non-LinkedIn or not-visible account id 404s.","operationId":"list_linkedin_pages_v1_integrations_accounts__account_id__linkedin_pages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LinkedInPagesResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/meta-ads/ad-account":{"patch":{"tags":["integrations"],"summary":"Pick the Meta ad account Patricia uses by default","description":"Makes one of a Meta Ads connection's discovered ad accounts its default, which is what an unqualified question resolves to when several are switched on. Naming an ad account this connection never discovered, one Meta reports as closed, or one that is switched off, is refused rather than stored. Tenant- AND owner-scoped: a foreign, unknown, non-Meta or not-visible account id 404s.","operationId":"select_meta_ad_account_v1_integrations_accounts__account_id__meta_ads_ad_account_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdAccountBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/meta-ads/ad-accounts":{"get":{"tags":["integrations"],"summary":"List a Meta Ads connection's ad accounts","description":"Every ad account the Meta connection discovered at connect time, plus the one it is pinned to. Reads the connection's stored discovery rather than calling Meta, so opening the picker costs nothing against the shared rate-limit budget. Tenant- AND owner-scoped, like the account-tools read: a foreign, unknown, non-Meta or not-visible account id 404s, so another member's PERSONAL connection never discloses the ad accounts it can reach.","operationId":"list_meta_ad_accounts_v1_integrations_accounts__account_id__meta_ads_ad_accounts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/meta-ads/enabled-ad-accounts":{"patch":{"tags":["integrations"],"summary":"Choose which Meta ad accounts Patricia may use","description":"Sets the whole enabled set for a Meta Ads connection. Every discovered active ad account is switched on at connect, so this is how a person switches one off: an agency connection can reach a former client's account, and taking it out of range should not mean disconnecting the integration. An id this connection never discovered, or one Meta reports as anything but active, is refused rather than stored. An empty list is refused. Tenant- AND owner-scoped: a foreign, unknown, non-Meta or not-visible account id 404s.","operationId":"set_meta_enabled_ad_accounts_v1_integrations_accounts__account_id__meta_ads_enabled_ad_accounts_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaEnabledAdAccountsBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MetaAdAccountsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/personal-tool-choices":{"post":{"tags":["integrations"],"summary":"Set your personal choice for a tool","description":"Set the calling member's own ``Always ask`` or ``Never allow`` choice for one tool on a visible connection. This restriction needs no Always-Allow floor check or consent token. Setting it removes the caller's conflicting Always-Allow row.","operationId":"set_personal_tool_choice_v1_integrations_accounts__account_id__personal_tool_choices_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalToolChoiceRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalToolChoiceResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/personal-tool-choices:batch-set":{"post":{"tags":["integrations"],"summary":"Set your personal choice for several tools","description":"Set the calling member's own choice for several tools on one visible connection. The caller and account are admitted once, and every item applies the same mutual exclusion as the single choice route.","operationId":"set_personal_tool_choices_batch_v1_integrations_accounts__account_id__personal_tool_choices_batch_set_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalToolChoiceBatchRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalToolChoiceBatchResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/personal-tool-choices:clear":{"post":{"tags":["integrations"],"summary":"Clear your personal choice for a tool","description":"Delete the calling member's own Ask/Never-Allow choice for one tool, returning it to \"following your default\". A personal Always-Allow choice is separate from a per-tool integration consent. General policy still cannot clear a CRITICAL tier, a mandatory call, a managed account, or the workspace master switch. Idempotent: clearing an already-clear choice is a no-op, never an error.","operationId":"clear_personal_tool_choice_v1_integrations_accounts__account_id__personal_tool_choices_clear_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonalToolChoiceClearRequest"}}}},"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/scope":{"get":{"tags":["integrations"],"summary":"Read a SharePoint connection's site policy","description":"Which SharePoint sites Patricia may address through this connection. Gated by the same rule as the write: a PERSONAL connection answers to the person who connected it and to nobody else, with no admin bypass; a TEAM connection answers to account-edit authority. Anything this caller may not be told about answers 404 rather than 403 — an unknown id, a connection that carries no policy, and another member's personal connection are deliberately indistinguishable.\n\n**Read the TEAM half as an editing gate, not as confidentiality.** The selected site ids of a team connection already reach every member who can see that connection, through the agent's own connection listing, which names them so the model does not have to discover the boundary one refusal at a time. Aligning the two is an open decision, recorded in the PR that added this endpoint; what is NOT true today is that this gate keeps a member from learning which sites a team connection reaches.","operationId":"read_sharepoint_scope_v1_integrations_accounts__account_id__scope_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharePointScopeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"put":{"tags":["integrations"],"summary":"Replace a SharePoint connection's site policy","description":"Replaces the WHOLE policy — the complete set of sites this connection may reach, never a delta. ``expected_policy_version`` is a compare-and-set guard: send the version the read returned, or omit it to assert there was no policy at all. Either expectation failing is a 409, and the way forward is to re-read and decide against what the policy now says rather than to resend this one. A selection that cannot become a policy is a 422 naming the entry that refused. Authority is the same rule as the read.\n\n**Send sites only.** The document libraries under them are enumerated here, from the selection, because a ``drive -> site`` pair is what admits a call rooted at a drive and a client that could state one would be granting itself reach. That enumeration is live: if it cannot be finished the previous policy is left exactly as it was and the answer is a 503, because a policy naming a site with none of its libraries admits the site and refuses every document in it.","operationId":"replace_sharepoint_scope_v1_integrations_accounts__account_id__scope_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharePointScopeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharePointScopeResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/scope/site-options":{"get":{"tags":["integrations"],"summary":"List the SharePoint sites this connection can reach","description":"Suggestions for the site picker. Walks the connection's own site collections — keyword search, followed sites, and subsites recursively — and returns them deduplicated. Gated by the same rule as reading and replacing the policy, because the list names sites and so describes part of the estate. **This is never the whole estate**: the sources are followed sites and keyword matches, and a connection can reach a site that is neither, so offer a way to enter one that is not listed. ``sources_exhausted`` says only whether every request finished; false means even these sources were not fully read. ``search`` seeds the site-search source, which the provider requires a term for; followed sites and subsites are read without one.","operationId":"list_sharepoint_site_options_v1_integrations_accounts__account_id__scope_site_options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Search"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteOptionsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/syncs":{"post":{"tags":["integrations"],"summary":"Start a tool-catalog sync for a connected account","description":"Creates a background sync of the account's provider actions into the tenant tool catalog. Answers 503 when the queue broker will not take the work, so a stale catalog is never answered with a 202 the caller would wait on forever.","operationId":"integration_account_sync_v1_integrations_accounts__account_id__syncs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResponse"}}}},"503":{"description":"Service unavailable: the task queue could not accept the sync.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/tool-overrides":{"post":{"tags":["integrations"],"summary":"Let one action on this connection run without asking","description":"Record the CALLING member's consent to run one named provider action through this connection without an approval card. Strictly self-serve: it always applies to the caller, never to another member. A readable Critical action on this connection can be allowed here. The properties a member cannot change still refuse it: an audience-reaching action, a mandatory call, a connection Patricia owns, a tool row with no stable ref, and a live tier this process cannot rank. It only ever applies to a run a human asked for and is watching. A foreign/unknown or not-visible account id 404s, so it is never an existence oracle for another member's private connection.","operationId":"create_tool_override_v1_integrations_accounts__account_id__tool_overrides_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideCreateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Refused for a state the member can change. ``code`` is one of ``stale_tool_state``, ``tenant_master_disabled``, ``tool_disabled``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Refused for a property of the tool or the connection the member cannot change. ``code`` is one of ``audience_reaching``, ``managed_account``, ``mandatory_call``, ``no_tool_ref``, ``unreadable_live_tier``. ``VALIDATION_ERROR`` is the ordinary boundary refusal for a malformed body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/tool-overrides/{override_id}":{"delete":{"tags":["integrations"],"summary":"Make one action ask again","description":"Remove the calling member's consent for one action. Idempotent: revoking a consent that is already gone returns 204, so a double-click never surfaces an error. Only the member's own consent can be revoked here — another member's id behaves exactly like an id that does not exist, so this is never an existence oracle for other people's settings.","operationId":"revoke_tool_override_v1_integrations_accounts__account_id__tool_overrides__override_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"override_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Override Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/tool-overrides:batch-grant":{"post":{"tags":["integrations"],"summary":"Let several actions on this connection run without asking, in one request","description":"The batch primitive behind a group control: mints the CALLING member's consent for every item in ``items`` against ONE shared admission, answering PER ITEM for anything about one action. Every item carries its OWN ``consent_token`` — no shared token could bind two different actions' confirmations. Two conditions are about the REQUEST and refuse all of it before any grant is stored: naming more than one distinct Critical action, and naming an action whose live tier this process cannot rank. Same self-serve rule and ``preferences:edit`` scope as the single-action route above; a foreign/unknown or not-visible account 404s the whole call, exactly as it does there.","operationId":"create_tool_overrides_batch_v1_integrations_accounts__account_id__tool_overrides_batch_grant_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideBatchGrantRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideBatchGrantResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Refused for a state the member can change. ``code`` is one of ``stale_tool_state``, ``tenant_master_disabled``, ``tool_disabled``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Refused for a property of the tool or the connection the member cannot change. ``code`` is one of ``audience_reaching``, ``managed_account``, ``mandatory_call``, ``no_tool_ref``, ``tool_override_batch_critical_limit``, ``unreadable_live_tier``. ``VALIDATION_ERROR`` is the ordinary boundary refusal for a malformed body.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/tool-overrides:batch-revoke":{"post":{"tags":["integrations"],"summary":"Make several actions ask again, in one request","description":"The batch primitive behind a group control: removes the CALLING member's consent for every id in ``override_ids``, resolving the caller's own actor ONCE. Idempotent per item exactly like the single-action route above — an id belonging to nobody or to another member reports ``revoked: false`` rather than an error, so this is never an existence oracle for other people's settings. Same ``preferences:read`` scope as the single-action route, for the same reason: revoking only ever takes authority away.","operationId":"revoke_tool_overrides_batch_v1_integrations_accounts__account_id__tool_overrides_batch_revoke_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideBatchRevokeRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolOverrideBatchRevokeResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Refused because the caller has no personal settings to change. ``code`` is one of ``no_caller_actor``.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/accounts/{account_id}/tools":{"get":{"tags":["integrations"],"summary":"List a connected account's tools and their approval behavior","description":"The read-only list of provider actions Patricia can take through one connected account, each with its risk tier and what a new directed call would do FOR THE CALLING MEMBER (``auto`` runs without asking, ``ask`` asks first). ``gate`` is per-viewer — it reflects that member's own approval policy and per-tool overrides, so two members can see different values on the same row of a shared connection — while ``locked`` stays account-level and marks a mandatory call, or a live tier this build cannot parse, which nothing on this tab can relax. A readable CRITICAL action is NOT locked: it asks by default, and one such action on one connection can carry a member's own always-allow consent. It is the STANDING behavior, before any per-run or per-argument downgrade: a static read has no run, conversation or arguments. Only enabled tools are listed. Tenant- and owner-scoped: a foreign/unknown or not-visible account id 404s, so it is never an existence oracle for another member's private account.","operationId":"list_account_tools_v1_integrations_accounts__account_id__tools_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AccountToolsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/accounts/{account_id}/visibility":{"patch":{"tags":["integrations"],"summary":"Change a connected account's sharing scope","description":"Switches a connected account between PERSONAL (private to the person who connected it) and TEAM (usable by the whole company). Requires account-edit authority; the service enforces the per-account fence (only the owner can share their own account; a team account can only be made private when it has a single coherent owner) and never discloses another member's private account (a foreign/unknown id 404s). ``expected_current`` is a compare-and-set guard: a concurrent flip 409s.","operationId":"change_account_visibility_v1_integrations_accounts__account_id__visibility_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VisibilityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/billit/oauth/callback":{"get":{"tags":["integrations"],"summary":"Billit Oauth Callback","description":"Bind one Billit callback to the browser that started it, then settle its single company.","operationId":"billit_oauth_callback_v1_integrations_billit_oauth_callback_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}},{"name":"patricia_billit_bind","in":"cookie","required":false,"schema":{"type":"string","default":"","title":"Patricia Billit Bind"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/callback/{provider}":{"post":{"tags":["integrations"],"summary":"Complete a connect flow","description":"Records the connected account (bound to the verified tenant) and enqueues a tool sync.","operationId":"integration_callback_v1_integrations_callback__provider__post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"provider","in":"path","required":true,"schema":{"type":"string","title":"Provider"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompleteConnectBody"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/canva/oauth/callback":{"get":{"tags":["integrations"],"summary":"Canva Oauth Callback","description":"Exchange Canva's authorization code and bind it through the matching pending intent.","operationId":"canva_oauth_callback_v1_integrations_canva_oauth_callback_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/canva/return":{"post":{"tags":["integrations"],"summary":"Resolve Canva Return","description":"Resolve Canva's signed correlation state under the authenticated caller's tenant.","operationId":"resolve_canva_return_v1_integrations_canva_return_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CanvaReturnRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CanvaReturnResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/catalog":{"get":{"tags":["integrations"],"summary":"Browse / search connectable apps","description":"A page of the FULL provider catalog (thousands of apps), served from an in-process cache so search stays fast. Browses everything by default; ``q`` searches name/category/description and ``category`` narrows to one category across the whole catalog. Paginate with ``cursor``. ``featured``, ``managed``, and ``categories`` accompany the first page only. Each app includes its routing provider, pricing hint, and caller-visible connection count.","operationId":"integration_catalog_v1_integrations_catalog_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search over name / category / description (whole catalog).","title":"Q"},"description":"Search over name / category / description (whole catalog)."},{"name":"category","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Narrow to one category (whole catalog).","title":"Category"},"description":"Narrow to one category (whole catalog)."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Opaque page cursor from a prior response's next_cursor.","title":"Cursor"},"description":"Opaque page cursor from a prior response's next_cursor."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/catalog/{app_slug}/details":{"get":{"tags":["integrations"],"summary":"Connect-sheet content for one app","description":"The staff-authored detail-sheet content (what Patricia can do, data it can access, what you need to connect) for one app. Returns ``has_content=false`` with empty sections when no content has been authored yet, and the sheet then stands on what the catalog knows about the app.","operationId":"integration_app_details_v1_integrations_catalog__app_slug__details_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_slug","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","description":"The catalog app slug to describe.","title":"App Slug"},"description":"The catalog app slug to describe."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationAppDetailsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connect-attempts/{attempt_id}":{"get":{"tags":["integrations"],"summary":"Resolve a connect attempt to the account it produced","description":"Poll one connect attempt started by the calling member. A ``redirect`` provider records the account server-side and hands the browser no local identifier, so this is what lets the dashboard open the account its own attempt created — and say whether that account still needs its owner to choose SharePoint sites before it can do anything. Scoped to whoever started the attempt: anyone else, and any id that does not exist, gets a 404.","operationId":"connect_attempt_status_v1_integrations_connect_attempts__attempt_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectAttemptStatusResponse"}}}},"404":{"description":"No such attempt for this caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connect-attempts/{attempt_id}/key-form":{"get":{"tags":["integrations"],"summary":"Resolve a requester-bound key form","description":"Returns the app, fixed sharing scope, deadline and reconnect target of a key form that chat started. Only the signed-in person who owns the chat identity the attempt records can read it. Anyone else, and any expired, finished or unknown id, gets the same 404.","operationId":"key_form_context_v1_integrations_connect_attempts__attempt_id__key_form_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"attempt_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Attempt Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/KeyFormContextResponse"}}}},"404":{"description":"No such key form for this caller.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connect-fields":{"get":{"tags":["integrations"],"summary":"Describe how an app connects (OAuth vs. key-entry form)","description":"Returns whether an app uses the OAuth redirect flow or a credential form. For a non-OAuth app (API key / bearer / basic) it returns the fields the dashboard must collect, so the connect form renders dynamically for whatever the toolkit requires (e.g. an API key + region).","operationId":"integration_connect_fields_v1_integrations_connect_fields_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"app_slug","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":64,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","description":"The catalog app slug to describe the connect flow for.","title":"App Slug"},"description":"The catalog app slug to describe the connect flow for."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectFieldsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connect-key":{"post":{"tags":["integrations"],"summary":"Connect a non-OAuth app with user-supplied credentials","description":"Connects a non-OAuth app with user-supplied credentials. Brokered providers receive their credentials in a provider vault; Patricia seals validated native credential bundles with its account. The account is recorded with its sharing scope and its tools sync after the database commit. Returns the recorded account.","operationId":"integration_connect_key_v1_integrations_connect_key_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectKeyBody"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectedAccountResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connect-session":{"post":{"tags":["integrations"],"summary":"Start an OAuth connect flow","description":"Returns a provider connect URL/token the dashboard opens to authorize an app.","operationId":"integration_connect_session_v1_integrations_connect_session_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectSessionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectSessionResponse"}}}},"409":{"description":"Conflict: a connect for this app is already in flight and cannot be reused yet, so this ask is refused rather than served. Always TEMPORARY — the in-flight request finishes or ages out and the next ask succeeds, which is why the client should say \"wait a moment\" and never \"refresh and retry\". Inspect ``errors[0].type`` for the case: ``connect_route_changed`` (the app now routes to a different provider than the live request was minted against), ``connect_completing`` (a completion is vaulting a credential), ``connect_compensating`` (a failed attempt is being cleaned up), ``connect_environment_mismatch`` (the live request was minted for a different vendor environment than this one asks for), or ``connect_not_reusable`` (any other non-reusable live state)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/connect/personal/redeem":{"post":{"tags":["integrations"],"summary":"Redeem a chat connect link with a dashboard session","description":"Spends the single-use connect token when the signed-in user owns the live chat identity of the person the link was made for. Every refusal is the same 404, and the dashboard then falls back to the chat sign-in.","operationId":"redeem_personal_connect_v1_integrations_connect_personal_redeem_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedInRedeemBody"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SignedInRedeemResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}},"security":[{"HTTPBearer":[]}]}},"/v1/integrations/connect/personal/start":{"post":{"tags":["integrations"],"summary":"Start Personal Connect","description":"Resolve the token and send the browser to Slack to prove who is holding it.\n\nNothing is consumed. A successful answer is only a redirect to Slack; the token is burned in the\ncallback, after Slack has said who the browser belongs to.","operationId":"start_personal_connect_v1_integrations_connect_personal_start_post","requestBody":{"content":{"application/x-www-form-urlencoded":{"schema":{"properties":{"token":{"type":"string","description":"The single-use connect token, read from the link's URL fragment. The whole body is capped at 4096 bytes; this is not a limit on the token itself."}},"type":"object","required":["token"]}}},"required":true},"responses":{"303":{"description":"Successful Response"},"404":{"description":"The link cannot be used. One generic answer for every reason."}}}},"/v1/integrations/connections/{connected_account_id}":{"get":{"tags":["integrations"],"summary":"Poll a pending connection's status","description":"The connect-flow poller waits for `active` (OAuth completed) before recording the account.","operationId":"connection_status_v1_integrations_connections__connected_account_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"connected_account_id","in":"path","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","title":"Connected Account Id"}},{"name":"provider","in":"query","required":false,"schema":{"type":"string","default":"composio","title":"Provider"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConnectionStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/googleads/oauth/callback":{"get":{"tags":["integrations"],"summary":"Google Ads Oauth Callback","description":"Exchange Google's authorization code and bind it through the matching pending intent.","operationId":"google_ads_oauth_callback_v1_integrations_googleads_oauth_callback_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/oauth/linkedin/callback":{"get":{"tags":["integrations"],"summary":"Complete a LinkedIn connection","description":"Exchange LinkedIn's authorization code and bind it through the matching pending intent.","operationId":"linkedin_oauth_callback_v1_integrations_oauth_linkedin_callback_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/oauth/meta/callback":{"get":{"tags":["integrations"],"summary":"Complete a Meta Ads connection","description":"Exchange Meta's authorization code and bind it through the matching pending intent.","operationId":"meta_ads_oauth_callback_v1_integrations_oauth_meta_callback_get","parameters":[{"name":"state","in":"query","required":false,"schema":{"type":"string","default":"","title":"State"}},{"name":"code","in":"query","required":false,"schema":{"type":"string","default":"","title":"Code"}},{"name":"error","in":"query","required":false,"schema":{"type":"string","default":"","title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/pending/{pending_id}":{"delete":{"tags":["integrations"],"summary":"Dismiss a failed connect chip","description":"Removes one of the requester's own failed/expired connect intents from the Connected tab. Only a non-live intent can be dismissed (a connect still in flight is never removed); tenant- and owner-scoped, so a foreign/unknown id or another member's chip 404s.","operationId":"dismiss_pending_connection_v1_integrations_pending__pending_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pending_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Pending Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/slack/channel-joins":{"post":{"tags":["integrations"],"summary":"Join Patricia to public Slack channels","operationId":"slack_channel_joins_v1_integrations_slack_channel_joins_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackChannelJoinRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackChannelJoinResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/slack/install-url":{"post":{"tags":["integrations"],"summary":"Slack Install Url","description":"Return a Slack authorize URL with an HMAC-signed, short-TTL state.\n\nThe signed state carries the authenticated principal's ``tenant_id`` so\nthe OAuth callback can attach the Slack workspace to the correct tenant.\nCallers cannot influence which tenant the state targets: only members\nholding ``integrations:edit`` on a tenant can initiate the install for\nthat tenant, and the tenant identity comes exclusively from the bearer token.\n\n``return_path`` is the dashboard page the user clicked Connect from; the callback\nsends the browser back there with the outcome flag. The body is optional so a\nbodyless POST still mints a URL.\n\nTwo different limits apply, deliberately. The schema's 2048 ``max_length`` is a\npayload guard only: it 422s a body no real dashboard route could produce. The limit\nthat decides where the user lands is the much shorter\n``core.redirects.MAX_RETURN_PATH_LENGTH``, applied during sanitization. A path that\nis off-origin or longer than that is silently dropped and the callback falls back to\nits default landing page, never a 422, because a bad return page must not be the\nthing that blocks someone from connecting Slack.","operationId":"slack_install_url_v1_integrations_slack_install_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/SlackInstallUrlRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackInstallUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/slack/joinable-channels":{"get":{"tags":["integrations"],"summary":"Public Slack channels Patricia can still join","description":"The public channels Patricia has not joined yet, with member counts and the workspace name.\n\nA tenant with no active Slack install answers ``connected: false`` with empty, zeroed fields\nrather than an error. A Slack read that fails raises 503, never an empty channel list: that\nwould tell a user their workspace has none when it is really that Slack could not be read.","operationId":"slack_joinable_channels_v1_integrations_slack_joinable_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackJoinableChannelsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Slack could not be read.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/integrations/slack/status":{"get":{"tags":["integrations"],"summary":"Slack Status","description":"Whether this tenant has a Slack installation. Drives the connected/disconnected UI.\n\nReads the chat-platform install (the Slack bot / PlatformInstallation), NOT a Slack\n*tool* integration account: those are different things, and the Channels card means\nthe former.\n\nThe response carries the workspace (team) id and Patricia's own bot user id, the pair a\nclient needs to deep-link into the direct message with her. The bot user id is null on an\ninstall recorded before it was stored, so a client must have a workspace-level fallback.","operationId":"slack_status_v1_integrations_slack_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SlackStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/teams/app-package":{"get":{"tags":["integrations"],"summary":"Teams App Package","description":"Download the Teams app package configured for this deployment.","operationId":"teams_app_package_v1_integrations_teams_app_package_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The deployment-specific Teams app package.","content":{"application/zip":{"schema":{"type":"string","format":"binary"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/teams/connection":{"delete":{"tags":["integrations"],"summary":"Teams Disconnect","description":"Disconnect this tenant's Teams workspace and free the Teams slot for a different one.\n\nScoped to the bearer principal's tenant, so a caller can only ever disconnect their own\nworkspace. Idempotent: a tenant with no Teams rows gets ``{\"disconnected\": false}`` and a 200,\nbecause \"there is nothing to disconnect\" is the outcome the caller asked for, not an error.\n\nWhat this removes is Patricia's side of the connection: the workspace identity and the\ninstallation, including the encrypted bot credentials. It does NOT uninstall the Patricia app\nfrom Microsoft Teams and it cannot — that is an action inside the customer's Microsoft 365\ntenant. The dashboard copy says so, because an admin who expects the app to vanish from Teams\nand finds it still there will assume the disconnect failed.\n\nReturns 409 when an armed autonomous grant still references the installation\n(``WorkspaceSlotReleaseBlocked``); nothing is removed in that case.","operationId":"teams_disconnect_v1_integrations_teams_connection_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Teams Disconnect V1 Integrations Teams Connection Delete"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/teams/install-url":{"post":{"tags":["integrations"],"summary":"Teams Install Url","description":"Return an Azure AD admin-consent URL with an HMAC-signed, short-TTL state.\n\nThe tenant identity comes exclusively from the bearer token. Only a caller\nwith account-edit authority can attach the whole Teams workspace. Fails closed\n(400) when Teams is not configured.\n\nAn optional ``return_path`` is narrowed to an exact destination allowlist during minting and\nnever 422s, so an unrecognised one cannot block the connect.","operationId":"teams_install_url_v1_integrations_teams_install_url_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TeamsInstallUrlRequest"},{"type":"null"}],"title":"Body"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsInstallUrlResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/integrations/teams/status":{"get":{"tags":["integrations"],"summary":"Teams Status","description":"Return the tenant's consent, reachability, and slot state.\n\nScoped to the bearer principal's tenant; reads the tenant's own installation (if any).\n\n``teams_configured`` means this deployment has the required Microsoft credentials.\n``consent_granted`` means an ACTIVE installation exists. ``app_reachable`` means that\ninstallation carries an allowed Bot Connector service URL. Teams supplies that URL only with a\nreal inbound activity from the workspace, so it proves the app package is installed and Patricia\nhas been reached there. ``connected`` requires all three conditions because a stored reply\naddress cannot make Patricia usable after those credentials are removed. The other booleans\nreport only their observed state. ``slot_held`` means a new Teams workspace cannot connect. It\nremains true for a CANCELLED installation as well.","operationId":"teams_status_v1_integrations_teams_status_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamsStatusResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/invitations/{token}/accept":{"post":{"tags":["invitations"],"summary":"Accept an invitation","description":"Accept a workspace invitation token and receive a session token pair.\n\nThe raw token from the invitation email is the credential for the ordinary\ncase: an invitee with no existing account accepts anonymously and lands\nlogged in (access + refresh tokens) scoped to the invitation's tenant with\nthe invited role. An ``Authorization`` header is optional, and needed only\nto complete the one case below that a token alone cannot: POST anonymously\nfirst, and send the bearer only if this endpoint asks for it.\n\nErrors:\n- **404**: unknown token.\n- **400**: expired or revoked invitation.\n- **409**: invitation already accepted, the workspace membership could not be\n  linked to the account that accepted it, or the workspace has no active owner and\n  the invitation would bring back its last owner row with a lower role\n  (``errors[0].type`` is ``last_owner``). The second is not retryable by the\n  invitee: the acceptance is rolled back and an admin has to sort the membership\n  out, most often because that person already belongs to this workspace under\n  another address. The third is rolled back too and the invitation stays pending:\n  the workspace needs an owner restored, which Patricia support escalates.\n- **401** ``INVITATION_SIGN_IN_REQUIRED``: the invited address already has an\n  account. Sign in, then POST this endpoint again with the bearer token; the\n  invitation is untouched and still usable.\n- **403** ``INVITATION_WRONG_ACCOUNT``: a bearer was sent, but it is signed in\n  as somebody other than the invited address's owner — most often a forwarded\n  link. Sign in as the invited address and retry. The invitation is untouched,\n  and the message deliberately does not say who it was for.\n- **403** ``FORBIDDEN``: every other refusal on this route — the account needs\n  recovery, the account can no longer be used, the invitation went to a secondary\n  address rather than the account's main one, the two identity planes disagree\n  about who is joining, or the membership did not come out active. The invitation\n  stays pending in all of them. They share the generic code on purpose: the\n  dashboard shows the message, and there is no action the invitee can take that a\n  distinct code would unlock. Deliberately not enumerated in the response\n  description — a count there goes stale the first time one is added.","operationId":"accept_invitation_v1_invitations__token__accept_post","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","description":"The raw invitation token received via email","title":"Token"},"description":"The raw invitation token received via email"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"401":{"description":"`INVITATION_SIGN_IN_REQUIRED` — the invited address already has an account. Sign in and POST this endpoint again with the bearer token; nothing was consumed.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"`INVITATION_WRONG_ACCOUNT` — a bearer was sent, but it belongs to someone other than the invited address's owner. Sign in as the invited address and retry; nothing was consumed. Every OTHER 403 on this route carries the generic `FORBIDDEN` code, is not retryable by the invitee, and needs an admin; the message says which case it is. The invitation stays pending in all of them.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"`CONFLICT` — the invitation was already accepted, the workspace membership could not be linked to the account that accepted it, or the workspace has no active owner and the invitation would bring back its last owner row with a lower role (`errors[0].type` is `last_owner`). The second is not retryable: the acceptance is rolled back and an admin has to sort the membership out, most often because that person already belongs to this workspace under another address. The third is rolled back too and the invitation stays pending: the workspace needs an owner restored, which Patricia support escalates.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-oauth/consent":{"get":{"tags":["mcp-oauth"],"summary":"Read a pending MCP connection request","description":"Read the app, workspace and destination behind a pending MCP connection request.","operationId":"read_consent_v1_mcp_oauth_consent_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"request","in":"query","required":true,"schema":{"type":"string","maxLength":512,"title":"Request"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpConsentRequest"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-oauth/consent/approve":{"post":{"tags":["mcp-oauth"],"summary":"Approve an MCP connection request","description":"Approve a pending MCP connection request and return where to send the browser next.","operationId":"approve_consent_v1_mcp_oauth_consent_approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpConsentDecisionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpConsentDecision"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-oauth/consent/deny":{"post":{"tags":["mcp-oauth"],"summary":"Refuse an MCP connection request","description":"Refuse a pending MCP connection request and return where to send the browser next.","operationId":"deny_consent_v1_mcp_oauth_consent_deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpConsentDecisionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpConsentDecision"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-servers":{"post":{"tags":["mcp-servers"],"summary":"Connect an MCP server","description":"Validates and probes the server, then registers it. The connection is shared with the whole workspace unless the caller asks for a personal one, which only its owner can use.","operationId":"register_mcp_server_v1_mcp_servers_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-servers/auth-discovery":{"post":{"tags":["mcp-servers"],"summary":"Check how an MCP server signs in","description":"Detects how the server at an address signs in, before the caller chooses how to connect. Records nothing and returns only the mode. A check the workspace's allowance refuses, or one that does not finish in time, answers unknown. An address that answers as no tool at all is refused with a sentence instead.","operationId":"discover_mcp_auth_mode_v1_mcp_servers_auth_discovery_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAuthDiscoveryBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpAuthDiscoveryResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-servers/oauth/client-metadata":{"get":{"tags":["mcp-servers"],"summary":"Patricia's OAuth client-id metadata document","description":"The public client-id metadata document authorization servers fetch to learn who Patricia is. Its `client_id` is this URL, which is what makes the identifier verifiable.","operationId":"read_cimd_document_v1_mcp_servers_oauth_client_metadata_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Cimd Document V1 Mcp Servers Oauth Client Metadata Get"}}}}}}},"/v1/mcp-servers/oauth/client-metadata/jwks.json":{"get":{"tags":["mcp-servers"],"summary":"Patricia's OAuth client-assertion public keys","description":"The JWKS the client-metadata document points at. Publishes the public half of every signing key still in rotation, so a server holding either cached copy can verify.","operationId":"read_signing_jwks_v1_mcp_servers_oauth_client_metadata_jwks_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Read Signing Jwks V1 Mcp Servers Oauth Client Metadata Jwks Json Get"}}}}}}},"/v1/mcp-servers/oauth/finalize":{"post":{"tags":["mcp-servers"],"summary":"Finish an OAuth connect (hop 2)","description":"Redeems the one-time capability from the callback, exchanges the authorization code, and installs the server. Requires the same person who started the ceremony.","operationId":"finalize_mcp_oauth_v1_mcp_servers_oauth_finalize_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthFinalizeBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-servers/oauth/start":{"post":{"tags":["mcp-servers"],"summary":"Begin an OAuth connect for an MCP server","description":"Discovers the server's authorization service, registers a client if one is needed, and returns the URL to send the connecting person to. Nothing is connected until the ceremony completes.","operationId":"start_mcp_oauth_v1_mcp_servers_oauth_start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OAuthStartResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-servers/{account_id}":{"get":{"tags":["mcp-servers"],"summary":"Read one connected MCP server's dial state","description":"The address, auth mode, header name and refresh state, plus the last catalog reading — what the server offered and how much of it Patricia could accept. NEVER the token: it is stored sealed and is not readable by any route.","operationId":"read_mcp_server_v1_mcp_servers__account_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["mcp-servers"],"summary":"Change an MCP server's address, token or header","description":"Applies the change in place, bumps the connection generation and disables the server's tools until a same-generation sync succeeds.","operationId":"update_mcp_server_v1_mcp_servers__account_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpServerResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-servers/{account_id}/syncs":{"post":{"tags":["mcp-servers"],"summary":"Refresh an MCP server's tool catalog","description":"Re-fetches the server's tools. Also the manual retry after a refused reconcile.","operationId":"refresh_mcp_server_v1_mcp_servers__account_id__syncs_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"account_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Account Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncQueuedResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/mcp-setup/begin":{"post":{"tags":["mcp-setup"],"summary":"Read a custom MCP setup request","description":"Returns the server details stored when Patricia created this single-use setup link.","operationId":"begin_mcp_setup_v1_mcp_setup_begin_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSetupBeginBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSetupBeginResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-setup/complete":{"post":{"tags":["mcp-setup"],"summary":"Complete a custom MCP setup request","description":"Consumes the single-use setup link, then validates and probes the stored server before registration. The response never includes the submitted server credential.","operationId":"complete_mcp_setup_v1_mcp_setup_complete_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSetupCompleteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSetupCompleteResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-setup/oauth/start":{"post":{"tags":["mcp-setup"],"summary":"Begin an OAuth connect for a chat-requested MCP server","description":"Redeems the single-use setup link, then discovers the frozen server's authorization service and returns the URL to send the person to. Nothing is connected until the ceremony completes.","operationId":"start_mcp_setup_oauth_v1_mcp_setup_oauth_start_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSetupOAuthStartBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/McpSetupOAuthStartResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-tokens":{"get":{"tags":["mcp-tokens"],"summary":"List personal MCP tokens","description":"List the signed-in teammate's personal MCP tokens in this workspace.","operationId":"list_mcp_tokens_v1_mcp_tokens_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ListValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["mcp-tokens"],"summary":"Create personal MCP token","description":"Create a personal MCP token for the signed-in teammate.","operationId":"create_mcp_token_v1_mcp_tokens_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__mcp_personal_token__McpPersonalToken__CreateValidator"}}}},"responses":{"201":{"description":"The created token, including its one-time plaintext.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__mcp_personal_token__McpPersonalToken__CreatedValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["mcp-tokens"],"summary":"Revoke all personal MCP tokens","description":"Revoke every personal MCP token owned by the signed-in teammate.","operationId":"revoke_all_mcp_tokens_v1_mcp_tokens_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/mcp-tokens/{id}":{"delete":{"tags":["mcp-tokens"],"summary":"Revoke personal MCP token","description":"Revoke one personal MCP token. A teammate can revoke their own token. An owner or admin can revoke any token in the workspace.","operationId":"revoke_mcp_token_v1_mcp_tokens__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/recap-channel-options":{"get":{"tags":["meetings"],"summary":"List channels that can receive meeting recaps","description":"Named Slack and Microsoft Teams channels available to the Meetings recap setting. The result is tenant-scoped and returns Slack channels first.","operationId":"list_recap_channel_options_v1_meetings_recap_channel_options_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/RecapChannelOption"},"title":"Response List Recap Channel Options V1 Meetings Recap Channel Options Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/recordings":{"get":{"tags":["meetings"],"summary":"List recent meeting recordings","description":"The workspace's most recent meeting recordings, newest first: title, platform, when they were requested, their lifecycle status, and whether the recap was posted.","operationId":"list_meeting_recordings_v1_meetings_recordings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":50,"minimum":1,"description":"How many recordings to return (newest first).","default":20,"title":"Limit"},"description":"How many recordings to return (newest first)."},{"name":"owner_actor_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"Only recordings belonging to this person (from GET /meetings/recordings/people).","title":"Owner Actor Id"},"description":"Only recordings belonging to this person (from GET /meetings/recordings/people)."},{"name":"participant","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"description":"Only recordings whose transcript has this speaker (from GET /meetings/recordings/people).","title":"Participant"},"description":"Only recordings whose transcript has this speaker (from GET /meetings/recordings/people)."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingRecordingHistoryResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/recordings/people":{"get":{"tags":["meetings"],"summary":"List the people the recordings list can be filtered by","description":"The owner and participant options for the Meetings filters, so the dashboard offers real names instead of asking anyone to type an id. Owners come from the recording's own owner; participants are the speaker labels on the transcripts. Both are scoped to the recordings this caller can see.","operationId":"list_meeting_filter_people_v1_meetings_recordings_people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingFilterPeopleResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/recordings/{recording_id}":{"get":{"tags":["meetings"],"summary":"Get one meeting recording","description":"One recording with its transcript-derived extras: who spoke (attendees) and roughly how long it ran. Attendees appear once the meeting's notes are ready.","operationId":"get_meeting_recording_v1_meetings_recordings__recording_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"recording_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The recording id.","title":"Recording Id"},"description":"The recording id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingRecordingDetailView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["meetings"],"summary":"Erase a meeting recording","description":"Permanently erase a meeting recording: its transcript, its recap, the calendar invite list stored with it, everything Patricia remembered from it, its recap emails, the cached copy of the recap posted into Slack, and the copy Recall holds. This cannot be undone and it is not a hide: nothing is kept back for later recovery. The response says what was removed, and names the places it does not reach. Admin/owner only.","operationId":"erase_meeting_recording_route_v1_meetings_recordings__recording_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"recording_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The recording id.","title":"Recording Id"},"description":"The recording id."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingErasureReceiptView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/recordings/{recording_id}/transcript":{"get":{"tags":["meetings"],"summary":"Get a meeting recording transcript","description":"A stable offset page over readable, speaker-labeled transcript turns.","operationId":"get_meeting_recording_transcript_v1_meetings_recordings__recording_id__transcript_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"recording_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The recording id.","title":"Recording Id"},"description":"The recording id."},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"description":"How many merged turns to skip.","default":0,"title":"Offset"},"description":"How many merged turns to skip."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"How many merged turns to return.","default":100,"title":"Limit"},"description":"How many merged turns to return."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingTranscriptPage"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/settings":{"get":{"tags":["meetings"],"summary":"Get the Meetings settings","description":"The Meetings view read-model: the workspace's recap and auto-join settings, the caller's own auto-join opt-in, whether a calendar is connected (personally and for the team), and the resolved auto-join state with the exact blockers.","operationId":"get_meetings_settings_v1_meetings_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingsSettingsView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["meetings"],"summary":"Update the workspace Meetings settings","description":"Change the team-level meeting settings: auto-join arming, the recap toggle, where recaps go when there is no asking thread, and the pre-share recap instructions. Only the fields provided are changed. Admin/owner only.","operationId":"update_meetings_settings_v1_meetings_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingsTeamSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingsSettingsView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/settings/personal":{"put":{"tags":["meetings"],"summary":"Set your own meeting auto-join opt-in","description":"Turn auto-join on or off for YOUR calendar meetings. This only ever changes the caller's own preference; auto-join additionally needs the workspace toggle and a connected calendar.","operationId":"update_personal_meetings_settings_v1_meetings_settings_personal_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingsPersonalSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingsSettingsView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/meetings/usage":{"get":{"tags":["meetings"],"summary":"Get the workspace meeting-recording usage","description":"Concurrent recording slots in use vs the cap, monthly recorded minutes, and active recordings.","operationId":"get_meeting_usage_v1_meetings_usage_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MeetingUsageView"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/members":{"get":{"tags":["members"],"summary":"List members","description":"Return the tenant's member roster, lifecycle facts, and adoption counts.","operationId":"list_members_v1_members_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberListResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/deactivations":{"post":{"tags":["members"],"summary":"Deactivate selected members","description":"Soft-deactivate each eligible selected member.","operationId":"deactivate_members_v1_members_deactivations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberDeactivationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberDeactivationResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/invite":{"post":{"tags":["members"],"summary":"Invite a new member","description":"Send a workspace invitation email to the given address.\n\nCreates a pending invitation and dispatches the invitation email.\nAny existing pending invite for the same email in this tenant is\nreplaced (the old one is revoked, a new one is issued).\n\nReturns the invitation record. The raw token is NOT included.","operationId":"invite_member_v1_members_invite_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InviteResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/merge":{"post":{"tags":["members"],"summary":"Merge two members who are the same person","description":"Merge the two members after re-judging the evidence under their row locks.","operationId":"merge_members_v1_members_merge_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberMergePreviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberMergeResponse"}}}},"409":{"description":"Conflict: inspect ``errors[0].type`` for the specific case (``last_owner``, ``value_error``)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/merge-preview":{"post":{"tags":["members"],"summary":"Check whether two members are the same person","description":"Judge a proposed merge and list exactly what it would move. Writes nothing.","operationId":"preview_member_merge_v1_members_merge_preview_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberMergePreviewBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberMergePreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/outreach":{"post":{"tags":["members"],"summary":"Invite or remind selected members","description":"Invite or remind each selected member through their eligible delivery lane.","operationId":"outreach_members_v1_members_outreach_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOutreachRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberOutreachResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/sync":{"post":{"tags":["members"],"summary":"Sync connected rosters","description":"Trigger Slack and Teams roster syncs for the authenticated tenant.\n\nBoth services use ``enroll_new_members=True``. This is the only roster path that adds new\npeople. Background roster tasks only refresh identities and existing memberships.\n\nThe counters are the two platforms summed; ``teams_outcome`` is what the Teams half did. A\nTeams failure never discards the Slack result: the Teams sync runs inside a savepoint, so its\nrollback leaves the Slack writes standing in the request transaction and the response says so\nrather than reporting a clean zero. Standing, not committed — nothing here commits, and the\nrequest transaction is what ``get_db`` commits after this handler returns.","operationId":"sync_members_v1_members_sync_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SyncResultResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/welcome-preview":{"get":{"tags":["members"],"summary":"Preview the member welcome message","description":"Render the workspace's real welcome DM without sending or storing it.","operationId":"welcome_preview_v1_members_welcome_preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WelcomePreviewResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{membership_id}":{"patch":{"tags":["members"],"summary":"Change a member's role","description":"Change a member's role within the authenticated tenant.\n\nSafety rules:\n- ``role_code`` must be a valid role.\n- Only principals with ``role_code == 'owner'`` may grant or revoke the\n  ``owner`` role (admins cannot create or demote owners).\n- Demoting the last ACTIVE owner is rejected with a 409, and so is demoting the last restorable\n  owner row when no owner is ACTIVE. The staff role route shares that guard,\n  :class:`services.last_owner_guard.LastOwnerGuard`, which owns the rule and its locks.\n- A membership a security action or a merge holds cannot have its role changed\n  at all: ``MembershipRepository.set_role`` asks the transition table and answers\n  409. That covers promotion INTO ``owner``, which those rows would otherwise\n  accept while nothing about them is an admin's to decide.\n\n**Both authority rules are decided twice: once on the unlocked read, and again on the\nrow this transaction has LOCKED.** The first pass only fails fast. The one that decides\nis the second, because the target's ``role_code`` is exactly what a concurrent PATCH on\nthis same route can change: a request that read the row as ``admin`` computed\n``touching_owner = False``, skipped the owner gate, and never counted owners at all — so\na promotion committing in that window let a non-owner admin demote an owner with the\nlast-owner protection not merely passed but never evaluated, and the workspace could be\nleft with none. ``reactivate_member`` below re-checks its own owner rule against the\nlocked row for the same reason.\n\nThe role moves and the status does not. A member promoted while ``pending`` stays\n``pending``; activating them is the separate, audited\n``POST /v1/members/{id}/reactivate``.","operationId":"update_member_role_v1_members__membership_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateRoleBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"tags":["members"],"summary":"Deactivate a member","description":"Soft-deactivate a member (sets ``status_code`` to ``'deactivated'``) and disconnect the\nPERSONAL integration accounts they own.\n\nEvery provider, not MCP alone: the accounts disconnected are those carrying this member's\n``connected_by_user_id`` at PERSONAL visibility.\n\nAnswers a body rather than the 204 it used to, because the second half of that sentence has a\nconsequence the caller must see: what was disconnected, and how much of it Patricia could\nactually take back. See :class:`MemberRemovalResponse`.\n\nSafety rules:\n- Cannot deactivate a member whose ``role_code`` is ``'owner'``.\n- Cannot deactivate your own account (JWT users only; API keys have no\n  email identity and bypass this check).","operationId":"deactivate_member_v1_members__membership_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRemovalResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{membership_id}/email":{"patch":{"tags":["members"],"summary":"Enable or disable all email to a member","description":"Flip a member's email kill switch: ``disabled=true`` stops ALL email to that address (marketing AND\ntransactional: billing, security, account), ``disabled=false`` restores it.\n\nThis is an all-category suppression keyed on the member's address, so it holds no matter which trigger\nfires and survives a Slack roster re-sync (the suppression store is not touched by sync). It is\nreversible only here (an admin action). Idempotent: re-disabling an already-disabled member (or\nre-enabling an already-enabled one) is a no-op that still returns the current state.\n\nA re-enable removes ONLY this admin kill switch; if the address also hard-bounced, that separate\nsuppression stays in force and the member remains unreachable until the bounce is resolved.\n\nKnown limit: the switch is ADDRESS-scoped. If a member's platform email changes (roster sync retires\nthe old membership and creates a new one), the suppression stays on the old address and the new row\nshows email enabled, and the admin must re-flip it there. Person-scoped enforcement is a follow-up owned\nby the roster-sync policy.","operationId":"set_member_email_disabled_v1_members__membership_id__email_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/EmailDisableBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{membership_id}/identity-assertion":{"post":{"tags":["members"],"summary":"Connect a member to their Microsoft or Slack account","description":"Record that this member is a Microsoft Teams or Slack teammate Patricia has already seen, so their approvals carry their role. Use it for someone who will not sign in to the dashboard themselves; anyone who does can connect their own account from Settings. The body accepts a provider field that defaults to microsoft; send slack for a Slack teammate.","operationId":"assert_member_identity_v1_members__membership_id__identity_assertion_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityAssertionBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityAssertionResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["members"],"summary":"Take back a member's Microsoft or Slack connection","description":"Undo a connection an owner or admin made on a member's behalf. The member is signed out of Patricia everywhere as part of it, because the connection was a way in. This is one-way: the account that was connected cannot be connected again afterwards, to this member or to anyone else, so use it to take a wrong connection away rather than to move one to the right teammate. The provider query value defaults to microsoft; send slack for a Slack connection. It does not touch a connection the member made themselves, including one an admin made first that the member has since proved is theirs.","operationId":"withdraw_member_identity_assertion_v1_members__membership_id__identity_assertion_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"provider","in":"query","required":false,"schema":{"enum":["microsoft","slack"],"type":"string","description":"Which chat platform the connection is on. Defaults to microsoft, so an omitted value takes back the Microsoft connection. Send slack for a Slack one.","default":"microsoft","title":"Provider"},"description":"Which chat platform the connection is on. Defaults to microsoft, so an omitted value takes back the Microsoft connection. Send slack for a Slack one."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IdentityAssertionWithdrawalResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/members/{membership_id}/mailbox-proof":{"post":{"tags":["members"],"summary":"Send a member merge confirmation link","description":"Mail a proof link to one active member in the caller's workspace.","operationId":"issue_member_merge_mailbox_proof_v1_members__membership_id__mailbox_proof_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","description":"The member whose mailbox must be confirmed.","title":"Membership Id"},"description":"The member whose mailbox must be confirmed."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberMailboxProofIssueResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{membership_id}/next-step":{"post":{"tags":["members"],"summary":"Perform a member's next step","description":"Perform the next action derived from current member state.","operationId":"perform_member_next_step_v1_members__membership_id__next_step_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberNextStepResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{membership_id}/reactivate":{"post":{"tags":["members"],"summary":"Re-add a removed member","description":"Re-add a removed member unless a security action holds the row.","operationId":"reactivate_member_v1_members__membership_id__reactivate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberRow"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/members/{membership_id}/resend":{"post":{"tags":["members"],"summary":"Resend activation outreach","description":"Re-enqueue activation outreach for a pending (or active) member.\n\nIdempotent: if a ``pending`` or ``sent`` row already exists for a channel,\nno duplicate is created (the outbox idempotency backstop applies). Deactivated\nmembers are rejected, because a removed member cannot receive an activation nudge.\n\nOnce-ever: the welcome is one hello per membership across BOTH channels, not one per\nchannel. Whichever lane says it first spends the claim (the DM lane before it posts, the\nemail lane once the provider accepts), so a member whose claim is already spent gets nothing\non either channel. This refuses with ``skipped_reason=\"member_already_welcomed\"`` rather than\nminting a row the drainer would terminally skip moments later.\n\nNothing is minted until somebody in the workspace has given Patricia a task in chat, so an\nempty ``channels`` can carry ``skipped_reason=\"workspace_has_not_used_patricia\"``. The workspace\noutreach setting plays no part: it allows or stops marketing email only.\n\nAttempt-bounded: a member whose welcome DM has already failed its allowance is refused with\n``skipped_reason=\"welcome_dm_attempts_exhausted\"`` rather than queueing another attempt the\nplatform has already refused three times.\n\nA created ``email`` row is delivered by its own background task. A created DM row (``slack_dm``\nor ``teams_dm``) is NOT: it is picked up by the paced welcome DM drainer, so \"created\" here means queued for\ndelivery within the next few minutes, not sent.\n\nReturns the channels for which new outreach rows were created. Empty channels means the\nworkspace has not used Patricia yet, the member has already been welcomed (see\n``skipped_reason`` for both), or the applicable channel already had a pending/sent row.","operationId":"resend_activation_v1_members__membership_id__resend_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"membership_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Membership Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ResendResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/memory-items":{"get":{"tags":["memory-items","memory-items"],"summary":"Search memory items","description":"List memory items with filtering, sorting, and pagination.","operationId":"list_items_v1_memory_items_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated memory item list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory-items/{id}":{"get":{"tags":["memory-items","memory-items"],"summary":"Get memory item","description":"Retrieve a single memory item by ID.","operationId":"get_item_v1_memory_items__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested memory item.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory/beliefs":{"get":{"tags":["memory-viewer"],"summary":"List what Patricia believes for this tenant","description":"Unified, source-labeled list of recallable memories, promoted lessons, and company facts.","operationId":"list_beliefs_v1_memory_beliefs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"search","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"description":"Case-insensitive substring filter.","title":"Search"},"description":"Case-insensitive substring filter."},{"name":"kind","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one of: memory | lesson | fact.","title":"Kind"},"description":"Filter to one of: memory | lesson | fact."},{"name":"group","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Filter to one provenance family.","title":"Group"},"description":"Filter to one provenance family."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeliefList"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory/company-facts":{"patch":{"tags":["memory-viewer"],"summary":"Edit a company fact","description":"Update one whitelisted company/brand-profile field.","operationId":"edit_company_fact_v1_memory_company_facts_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyFactUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BeliefItem"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory/lessons/{lesson_id}/forget":{"post":{"tags":["memory-viewer"],"summary":"Forget a lesson","description":"Retire a promoted lesson AND soft-delete its recallable memory row, so it leaves recall.","operationId":"forget_lesson_v1_memory_lessons__lesson_id__forget_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"lesson_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Lesson Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgetResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory/map":{"get":{"tags":["memory-viewer"],"summary":"The projected picture of what Patricia remembers","description":"Every memory this person may read, placed in three dimensions by a nightly projection of its embedding. A picture of the memory space, never the basis of an answer: search, neighbours and every count read the real vectors.","operationId":"read_memory_map_v1_memory_map_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryMap"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory/map/search":{"get":{"tags":["memory-viewer"],"summary":"Which drawn memories a search matched","description":"The ids of the points to light up for a search, matched against the whole memory rather than the preview a point carries. Returns ids only: the caller already holds the map.","operationId":"search_memory_map_v1_memory_map_search_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200,"description":"Case-insensitive substring of a memory.","title":"Q"},"description":"Case-insensitive substring of a memory."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryMapMatches"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/memory/memories/{item_id}/forget":{"post":{"tags":["memory-viewer"],"summary":"Forget a memory","description":"Soft-delete a recallable memory so it leaves recall (reversible via the admin restore).","operationId":"forget_memory_v1_memory_memories__item_id__forget_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"item_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Item Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ForgetResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/message-action-policy/tenant":{"get":{"tags":["message-action-policy"],"summary":"Get the workspace message-action policy","description":"Read the emoji allowlist, proactive toggles, and per-channel/hour caps that govern Patricia's reactions and targeted replies (admin). A workspace that has configured nothing reads back the shipped defaults, which allow her to react on her own and to answer in an existing message's thread on her own, but not to start a new top-level message.","operationId":"get_message_action_policy_v1_message_action_policy_tenant_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageActionPolicyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["message-action-policy"],"summary":"Set the workspace message-action policy","description":"Replace the emoji allowlist, proactive toggles, and per-channel/hour caps. Admin only. Patricia may react ONLY with an allowlisted emoji. She adds one on her own, and answers in an existing message's thread on her own, unless this workspace turns those toggles off; she only starts a NEW top-level message on her own if this workspace turns that one on. Every cap is the most a channel may receive in an hour, counting both the ones she is asked for and the ones she does on her own. For REACTIONS and REPLIES the unprompted ones stop short of the cap, keeping a slice back so a directed request still has room, and at a cap of 1 the unprompted lane gets none. New top-level messages have no such split: unprompted ones can use the whole cap, so at a cap of 1 an unprompted post can take the only slot. This REPLACES the whole policy, so EVERY POLICY FIELD IS REQUIRED: an omitted field is a 422 naming it, never a silent write of some default. Read the current policy with GET, change what you want, and send the whole thing back — the GET response is accepted as-is, so there is no need to strip the read-only fields it carries. One exception: an echoed stored_policy_unreadable=true is refused. That flag means the stored policy could not be read and the GET showed the fail-closed fallback, so saving it back would record the fallback as a deliberate choice and erase the only signal that anything was wrong — decide what the policy should be and send that.","operationId":"set_message_action_policy_v1_message_action_policy_tenant_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageActionPolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MessageActionPolicyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/model-settings":{"get":{"tags":["model-settings"],"summary":"Get the workspace intelligence levels","description":"Show each intelligence level, the model and thinking setup it resolves to for this workspace, which level regular work uses, what each level is used for, and the models the workspace can build its own setup from.","operationId":"get_model_settings_v1_model_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSettingsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["model-settings"],"summary":"Set the workspace intelligence level","description":"Choose one intelligence level for regular workspace work, save your own model and thinking choice, or restore Patricia's recommended levels. Quick checks and messages that ask Patricia to take more time keep their separate levels. Changes take effect on the next run.","operationId":"update_model_settings_v1_model_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModelSettingsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"402":{"description":"Choosing a level or a setup needs a paid plan (`PAID_PLAN_REQUIRED`).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/onboarding-chat-platform":{"post":{"tags":["onboarding"],"summary":"Choose a chat platform to connect","description":"Record which chat platform a password-signup workspace wants to connect. A pick may be overwritten by a later one; refused only once the workspace has already installed a chat platform. Requires `tenant:read`.","operationId":"choose_chat_platform_v1_onboarding_chat_platform_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingChatPlatformRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingChatPlatformResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/onboarding-progress":{"get":{"tags":["onboarding"],"summary":"Onboarding checklist progress","description":"Tenant-scoped per-step completion for the Home onboarding checklist: whether Slack is connected, the company profile is set up, Patricia is in a channel, the user connected a non-Slack tool, the user gave Patricia a task, and the team was grown, plus `all_done`. Each step is derived truthfully from stored data and is only `true` from a real signal. Requires `tenant:read`.","operationId":"get_onboarding_progress_v1_onboarding_progress_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingProgressResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/onboarding-readiness":{"get":{"tags":["onboarding"],"summary":"Onboarding background-research readiness","description":"Tenant-scoped answer to whether the caller's own person-signals read (calendar or Gmail) is still running. Requires `tenant:read`.","operationId":"get_onboarding_readiness_v1_onboarding_readiness_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingReadinessResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/onboarding-skips":{"post":{"tags":["onboarding"],"summary":"Skip an onboarding step","description":"Record a workspace onboarding step as skipped. Requires `tenant:read`.","operationId":"create_onboarding_skip_v1_onboarding_skips_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingSkipRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingSkipResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/onboarding-use-cases":{"post":{"tags":["onboarding"],"summary":"Create Onboarding Use Case","operationId":"create_onboarding_use_case_v1_onboarding_use_cases_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingUseCaseRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingUseCaseResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/onboarding-use-cases/ai-tools":{"put":{"tags":["onboarding"],"summary":"Save Ai Tools","operationId":"save_ai_tools_v1_onboarding_use_cases_ai_tools_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingAiToolsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingAiToolsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/onboarding-use-cases/integrations":{"put":{"tags":["onboarding"],"summary":"Save Integrations","operationId":"save_integrations_v1_onboarding_use_cases_integrations_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingIntegrationsRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OnboardingIntegrationsResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/outreach-settings":{"get":{"tags":["outreach-settings"],"summary":"Get the workspace outreach settings","description":"Read whether Patricia may send marketing emails to your team. Each teammate can still unsubscribe. Welcome messages in chat do not depend on this setting. New workspaces start with this on.","operationId":"get_outreach_settings_v1_outreach_settings_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachSettingsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["outreach-settings"],"summary":"Update the workspace outreach settings","description":"Allow or stop marketing emails to your team. Each teammate can still unsubscribe. Welcome messages in chat do not depend on this setting. New workspaces start with this on.","operationId":"update_outreach_settings_v1_outreach_settings_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachSettingsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachSettingsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/permission-requests":{"get":{"tags":["permission-requests"],"summary":"List tool-approval requests","description":"Tenant-scoped human-in-the-loop approval queue (read-only SearchQuery view). Argument values are sanitized and visible only to callers who can decide requests (runs:execute); read-only callers receive a value-free input_summary instead.","operationId":"list_permission_requests_v1_permission_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/queries__permission_request_queue__PermissionRequestQueueQuery__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/permission-requests/{permission_request_id}":{"get":{"tags":["permission-requests"],"summary":"Get a tool-approval request","description":"Fetch a single approval request by id, scoped to the caller's tenant. Argument values are sanitized and visible only to callers who can decide requests (runs:execute) and are rendered in FULL on this detail view, so an approver can review everything the tool will run with; read-only callers receive a value-free input_summary instead.","operationId":"get_permission_request_v1_permission_requests__permission_request_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionRequestRow"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/permission-requests/{permission_request_id}/approve":{"post":{"tags":["permission-requests"],"summary":"Approve a tool-approval request","description":"Approve a pending request and resume its suspended run (async). A verified requester can answer their pending task offer with choice=none without runs:execute.","operationId":"approve_permission_request_v1_permission_requests__permission_request_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TaskOfferSelection"},{"type":"null"}],"title":"Selection"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: the request has already been resolved (error_type already_resolved), or the run's actor is not the owner of the personal connection it would spend (error_type run_actor_not_connection_owner), which dispatch would refuse.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable: the task queue could not accept the decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/permission-requests/{permission_request_id}/deny":{"post":{"tags":["permission-requests"],"summary":"Deny a tool-approval request","description":"Deny a pending request; its run resolves without running the tool (async). A verified requester can answer their pending task offer with choice=none without runs:execute.","operationId":"deny_permission_request_v1_permission_requests__permission_request_id__deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"content":{"application/json":{"schema":{"anyOf":[{"$ref":"#/components/schemas/TaskOfferSelection"},{"type":"null"}],"title":"Selection"}}}},"responses":{"202":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApprovalDecisionResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict: the request has already been resolved (error_type already_resolved).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"Service unavailable: the task queue could not accept the decision.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/permission-requests/{permission_request_id}/private-review":{"post":{"tags":["permission-requests"],"summary":"Get requester-private task destinations","operationId":"get_task_private_review_v1_permission_requests__permission_request_id__private_review_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPrivateDetailResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/permission-requests/{permission_request_id}/private-review-acknowledgement":{"post":{"tags":["permission-requests"],"summary":"Acknowledge a requester-private task review","operationId":"acknowledge_task_private_review_v1_permission_requests__permission_request_id__private_review_acknowledgement_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"permission_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Permission Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPrivateReviewAcknowledgement"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TaskPrivateReviewResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/person-facts":{"put":{"tags":["person-facts"],"summary":"Set a person's birthday or work anniversary (admin data entry)","description":"The admin data-entry collection mode (the fillable fact_entry_table surface). An admin sets a person's fact: month+day for a birthday (recurring_date, NO year) or an ISO date for a work anniversary. Tenant-scoped; PII-safe (no raw value logged; audit stores a hash). Honors the fact's allowed_sources allowlist when set. Bumps fact_revision so an in-flight occurrence rechecks.","operationId":"set_person_fact_v1_person_facts_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SetPersonFactRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonFactSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/person-facts/opt-out":{"post":{"tags":["person-facts"],"summary":"Opt a subject out of a celebration fact (subject-global)","description":"Opt a subject out of a canonical fact. GLOBAL to the subject: shared by every skill that references the fact (one skill can't leak what another suppressed). Purges the stored value + projection columns so the projector can never mint an occurrence for the subject; bumps fact_revision so any in-flight occurrence skips at the pre-send re-check.","operationId":"opt_out_person_fact_v1_person_facts_opt_out_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OptOutRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonFactSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/person-facts/self":{"post":{"tags":["person-facts"],"summary":"Submit your OWN birthday or work anniversary (employee self-submission)","description":"The employee self-submission collection mode: the target of a solicit_fact notify. A member submits their OWN fact (source=self, the highest-trust source): month+day for a birthday (recurring_date, NO year) or an ISO date for a work anniversary. The subject is ALWAYS the caller's own actor (resolved from the verified JWT email), so a member can never write another person's fact. Tenant-scoped; PII-safe (no raw value logged; audit stores a hash); honors the fact's allowed_sources allowlist when set.","operationId":"submit_own_fact_v1_person_facts_self_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitOwnFactRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PersonFactSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/proactive-limits":{"get":{"tags":["proactive-limits"],"summary":"Get the workspace proactive-reply limits","description":"How often Patricia replies on her own in the caller's workspace: the per-channel daily reply cap and the quiet period between unprompted replies, each labelled as Patricia's recommended default or a workspace override. Defaults: 8 replies per channel a day, a 30-minute quiet period.","operationId":"get_proactive_limits_v1_proactive_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProactiveLimitsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["proactive-limits"],"summary":"Update the workspace proactive-reply limits","description":"Set the per-channel daily reply cap and/or the quiet period between unprompted replies, or reset both to Patricia's recommended settings. Changes take effect on the workspace's next proactive evaluation. Only the fields provided are changed.","operationId":"update_proactive_limits_v1_proactive_limits_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProactiveLimitsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProactiveLimitsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/actor-kinds":{"get":{"tags":["reference"],"summary":"List Actor Kind Refs","description":"Return all Actor Kind Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_actor_kinds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Actor Kind Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_ActorKindRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/actor-kinds/{code}":{"get":{"tags":["reference"],"summary":"Get Actor Kind Ref","description":"Return a single Actor Kind Ref record by its primary key.","operationId":"_get_detail_v1_reference_actor_kinds__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Actor Kind Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActorKindRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/brain-doc-scopes":{"get":{"tags":["reference"],"summary":"List Brain Doc Scope Refs","description":"Return all Brain Doc Scope Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_brain_doc_scopes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Brain Doc Scope Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_BrainDocScopeRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/brain-doc-scopes/{code}":{"get":{"tags":["reference"],"summary":"Get Brain Doc Scope Ref","description":"Return a single Brain Doc Scope Ref record by its primary key.","operationId":"_get_detail_v1_reference_brain_doc_scopes__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Brain Doc Scope Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BrainDocScopeRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/conversation-kinds":{"get":{"tags":["reference"],"summary":"List Conversation Kind Refs","description":"Return all Conversation Kind Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_conversation_kinds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Conversation Kind Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_ConversationKindRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/conversation-kinds/{code}":{"get":{"tags":["reference"],"summary":"Get Conversation Kind Ref","description":"Return a single Conversation Kind Ref record by its primary key.","operationId":"_get_detail_v1_reference_conversation_kinds__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Conversation Kind Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConversationKindRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/cron-kinds":{"get":{"tags":["reference"],"summary":"List Cron Kind Refs","description":"Return all Cron Kind Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_cron_kinds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Cron Kind Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_CronKindRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/cron-kinds/{code}":{"get":{"tags":["reference"],"summary":"Get Cron Kind Ref","description":"Return a single Cron Kind Ref record by its primary key.","operationId":"_get_detail_v1_reference_cron_kinds__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Cron Kind Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CronKindRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/doc-statuses":{"get":{"tags":["reference"],"summary":"List Doc Status Refs","description":"Return all Doc Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_doc_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Doc Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_DocStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/doc-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Doc Status Ref","description":"Return a single Doc Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_doc_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Doc Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/group-statuses":{"get":{"tags":["reference"],"summary":"List Group Status Refs","description":"Return all Group Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_group_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Group Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_GroupStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/group-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Group Status Ref","description":"Return a single Group Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_group_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Group Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/group-suggestion-statuses":{"get":{"tags":["reference"],"summary":"List Group Suggestion Status Refs","description":"Return all Group Suggestion Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_group_suggestion_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Group Suggestion Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_GroupSuggestionStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/group-suggestion-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Group Suggestion Status Ref","description":"Return a single Group Suggestion Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_group_suggestion_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Group Suggestion Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GroupSuggestionStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/integration-statuses":{"get":{"tags":["reference"],"summary":"List Integration Status Refs","description":"Return all Integration Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_integration_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Integration Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_IntegrationStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/integration-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Integration Status Ref","description":"Return a single Integration Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_integration_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Integration Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/integration-visibilities":{"get":{"tags":["reference"],"summary":"List Integration Visibility Refs","description":"Return all Integration Visibility Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_integration_visibilities_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Integration Visibility Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_IntegrationVisibilityRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/integration-visibilities/{code}":{"get":{"tags":["reference"],"summary":"Get Integration Visibility Ref","description":"Return a single Integration Visibility Ref record by its primary key.","operationId":"_get_detail_v1_reference_integration_visibilities__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Integration Visibility Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationVisibilityRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/invitation-statuses":{"get":{"tags":["reference"],"summary":"List Invitation Status Refs","description":"Return all Invitation Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_invitation_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Invitation Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_InvitationStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/invitation-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Invitation Status Ref","description":"Return a single Invitation Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_invitation_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Invitation Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InvitationStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/lesson-statuses":{"get":{"tags":["reference"],"summary":"List Lesson Status Refs","description":"Return all Lesson Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_lesson_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Lesson Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_LessonStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/lesson-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Lesson Status Ref","description":"Return a single Lesson Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_lesson_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Lesson Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LessonStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/member-sources":{"get":{"tags":["reference"],"summary":"List Member Source Refs","description":"Return all Member Source Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_member_sources_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Member Source Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_MemberSourceRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/member-sources/{code}":{"get":{"tags":["reference"],"summary":"Get Member Source Ref","description":"Return a single Member Source Ref record by its primary key.","operationId":"_get_detail_v1_reference_member_sources__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Member Source Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemberSourceRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/membership-statuses":{"get":{"tags":["reference"],"summary":"List Membership Status Refs","description":"Return all Membership Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_membership_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Membership Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_MembershipStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/membership-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Membership Status Ref","description":"Return a single Membership Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_membership_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Membership Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MembershipStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/memory-kinds":{"get":{"tags":["reference"],"summary":"List Memory Kind Refs","description":"Return all Memory Kind Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_memory_kinds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Memory Kind Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_MemoryKindRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/memory-kinds/{code}":{"get":{"tags":["reference"],"summary":"Get Memory Kind Ref","description":"Return a single Memory Kind Ref record by its primary key.","operationId":"_get_detail_v1_reference_memory_kinds__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Memory Kind Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryKindRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/memory-scopes":{"get":{"tags":["reference"],"summary":"List Memory Scope Refs","description":"Return all Memory Scope Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_memory_scopes_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Memory Scope Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_MemoryScopeRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/memory-scopes/{code}":{"get":{"tags":["reference"],"summary":"Get Memory Scope Ref","description":"Return a single Memory Scope Ref record by its primary key.","operationId":"_get_detail_v1_reference_memory_scopes__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Memory Scope Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MemoryScopeRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/outreach-channels":{"get":{"tags":["reference"],"summary":"List Outreach Channel Refs","description":"Return all Outreach Channel Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_outreach_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Outreach Channel Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_OutreachChannelRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/outreach-channels/{code}":{"get":{"tags":["reference"],"summary":"Get Outreach Channel Ref","description":"Return a single Outreach Channel Ref record by its primary key.","operationId":"_get_detail_v1_reference_outreach_channels__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Outreach Channel Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachChannelRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/outreach-personalizations":{"get":{"tags":["reference"],"summary":"List Outreach Personalization Refs","description":"Return all Outreach Personalization Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_outreach_personalizations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Outreach Personalization Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_OutreachPersonalizationRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/outreach-personalizations/{code}":{"get":{"tags":["reference"],"summary":"Get Outreach Personalization Ref","description":"Return a single Outreach Personalization Ref record by its primary key.","operationId":"_get_detail_v1_reference_outreach_personalizations__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Outreach Personalization Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachPersonalizationRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/outreach-statuses":{"get":{"tags":["reference"],"summary":"List Outreach Status Refs","description":"Return all Outreach Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_outreach_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Outreach Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_OutreachStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/outreach-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Outreach Status Ref","description":"Return a single Outreach Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_outreach_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Outreach Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OutreachStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/permission-statuses":{"get":{"tags":["reference"],"summary":"List Permission Status Refs","description":"Return all Permission Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_permission_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Permission Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_PermissionStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/permission-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Permission Status Ref","description":"Return a single Permission Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_permission_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Permission Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PermissionStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/platforms":{"get":{"tags":["reference"],"summary":"List Platform Refs","description":"Return all Platform Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_platforms_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Platform Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_PlatformRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/platforms/{code}":{"get":{"tags":["reference"],"summary":"Get Platform Ref","description":"Return a single Platform Ref record by its primary key.","operationId":"_get_detail_v1_reference_platforms__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Platform Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/preference-sources":{"get":{"tags":["reference"],"summary":"List Preference Source Refs","description":"Return all Preference Source Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_preference_sources_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Preference Source Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_PreferenceSourceRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/preference-sources/{code}":{"get":{"tags":["reference"],"summary":"Get Preference Source Ref","description":"Return a single Preference Source Ref record by its primary key.","operationId":"_get_detail_v1_reference_preference_sources__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Preference Source Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PreferenceSourceRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/proactive-candidate-statuses":{"get":{"tags":["reference"],"summary":"List Proactive Candidate Status Refs","description":"Return all Proactive Candidate Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_proactive_candidate_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Proactive Candidate Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_ProactiveCandidateStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/proactive-candidate-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Proactive Candidate Status Ref","description":"Return a single Proactive Candidate Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_proactive_candidate_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Proactive Candidate Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProactiveCandidateStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/risk-tiers":{"get":{"tags":["reference"],"summary":"List Risk Tier Refs","description":"Return all Risk Tier Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_risk_tiers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Risk Tier Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_RiskTierRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/risk-tiers/{code}":{"get":{"tags":["reference"],"summary":"Get Risk Tier Ref","description":"Return a single Risk Tier Ref record by its primary key.","operationId":"_get_detail_v1_reference_risk_tiers__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Risk Tier Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskTierRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/roles":{"get":{"tags":["reference"],"summary":"List Role Refs","description":"Return all Role Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_roles_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Role Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_RoleRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/roles/{code}":{"get":{"tags":["reference"],"summary":"Get Role Ref","description":"Return a single Role Ref record by its primary key.","operationId":"_get_detail_v1_reference_roles__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Role Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/run-statuses":{"get":{"tags":["reference"],"summary":"List Run Status Refs","description":"Return all Run Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_run_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Run Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_RunStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/run-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Run Status Ref","description":"Return a single Run Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_run_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Run Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/run-triggers":{"get":{"tags":["reference"],"summary":"List Run Trigger Refs","description":"Return all Run Trigger Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_run_triggers_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Run Trigger Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_RunTriggerRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/run-triggers/{code}":{"get":{"tags":["reference"],"summary":"Get Run Trigger Ref","description":"Return a single Run Trigger Ref record by its primary key.","operationId":"_get_detail_v1_reference_run_triggers__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Run Trigger Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunTriggerRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/tenant-statuses":{"get":{"tags":["reference"],"summary":"List Tenant Status Refs","description":"Return all Tenant Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_tenant_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Tenant Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_TenantStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/tenant-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Tenant Status Ref","description":"Return a single Tenant Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_tenant_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Tenant Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TenantStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/tool-call-statuses":{"get":{"tags":["reference"],"summary":"List Tool Call Status Refs","description":"Return all Tool Call Status Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_tool_call_statuses_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Tool Call Status Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_ToolCallStatusRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/tool-call-statuses/{code}":{"get":{"tags":["reference"],"summary":"Get Tool Call Status Ref","description":"Return a single Tool Call Status Ref record by its primary key.","operationId":"_get_detail_v1_reference_tool_call_statuses__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Tool Call Status Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolCallStatusRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/tool-kinds":{"get":{"tags":["reference"],"summary":"List Tool Kind Refs","description":"Return all Tool Kind Ref reference records with optional filtering and sorting.","operationId":"list_reference_v1_reference_tool_kinds_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Search filter (ANTLR syntax)","title":"Q"},"description":"Search filter (ANTLR syntax)"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. 'name:asc')","title":"Sort By"},"description":"Sort expression (e.g. 'name:asc')"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection","title":"Fields"},"description":"Field projection"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Previous-page query","title":"Pq"},"description":"Previous-page query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"}],"responses":{"200":{"description":"Paginated list of Tool Kind Ref records","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse_ToolKindRefReferenceFullValidator_"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/reference/tool-kinds/{code}":{"get":{"tags":["reference"],"summary":"Get Tool Kind Ref","description":"Return a single Tool Kind Ref record by its primary key.","operationId":"_get_detail_v1_reference_tool_kinds__code__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","title":"Code"}}],"responses":{"200":{"description":"Tool Kind Ref record","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolKindRefReferenceFullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/roster-sync-policy":{"get":{"tags":["roster-sync-policy"],"summary":"Get the roster-sync policy (who joins from Slack)","description":"Which tiers of Slack member join Patricia when the workspace roster syncs: full workspace members and, only if enabled, guests (single and multi-channel). Guests are excluded by default. Any workspace member may read it.","operationId":"get_roster_sync_policy_v1_roster_sync_policy_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterSyncPolicyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["roster-sync-policy"],"summary":"Set the roster-sync policy (who joins from Slack)","description":"Set which Slack member tiers join Patricia on roster sync. Turning guests off (the default) means no single- or multi-channel guest is ever added, and any guest added by an earlier sync is deactivated on the next sync. Admin only.","operationId":"set_roster_sync_policy_v1_roster_sync_policy_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterSyncPolicyBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RosterSyncPolicyResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs":{"get":{"tags":["runs","runs"],"summary":"Search agent runs","description":"List agent runs with filtering, sorting, and pagination.","operationId":"list_items_v1_runs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"mine","in":"query","required":false,"schema":{"type":"boolean","description":"When true, list only the runs that ran as the caller: the fires of the scheduled tasks they created, and the runs their own messages started. Defaults to false, the whole audience the caller can already read.","default":false,"title":"Mine"},"description":"When true, list only the runs that ran as the caller: the fires of the scheduled tasks they created, and the runs their own messages started. Defaults to false, the whole audience the caller can already read."},{"name":"task_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"List only the runs fired by this scheduled task (a cron-jobs row id).","title":"Task Id"},"description":"List only the runs fired by this scheduled task (a cron-jobs row id)."},{"name":"trigger_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"List only the runs fired by this event trigger (a channel-feeds row id).","title":"Trigger Id"},"description":"List only the runs fired by this event trigger (a channel-feeds row id)."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated agent run list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__AgentRun__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs/run-history":{"get":{"tags":["runs"],"summary":"Search the run history","description":"Read-only run-history view backed by a SearchQuery (QueryProxy).","operationId":"list_run_history_v1_runs_run_history_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/queries__run_history__RunHistoryQuery__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs/{id}":{"get":{"tags":["runs"],"summary":"Get run","description":"Retrieve a single run by ID, its live progress, and its available skill details.","operationId":"get_item_v1_runs__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested agent run.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunDetailResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs/{run_id}/messages":{"get":{"tags":["runs"],"summary":"Search messages","description":"List messages with filtering, sorting, and pagination. Use 'any' as run_id to search across all parents in the tenant.","operationId":"list_messages_v1_runs__run_id__messages_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Agent Run ID. Use 'any' to search across all parents.","title":"Run Id"},"description":"Agent Run ID. Use 'any' to search across all parents."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated message list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Message__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs/{run_id}/messages/{id}":{"get":{"tags":["runs"],"summary":"Get message","description":"Retrieve a single message by ID. Use 'any' as run_id to skip parent validation.","operationId":"get_message_v1_runs__run_id__messages__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Agent Run ID. Use 'any' to search across all parents.","title":"Run Id"},"description":"Agent Run ID. Use 'any' to search across all parents."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested message.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__conversation__Message__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs/{run_id}/tool-calls":{"get":{"tags":["runs"],"summary":"Search tool calls","description":"List tool calls with filtering, sorting, and pagination. Use 'any' as run_id to search across all parents in the tenant.","operationId":"list_tool_calls_v1_runs__run_id__tool_calls_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Agent Run ID. Use 'any' to search across all parents.","title":"Run Id"},"description":"Agent Run ID. Use 'any' to search across all parents."},{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated tool call list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__ToolCall__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs/{run_id}/tool-calls/{id}":{"get":{"tags":["runs"],"summary":"Get tool call","description":"Retrieve a single tool call by ID. Use 'any' as run_id to skip parent validation.","operationId":"get_tool_call_v1_runs__run_id__tool_calls__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"run_id","in":"path","required":true,"schema":{"type":"string","description":"Agent Run ID. Use 'any' to search across all parents.","title":"Run Id"},"description":"Agent Run ID. Use 'any' to search across all parents."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested tool call.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__run__ToolCall__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/shared-assets/{token}":{"get":{"tags":["shared-assets"],"summary":"Download a shared file (public, by capability token)","description":"The file behind one share link, as an attachment. No sign-in. Answers 404 for an unknown or revoked link and for a deleted file — indistinguishably. Send `Accept: text/markdown` (or `text/plain`) to get the same file as text instead, which is what an agent handed the link wants: an HTML report comes back as markdown with its headings, lists and tables intact, and every chart named. Only HTML, markdown and plain-text files are rendered as text; anything else answers 406.","operationId":"download_shared_asset_v1_shared_assets__token__get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Share-Grant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Share-Grant"}}],"responses":{"200":{"description":"The stored bytes as an attachment, or their text rendering.","content":{"application/json":{"schema":{}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}},"text/markdown":{"schema":{"type":"string"}},"text/plain":{"schema":{"type":"string"}}}},"401":{"description":"A password grant is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The address request ceiling is reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"PRIVATE_ASSET_ACKNOWLEDGEMENT_REQUIRED: a workspace owner or admin must confirm a deliberate opening of a teammate's private file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The private access audit or file storage is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No shared file for that link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"406":{"description":"This route renders no text version of this file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shared-assets/{token}/meta":{"get":{"tags":["shared-assets"],"summary":"What one share link opens (public, by capability token)","description":"The facts about the file behind one share link: its name, type, size, when it was made, who made it, and when the link stops working. A sign-in is optional and never required: send one and a member of the file's workspace is also told who can see it and whether they may change that. Carries nothing about the workspace the file came from and nothing about any other file. Answers 404 for an unknown, revoked or expired link, for a deleted file, and for a file this reader may not see, indistinguishably.","operationId":"get_shared_asset_meta_v1_shared_assets__token__meta_get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Share-Grant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Share-Grant"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedAssetView"}}}},"401":{"description":"A password grant is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"No shared file for that link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"PRIVATE_ASSET_AUDIT_UNAVAILABLE: access cannot be recorded.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The address request ceiling is reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shared-assets/{token}/thumbnail":{"get":{"tags":["shared-assets"],"summary":"A shared file's preview image (public, by capability token)","description":"A small server-generated WebP preview of the file behind one share link, for the page the link opens. No sign-in. Answers 202 while a preview is being prepared, and 404 when the link is unknown, revoked or expired, when the file was deleted, or when this file will never have a preview. Supports `If-None-Match` with the returned ETag.","operationId":"get_shared_asset_thumbnail_v1_shared_assets__token__thumbnail_get","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."},{"name":"access_acknowledgement","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening.","title":"Access Acknowledgement"},"description":"A UUID for one deliberate private-file opening. Reuse across requests for the same opening."},{"name":"X-Share-Grant","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Share-Grant"}}],"responses":{"200":{"description":"The server-generated preview image.","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"No preview yet; generation is queued. Ask again shortly."},"304":{"description":"Unchanged — the ETag the client holds is still current."},"404":{"description":"No shared file for that link, or it will never have a preview.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"A password grant is required.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"The address request ceiling is reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"PRIVATE_ASSET_ACKNOWLEDGEMENT_REQUIRED: a workspace owner or admin must confirm a deliberate opening of a teammate's private file.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The private access audit or file storage is unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shared-assets/{token}/unlock":{"post":{"tags":["shared-assets"],"summary":"Open a password-protected file share link","operationId":"unlock_shared_asset_v1_shared_assets__token__unlock_post","security":[{"HTTPBearer":[]},{}],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedAssetUnlock"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedAssetGrant"}}}},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unauthorized"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Not Found"},"422":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Unprocessable Content"},"429":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}},"description":"Too Many Requests"}}}},"/v1/shared-folders/{token}":{"get":{"tags":["shared-assets"],"summary":"What one folder link opens (public, by capability token)","description":"The folder's name and how many live files it holds. No sign-in, no workspace name, no ids. Answers 404 for an unknown, revoked or expired link. Behind the asset_folder_sharing_enabled kill switch.","operationId":"get_shared_folder_meta_v1_shared_folders__token__get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedFolderFacts"}}}},"404":{"description":"No shared folder for that link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shared-folders/{token}/files":{"get":{"tags":["shared-assets"],"summary":"One page of a shared folder's files (public, by capability token)","description":"The folder's live files, oldest-filed first, paged. Each entry carries an opaque locator — pass it to the thumbnail and download routes below. No sign-in.","operationId":"list_shared_folder_files_v1_shared_folders__token__files_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."},{"name":"cursor","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":256},{"type":"null"}],"description":"From a previous page's next_cursor.","title":"Cursor"},"description":"From a previous page's next_cursor."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Limit"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SharedFolderPage"}}}},"404":{"description":"No shared folder for that link.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shared-folders/{token}/files/download":{"get":{"tags":["shared-assets"],"summary":"Download a shared folder's file (public, by capability token + locator)","description":"One file in a shared folder, as an attachment. No sign-in.","operationId":"download_shared_folder_file_v1_shared_folders__token__files_download_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."},{"name":"locator","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"A file's opaque locator.","title":"Locator"},"description":"A file's opaque locator."}],"responses":{"200":{"description":"The stored bytes, as an attachment.","content":{"application/json":{"schema":{}},"application/octet-stream":{"schema":{"type":"string","format":"binary"}}}},"404":{"description":"No shared folder for that link, or locator.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The file exists, but the store holding its bytes cannot be reached.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/shared-folders/{token}/files/thumbnail":{"get":{"tags":["shared-assets"],"summary":"A shared folder file's preview image (public, by capability token + locator)","description":"OUR re-encoded preview of one file in a shared folder. Supports If-None-Match.","operationId":"get_shared_folder_file_thumbnail_v1_shared_folders__token__files_thumbnail_get","parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string","minLength":16,"maxLength":128,"description":"The share link's capability token.","title":"Token"},"description":"The share link's capability token."},{"name":"locator","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":128,"description":"A file's opaque locator.","title":"Locator"},"description":"A file's opaque locator."}],"responses":{"200":{"description":"The server-generated preview image.","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"202":{"description":"No preview yet; generation is queued. Ask again shortly."},"304":{"description":"Unchanged — the ETag the client holds is still current."},"404":{"description":"No shared file for that link, or it will never have a preview.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/skill-drafts":{"post":{"tags":["skill-drafts"],"summary":"Open a skill draft","description":"Start editing a skill without creating a version. Send `skill_id` to edit an EXISTING skill — its active version's manifest and files are copied in and the version number is patch-bumped — or omit it to start a new one, optionally with a starting `manifest` (for example a candidate returned by the GitHub autodetect route). Nothing here is installed, compiled into runtime rows, or visible to anyone else: a draft belongs to the person who opened it until they publish it.","operationId":"create_draft_v1_skill_drafts_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDraftRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDraftDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"get":{"tags":["skill-drafts"],"summary":"List your own skill drafts","description":"The drafts YOU opened, most recently touched first. A draft is private to its author, so this never shows a teammate's work in progress. `validation_errors` is the cached result of the last validate — a hint for the list, never a gate on publishing.","operationId":"list_my_drafts_v1_skill_drafts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillDraftSummary"},"title":"Response List My Drafts V1 Skill Drafts Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/upload":{"post":{"tags":["skill-drafts"],"summary":"Open a skill draft from an uploaded ZIP package","description":"Upload a .zip containing a manifest.yaml (+ optional SKILL.md and reference/script files) and get an EDITABLE draft rather than a finished version. The archive is read safely in memory (no extraction, hard size/bomb/traversal caps) and every member it carries becomes a draft file you can change one at a time. Send the raw .zip as the request body.","operationId":"upload_draft_zip_v1_skill_drafts_upload_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"source_ref","in":"query","required":false,"schema":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"description":"The uploaded filename, for the record.","title":"Source Ref"},"description":"The uploaded filename, for the record."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDraftDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/workspace":{"get":{"tags":["skill-drafts"],"summary":"List every draft in the workspace (metadata only)","description":"For cleanup. Returns WHAT drafts exist and who owns them — never a manifest, a file path, or any file content, because a draft is its author's unreviewed prose and this route exists to remove an abandoned one, not to read it. Pair it with DELETE /skill-drafts/{id}. Requires skills:delete.","operationId":"list_workspace_drafts_v1_skill_drafts_workspace_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillDraftMetadata"},"title":"Response List Workspace Drafts V1 Skill Drafts Workspace Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/{draft_id}":{"get":{"tags":["skill-drafts"],"summary":"Get one of your drafts","description":"Your draft in full: the working manifest plus the list of files it carries. Somebody else's draft is a 404, in your workspace or any other. `base_version_stale` means the skill you are editing has been published again since you started — see POST /skill-drafts/{id}/rebase.","operationId":"get_draft_v1_skill_drafts__draft_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDraftDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["skill-drafts"],"summary":"Update a draft's manifest or title","description":"Replace the working manifest and/or the draft's name. Nothing is validated on save — a draft is allowed to be broken while you work on it — so the cached validation result is cleared and POST /skill-drafts/{id}/validate re-checks it whenever you want.","operationId":"update_draft_v1_skill_drafts__draft_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateDraftRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDraftDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["skill-drafts"],"summary":"Delete a draft","description":"Delete your own draft and every file in it. A skills:delete holder may also delete a teammate's abandoned draft — deleting one is not the same as reading one, and they never gain the second.","operationId":"delete_draft_v1_skill_drafts__draft_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/{draft_id}/files":{"put":{"tags":["skill-drafts"],"summary":"Write one file into a draft","description":"Create or replace ONE file by its bundle-relative path — this is the route that makes editing a skill cost one file instead of a whole re-upload. Returns the draft's file list. The same per-file and per-skill size caps a published skill obeys apply here, so a draft can never grow into something publishing would refuse.","operationId":"put_draft_file_v1_skill_drafts__draft_id__files_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PutDraftFileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DraftFileSummary"},"title":"Response Put Draft File V1 Skill Drafts  Draft Id  Files Put"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["skill-drafts"],"summary":"Remove one file from a draft","description":"Remove one file from the caller's own draft (author-fenced).","operationId":"delete_draft_file_v1_skill_drafts__draft_id__files_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":512,"title":"Path"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/{draft_id}/files/content":{"get":{"tags":["skill-drafts"],"summary":"Read one file from a draft","description":"The text of one file in your own draft, addressed by its exact bundle-relative path. A file whose bytes are not text (a binary asset from an uploaded package) is refused rather than mangled — download the original package for those.","operationId":"get_draft_file_v1_skill_drafts__draft_id__files_content_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"path","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":512,"title":"Path"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftFileContent"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/{draft_id}/publish":{"post":{"tags":["skill-drafts"],"summary":"Publish a draft as a new skill version","description":"Compile the draft into ONE immutable version. The version is created exactly as the direct authoring routes create it: an owner or admin author's version is ready to enable immediately, and a version authored without that authority stays PROPOSED until an owner or admin approves it. Publishing does NOT enable the skill — enabling is a separate step with its own permission, so publishing from a draft is never a way around who may give a skill to the whole workspace.\n\nA skill that has been published again by someone else since you started editing is refused until you review what changed (POST /skill-drafts/{id}/rebase).","operationId":"publish_draft_v1_skill_drafts__draft_id__publish_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/AuthorResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/{draft_id}/rebase":{"post":{"tags":["skill-drafts"],"summary":"Carry on from the skill's latest published version","description":"Acknowledge that somebody published a new version of this skill while you were editing, and accept publishing on top of it. This is an ACKNOWLEDGEMENT, not a merge: your manifest and files are left exactly as they are. Review what changed first — whatever the newer version added is not in your draft and will not be in what you publish.","operationId":"rebase_draft_v1_skill_drafts__draft_id__rebase_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillDraftDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-drafts/{draft_id}/validate":{"post":{"tags":["skill-drafts"],"summary":"Check a draft without publishing it","description":"Compile the draft through the same platform gates a real save runs, and additionally check the manifest against the files this draft actually carries — so a reference or script you declared but never added is caught here rather than at publish. Writes no version. Always 200 (the result is in the body).","operationId":"validate_draft_v1_skill_drafts__draft_id__validate_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"draft_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Draft Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftValidationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-catalog":{"get":{"tags":["skill-hub"],"summary":"The installable skill catalog with this workspace's install state","description":"Every skill this workspace can install right now (the released platform catalog), overlaid with which ones are already installed here, so the dashboard can offer Install or link straight to the installed skill.","operationId":"list_catalog_v1_skill_catalog_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/CatalogSkillSummary"},"title":"Response List Catalog V1 Skill Catalog Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-catalog/taxonomy":{"get":{"tags":["skill-hub"],"summary":"The skill taxonomy tree, in the order the console must render it","description":"Every node of the skill taxonomy in tree order, so the catalog rail can be drawn without a second copy of the tree in the client. Counts are NOT here: they belong to whichever set of skills the caller is looking at, and the catalog listing already carries each skill's path.","operationId":"list_taxonomy_v1_skill_catalog_taxonomy_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/TaxonomyNode"},"title":"Response List Taxonomy V1 Skill Catalog Taxonomy Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-catalog/{slug}":{"get":{"tags":["skill-hub"],"summary":"One skill's title + rendered guide, for the run-timeline peek","description":"Resolves a slug to a skill this caller may read: the audience-visible global catalog first, else a hidden global this workspace has installed and the runtime would actually load, else the workspace's own skill (fenced by the same occupancy rule every installation-id route uses). A slug the platform owns falls through to a same-slug tenant skill UNLESS this workspace has an installed, active, non-killed install of that global row — the same shadow rule the runtime resolves a run's skills by — in which case the GLOBAL is served instead of a 404, on the version the runtime actually runs. Every refusal — unknown, a dark global this workspace never installed shadowing an installed tenant skill's slug, an installed global the runtime would not admit (wrong archetype/provenance, archived, paused, or killed), another member's personal skill, or another tenant's — answers with the same 404, so the response never discloses which one it was.","operationId":"get_catalog_skill_v1_skill_catalog__slug__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":255,"title":"Slug"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogSkillDetail"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-catalog/{slug}/config":{"get":{"tags":["skill-hub"],"summary":"A default-on catalog skill's settings form, readable before it is ever installed","description":"The generic settings surface for a default-enabled portable catalog skill, addressed by SLUG so reading it creates no install row. Returns the field schema (the catalog's active version, never a stale pin — this class's settings follow the catalog the same way its body already does) and the workspace's stored values, empty when there is no row yet.","operationId":"get_catalog_skill_config_v1_skill_catalog__slug__config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"The catalog slug, e.g. `ad-studio`.","title":"Slug"},"description":"The catalog slug, e.g. `ad-studio`."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogSkillConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["skill-hub"],"summary":"Save a default-on catalog skill's settings, creating its install row in the same call","description":"Validate + persist the settings for a default-enabled portable catalog skill, addressed by SLUG. Creates the install row when there is none yet, seeded and saved in ONE transaction — a read-then-install-then-save sequence could leave a created row with no values if the last call failed. Requires skills:edit always, and skills:install only when it must create the row.","operationId":"set_catalog_skill_config_v1_skill_catalog__slug__config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"The catalog slug, e.g. `ad-studio`.","title":"Slug"},"description":"The catalog slug, e.g. `ad-studio`."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillConfigUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogSkillConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-catalog/{slug}/workspace-default":{"put":{"tags":["skill-hub"],"summary":"Turn a default-on catalog skill off for this workspace, or back on","description":"A trusted, listed, portable catalog skill runs for every workspace with NO install row at all. This is how a workspace stops one, and how it gives it back.\n\n`enabled: false` writes the suppressing row (creating the install if there is none) and stamps the pause in ONE transaction. That is why this is a route rather than two client calls: an install row alone does not suppress anything (a never-activated row reads as an unfinished install, deliberately), so a client that installed and then failed the second call would leave the skill running behind a switch drawn as off. The activation route cannot do the second half anyway — a portable skill compiles no activate action.\n\n`enabled: true` DELETES the suppressing row, returning the skill to the exact state a workspace that never touched it is in: running on the catalog's active version. It refuses (409 `SKILL_IS_KILLED`) when a KILLED team row holds the slot: the emergency stop on the skill's own page is what clears that, not this switch. A personal or staff copy answers `changed: false` whatever its state.\n\nBoth directions are idempotent apart from that refusal. Both require skills:install, because this changes what the whole team runs.","operationId":"set_workspace_default_v1_skill_catalog__slug__workspace_default_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":255,"description":"The catalog slug, e.g. `competitor-scan`.","title":"Slug"},"description":"The catalog slug, e.g. `competitor-scan`."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceDefaultRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/WorkspaceDefaultState"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-config-options/channels":{"get":{"tags":["skill-hub"],"summary":"Workspace channels for the settings channel picker","description":"The friendly channel picker's options: the chat channels Patricia can see in this workspace (public + private), so an admin picks a channel by name instead of pasting a raw channel id. Best-effort: an empty list (workspace not connected, or discovery unavailable) tells the picker to fall back to manual entry. Tenant-scoped.","operationId":"list_channel_options_v1_skill_config_options_channels_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ChannelOptionSummary"},"title":"Response List Channel Options V1 Skill Config Options Channels Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations":{"get":{"tags":["skill-hub"],"summary":"List the tenant's skill installations","description":"The Hub cards: every skill this workspace has installed (tenant-scoped).","operationId":"list_installations_v1_skill_installations_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/InstallationSummary"},"title":"Response List Installations V1 Skill Installations Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["skill-hub"],"summary":"Install a skill-platform skill into the tenant","description":"Install a git-catalog skill by its catalog ``slug`` (e.g. ``celebrations``), pinned to the skill's active manifest version with a default config seeded from the manifest's config_fields. A portable skill (which already runs by default from the trusted catalog) comes up ACTIVE — the install is how a workspace customizes or later turns it off, never a prerequisite. A delivery (``sans``) skill is born PAUSED: the admin completes required settings + runs activation review before any delivery. Idempotent per skill: a second install of the same skill is a 409.\n\nEvery install here reaches the whole workspace (there is no personal catalog install), so this route additionally requires skills:install, not just skills:create.","operationId":"install_skill_v1_skill_installations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallSkillRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}":{"get":{"tags":["skill-hub"],"summary":"Get one skill installation","description":"One installation's status header plus the pinned manifest's plain-language overview (what the skill does, the phrases that reach it, what it wants connected, whether it has settings). Tenant-scoped; foreign 404.","operationId":"get_installation_v1_skill_installations__installation_id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["skill-hub"],"summary":"Remove an installed skill from the workspace","description":"Uninstall ONE skill. A skills:delete holder (owner/admin, or a delete-scoped API key) removes ANY install; anyone else may remove only their OWN personal install — a TEAM install answers 403, and another member's personal install already 404s like a missing one (the same fence every installation-id route applies). A hard delete: the install's settings and its occurrence history cascade away with it, and it cannot be undone. A built-in skill is not removable: the route returns 409 and says to pause it instead. For other skills, the skill can be installed again from the catalog, but it comes back unconfigured. For a skill the trusted catalog enables by default, removing the install discards the workspace's override, so the skill returns to running with catalog defaults. Refused with a 409 while another installed skill declares this one as a dependency, so removing it can never leave a kept skill broken.","operationId":"uninstall_installation_v1_skill_installations__installation_id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"Successful Response"},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/activation":{"patch":{"tags":["skill-hub"],"summary":"Activation review: start posting from now","description":"Flip the installation live: sets activated_at/first_live_at, status active, and bumps the projection generation. Past dates will NOT back-send (occurrences before activation are skipped).","operationId":"set_activation_v1_skill_installations__installation_id__activation_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ActivationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/agenda":{"get":{"tags":["skill-hub"],"summary":"The Hub's upcoming scheduled-posts surface","description":"The occurrences that can STILL fire for this installation, by delivery date. Excludes terminal rows (sent/superseded/skipped/dead_letter/delivery_unknown) and past-dated ones, so a fired post never lingers as 'upcoming'. PII-safe (no dates-as-PII).","operationId":"get_installation_agenda_v1_skill_installations__installation_id__agenda_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OccurrenceSummary"},"title":"Response Get Installation Agenda V1 Skill Installations  Installation Id  Agenda Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/config":{"get":{"tags":["skill-hub"],"summary":"The manifest-driven settings form (schema + current values)","description":"The generic settings surface for one installation: the field schema projected from the pinned manifest's config_fields (what to render) + the install's active typed values (what to pre-fill). The dashboard renders friendly non-technical controls from this: no per-skill settings UI.","operationId":"get_installation_config_v1_skill_installations__installation_id__config_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["skill-hub"],"summary":"Save an installation's settings (append a new config version)","description":"Validate + persist the settings an admin set in the form. Only declared config_fields are kept (unknown keys dropped); an invalid value returns a per-field 422. Appends a new config version (append-only history) and bumps the projection generation so the next sweep re-projects. A partial save is allowed (untouched fields keep their value); go-live completeness is enforced on activation. A LIVE delivery skill can't be saved into an undeliverable state (422).","operationId":"update_installation_config_v1_skill_installations__installation_id__config_put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillConfigUpdateRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillConfigResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/fact-solicitations":{"post":{"tags":["skill-hub"],"summary":"Notify selected members to submit their own bound fact (data collection)","description":"The employee data-collection mode (the solicit_fact action). Admin-triggered (skills:edit), selected-members-only: pass an EXPLICIT list of subject actor ids. There is no notify-everyone path and an empty list is a no-op (never an unsolicited blast). The fact must be bound by the installation and accept self-submission. A real DM is attempted for every eligible target on the chat platform they use; if the tenant has no usable installation for that platform, the target is 'would_notify' (nothing sent).","operationId":"solicit_fact_v1_skill_installations__installation_id__fact_solicitations_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolicitFactRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SolicitationResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/kill":{"patch":{"tags":["skill-hub"],"summary":"Kill switch: halt (or resume) this installation's delivery","description":"Set/clear the installation kill switch; the drainer's pre-send re-check skips a killed install. Another member's personal install is not reachable here: it 404s like a missing one, admins included. The workspace's break-glass for one of its OWN authored skills is ``PATCH /authored-skills/{skill_id}/installation/kill``, which stops the skill without disclosing whose install it is.","operationId":"set_kill_v1_skill_installations__installation_id__kill_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/KillRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/people":{"get":{"tags":["skill-hub"],"summary":"The people-table rows for the people_table surface","description":"The Hub's people table: every subject Patricia looks after (the tenant member roster for a person-fact skill, unioned with any subject that already has a resolved fact), pivoted so each bound fact is a column (a 'Sep 6' month/day label when present, empty when awaiting/opted-out) plus a rollup status pill and the next delivery date. COMPLETE (not paginated), bounded by the tenant's headcount, so a member awaiting a date is always present to fill. Generic: the columns come from the installation's compiled fact bindings (person facts for Celebrations, client facts for renewal-reminder). PII-safe: display handles + month/day + status only, never a birth year.","operationId":"get_installation_people_v1_skill_installations__installation_id__people_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PeopleTableResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/preview":{"get":{"tags":["skill-hub"],"summary":"Explainable dry-run preview: why each celebration will / won't fire","description":"The arm-but-don't-fire cockpit: for each subject, whether Patricia WOULD post, the exact deterministic message she WOULD post (display handle only, never a birth date), the local delivery date, and a human-readable reason when it WON'T fire. Computed with the SAME deterministic built-ins the projector uses, so the preview matches what the drainer would do. Posts nothing by construction. PII-safe.","operationId":"preview_installation_v1_skill_installations__installation_id__preview_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationPreviewSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/reconcile-queue":{"get":{"tags":["skill-hub"],"summary":"The delivery_unknown reconcile cockpit","description":"Occurrences whose send was ambiguous (crash-after-send), awaiting admin reconciliation.","operationId":"get_reconcile_queue_v1_skill_installations__installation_id__reconcile_queue_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/OccurrenceSummary"},"title":"Response Get Reconcile Queue V1 Skill Installations  Installation Id  Reconcile Queue Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/stat-cards":{"get":{"tags":["skill-hub"],"summary":"The coverage KPI tiles for the stat_cards surface","description":"The Hub's KPI row VALUES: team-member count + one 'on file' tile per bound fact (with an 'N still to collect' hint) + a 'Next up' tile. Generic: the fact tiles come from the installation's compiled fact bindings, so any skill renders its own facts. PII-safe (counts + a display handle only).","operationId":"get_installation_stat_cards_v1_skill_installations__installation_id__stat_cards_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/StatCardSummary"},"title":"Response Get Installation Stat Cards V1 Skill Installations  Installation Id  Stat Cards Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/surfaces":{"get":{"tags":["skill-hub"],"summary":"The compiled feature bundle that renders this installation","description":"The compiled feature-contract rows the dashboard renders generically: surfaces (keyed by surface_kind_code), their read-model descriptors, the bound actions, and the delivery policy. Proves 'no per-skill UI': the same bundle shape renders every skill.","operationId":"get_installation_surfaces_v1_skill_installations__installation_id__surfaces_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillSurfaceBundle"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/upgrade":{"post":{"tags":["skill-hub"],"summary":"Update an installed skill to its newest published version","description":"Move one installed skill onto the newest published version of that same skill, carrying its settings forward. The install itself is untouched: same skill, same sharing scope, same owner, and a skill that was running stays running while a paused one stays paused. There is no version to pick — the newest published one is the only destination, and going back to an older one is not offered here. ``expected_version_id`` is an optional compare-and-set guard: send back the ``available_version_id`` the page showed, and a version published in the meantime returns 409 rather than applying a different update. A skill that is already up to date is a 409. A LIVE delivery skill whose settings would not carry onto the newer version is a 409 that says so, rather than an upgrade that silently stops it posting.","operationId":"upgrade_installation_route_v1_skill_installations__installation_id__upgrade_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpgradeInstallationRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-installations/{installation_id}/visibility":{"patch":{"tags":["skill-hub"],"summary":"Change an installed skill's sharing scope","description":"Move one installed skill between TEAM (everyone in the workspace can use it) and PERSONAL (only the person who took it). Requires skills:install. ``expected_current`` is a compare-and-set guard: a change that landed first returns 409 instead of clobbering it, and a request whose two scopes are equal is refused (422) rather than silently reassigning ownership. Only an install whose runtime readers enforce ownership can be personal: an ``instructions`` install of any provenance, or a ``skill`` one whose provenance a run can load (git-catalog, platform-admin, or a skill this workspace wrote itself); a ``sans`` install stays shared (400), and so does an install that came from a bundle (400). Sharing a personal install back with the team is always accepted, so read ``can_change_visibility`` on the install rather than deriving either rule again. Another member's personal install is never disclosed: it 404s like a missing one, for admins too. One exception, and it is a DISCLOSURE rule rather than a move rule: an install whose personal owner can no longer reach it is shown to a skills:edit holder so the workspace can recover it, so a caller who may install but not edit gets the same 404 for those rows that everyone else does.","operationId":"set_installation_visibility_v1_skill_installations__installation_id__visibility_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"installation_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Installation Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationVisibilityBody"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/InstallationSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-occurrences/{occurrence_id}/attempts":{"get":{"tags":["skill-hub"],"summary":"An occurrence's delivery attempts","description":"The append-only attempt history (template + receipt ids only, never rendered text).","operationId":"list_occurrence_attempts_v1_skill_occurrences__occurrence_id__attempts_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"occurrence_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Occurrence Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/DeliveryAttemptSummary"},"title":"Response List Occurrence Attempts V1 Skill Occurrences  Occurrence Id  Attempts Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-occurrences/{occurrence_id}/reconcile":{"post":{"tags":["skill-hub"],"summary":"Reconcile an ambiguous (delivery_unknown) occurrence","description":"Confirm whether the ambiguous post was made: posted → sent; not posted → pending (re-attempt).","operationId":"reconcile_occurrence_v1_skill_occurrences__occurrence_id__reconcile_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"occurrence_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Occurrence Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconcileRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OccurrenceSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-ratings/{rating_id}":{"patch":{"tags":["skill-hub"],"summary":"Update your skill rating comment","description":"Replace the comment on one answered skill rating owned by the calling actor.","operationId":"update_skill_rating_comment_v1_skill_ratings__rating_id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"rating_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Rating Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillRatingCommentUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OwnSkillRatingSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-reasons":{"get":{"tags":["skill-hub"],"summary":"The platform reason catalog","description":"The shared worker/UI 'why will / won't fire' vocabulary (platform-owned; not tenant data).","operationId":"list_reasons_v1_skill_reasons_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ReasonSummary"},"title":"Response List Reasons V1 Skill Reasons Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-packs":{"get":{"tags":["skill-packs"],"summary":"List the available skill packs","description":"The catalog of skill packs a workspace can install. A pack bundles several skills; installing it installs each one (plus any skills they depend on). Members that are not yet released to the catalog are not shown. Each pack says whether this workspace already has it.","operationId":"list_skill_packs_v1_skill_packs_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/SkillPackSummary"},"title":"Response List Skill Packs V1 Skill Packs Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-packs/{pack_slug}/install":{"post":{"tags":["skill-packs"],"summary":"Install a skill pack into the workspace","description":"Install every skill in a pack, plus any skills those skills need. Each one arrives paused and pinned to its released version, with default settings, so nothing sends until it is set up and switched on. Skills this workspace already has are left exactly as they are. Installing the same pack twice is safe.\n\nEvery skill a pack installs is TEAM-wide, so this route requires skills:install, not just skills:create.","operationId":"install_skill_pack_v1_skill_packs__pack_slug__install_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_slug","in":"path","required":true,"schema":{"type":"string","description":"The pack's slug.","title":"Pack Slug"},"description":"The pack's slug."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPackInstallResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["skill-packs"],"summary":"Uninstall a skill pack from the workspace","description":"Remove a pack and the skills it brought in. A skill stays if this workspace installed it separately, if another installed pack includes it too, or if a skill that stays needs it. Removing a skill also removes its settings and its history, and cannot be undone.","operationId":"uninstall_skill_pack_v1_skill_packs__pack_slug__install_delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"pack_slug","in":"path","required":true,"schema":{"type":"string","description":"The pack's slug.","title":"Pack Slug"},"description":"The pack's slug."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SkillPackUninstallResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-share-requests":{"post":{"tags":["skill-share-requests"],"summary":"Ask to share your personal skill with the team","description":"Raise a request for one of YOUR OWN personal installs to become team-visible, for someone with skills:edit to approve. Refused with 422 when the skill is already shared with the team, 409 when you already have an open request for it or a decline is still inside its cooldown, and 400 when your account is not matched to a chat profile. An install that is not yours (and another member's private install, which is never disclosed) answers 404.","operationId":"create_skill_share_request_v1_skill_share_requests_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequestCreate"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequestSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-share-requests/{share_request_id}/approve":{"post":{"tags":["skill-share-requests"],"summary":"Approve a skill share request","description":"Approve a pending request: the installation becomes team-visible and loses its personal owner, and the decision is recorded, in one transaction. This is the same move PATCH /skill-installations/{id}/visibility performs directly, so it demands the same authority: skills:install and a signed-in person (API keys are refused). Answers 409 when the request was already decided, when the skill has since been removed, or when it is no longer held by the person who asked, and 404 when the request does not exist or belongs to another workspace.","operationId":"approve_skill_share_request_v1_skill_share_requests__share_request_id__approve_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Share Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequestSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-share-requests/{share_request_id}/deny":{"post":{"tags":["skill-share-requests"],"summary":"Decline a skill share request","description":"Decline a pending request. The skill stays personal and nothing about the install changes; the requester can ask again after the cooldown. Requires skills:edit and a signed-in person. Answers 409 when the request was already decided, and 404 when the request does not exist or belongs to another workspace.","operationId":"deny_skill_share_request_v1_skill_share_requests__share_request_id__deny_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Share Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequestSummary"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skill-share-requests/{share_request_id}/review":{"get":{"tags":["skill-share-requests"],"summary":"Read the exact skill version a share request would share","description":"Read what an open request would hand to the workspace, taken from the installation's PINNED manifest version rather than the skill's newest one, so the content shown is the content that would run even when the author has saved a newer version since asking. Title, semver and description are that pinned version's own, and description is null when the pinned manifest carries none rather than falling back to the skill's current summary. instructions_body is the pinned manifest's markdown body for an instructions skill, and null for a portable skill, whose prose lives in its file bundle rather than its manifest. Includes a renamed_since_pin flag when the skill has been renamed since. Requires skills:edit and a signed-in person (API keys are refused). Answers 404 when the request does not exist, belongs to another workspace, or has already been decided, and 409 when the skill has since been removed or is no longer held by the person who asked.","operationId":"review_skill_share_request_v1_skill_share_requests__share_request_id__review_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"share_request_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Share Request Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ShareRequestReview"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skills":{"get":{"tags":["skills","skills"],"summary":"Search skills","description":"List skills with filtering, sorting, and pagination.","operationId":"list_items_v1_skills_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated skill list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["skills"],"summary":"Create skill","description":"Create a new skill directly. Requires skills:install, not skills:create: the body accepts a caller-chosen status_code, and an active skill is presented workspace-wide on the dashboard, so a caller who holds only skills:create no longer reaches this route at all. That caller's own no-approval lane is /authored-skills/instructions, which is personal until an admin shares it.","operationId":"create_skill_v1_skills_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__CreateValidator"}}}},"responses":{"201":{"description":"The created skill.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skills/{id}":{"get":{"tags":["skills","skills"],"summary":"Get skill","description":"Retrieve a single skill by ID.","operationId":"get_item_v1_skills__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested skill.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["skills","skills"],"summary":"Update skill","description":"Full update (PUT) of a skill.","operationId":"update_item_v1_skills__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__UpdateValidator"}}}},"responses":{"200":{"description":"The updated skill.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["skills","skills"],"summary":"Partial update skill","description":"Partial update (PATCH) of a skill.","operationId":"merge_item_v1_skills__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__MergeValidator"}}}},"responses":{"200":{"description":"The updated skill.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"delete":{"tags":["skills","skills"],"summary":"Delete skill","description":"Soft-delete a skill by ID.","operationId":"delete_item_v1_skills__id__delete","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"204":{"description":"No content."},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skills/{skill_id}/disable":{"post":{"tags":["skills"],"summary":"Disable a skill","description":"Retire a tenant skill so Patricia stops using it (keeps the row; reversible via enable).","operationId":"disable_skill_v1_skills__skill_id__disable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skills/{skill_id}/enable":{"post":{"tags":["skills"],"summary":"Enable a skill","description":"Mark a tenant skill active so Patricia can use it (promotes a proposed/retired skill to active).","operationId":"enable_skill_v1_skills__skill_id__enable_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/skills/{skill_id}/files":{"get":{"tags":["skills"],"summary":"List a skill's files","description":"The SKILL.md and any reference/template/script files for a tenant-owned skill.","operationId":"list_skill_files_v1_skills__skill_id__files_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"skill_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Skill Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/models__brain__SkillFile__FullValidator"},"title":"Response List Skill Files V1 Skills  Skill Id  Files Get"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/spending-limits":{"get":{"tags":["spending-limits"],"summary":"Get the workspace spending limits","description":"Effective per-run budgets (grouped) plus the monthly cap for the caller's workspace, labelling each value as Patricia's recommended default or a workspace override. About the dollar amounts: Usage cost is Patricia's measure of what your work costs to run, not what you paid for your credits.","operationId":"get_spending_limits_v1_spending_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingLimitsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["spending-limits"],"summary":"Update the workspace spending limits","description":"Set the monthly cap and/or per-group per-run limits (a group applies to all its underlying triggers), choose what happens when a run reaches its limit (warn and keep going, the default, or stop the task), or reset everything to Patricia's recommended settings. A reset removes a custom monthly cap; while a cap is active, no per-run limit may exceed it. Changes take effect on the workspace's next run. About the dollar amounts: Usage cost is Patricia's measure of what your work costs to run, not what you paid for your credits.","operationId":"update_spending_limits_v1_spending_limits_patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingLimitsUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SpendingLimitsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/team-introductions":{"get":{"tags":["team-introductions"],"summary":"List teammates Patricia can introduce herself to","description":"The workspace's chat roster with a per-person answer: who Patricia can say hello to, and who she cannot and why. Guests and teammates she has already met are listed but cannot be chosen. Reading this sends nothing.","operationId":"list_team_introductions_v1_team_introductions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamIntroductionListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["team-introductions"],"summary":"Introduce Patricia to selected teammates","description":"Authorize one welcome DM for each explicitly selected teammate who still passes the live workspace, identity, guest, and delivery checks. Refused teammates receive a reason and are not authorized.","operationId":"introduce_team_v1_team_introductions_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamIntroductionRequest"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamIntroductionResult"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/team-requests":{"get":{"tags":["team-requests"],"summary":"List my team's submitted requests","description":"Tenant-scoped, sanitized, read-only list of bug reports and feature requests from every origin, including Slack channels, Slack DMs, Microsoft Teams, web, email, and system reports. Privacy comes from the tenant-safe title and description contract plus the explicit response whitelist.","operationId":"list_team_requests_v1_team_requests_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":100,"title":"Limit"}},{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0,"title":"Offset"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TeamRequestListResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/tenants":{"get":{"tags":["tenants","tenants"],"summary":"Search tenants","description":"List tenants with filtering, sorting, and pagination.","operationId":"list_items_v1_tenants_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated tenant list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"post":{"tags":["tenants","tenants"],"summary":"Create Workspace","description":"Create a new, separate workspace for the authenticated user and return a session scoped to it.\n\nThe deliberate way to a second workspace now that the returning-user guard no longer mints one from an\nunknown Slack. JWT-only (``require_user``) so it works even from a tenant-less pending session; it never\nselects among existing memberships, so it is not the tenant chooser. The required ``Idempotency-Key``\nheader makes a retry safe: the same key returns the SAME workspace (never a duplicate), and reusing a\nkey with a different body is a 409. Adopt the returned token pair to enter the new workspace.","operationId":"create_workspace_v1_tenants_post","security":[{"HTTPBearer":[]}],"parameters":[{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string","minLength":1,"maxLength":255,"title":"Idempotency-Key"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWorkspaceRequest"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TokenResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Email verification required (EMAIL_NOT_VERIFIED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/tenants/{id}":{"get":{"tags":["tenants","tenants"],"summary":"Get tenant","description":"Retrieve a single tenant by ID.","operationId":"get_item_v1_tenants__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"put":{"tags":["tenants","tenants"],"summary":"Update tenant","description":"Full update (PUT) of a tenant.","operationId":"update_item_v1_tenants__id__put","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__UpdateValidator"}}}},"responses":{"200":{"description":"The updated tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}},"patch":{"tags":["tenants","tenants"],"summary":"Partial update tenant","description":"Partial update (PATCH) of a tenant.","operationId":"merge_item_v1_tenants__id__patch","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__MergeValidator"}}}},"responses":{"200":{"description":"The updated tenant.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__identity__Tenant__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"409":{"description":"Conflict","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/tool-definitions":{"get":{"tags":["tool-definitions","tool-definitions"],"summary":"Search tool definitions","description":"List tool definitions with filtering, sorting, and pagination.","operationId":"list_items_v1_tool_definitions_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"ANTLR filter expression","title":"Q"},"description":"ANTLR filter expression"},{"name":"limit","in":"query","required":false,"schema":{"anyOf":[{"type":"integer","maximum":500,"minimum":1},{"type":"null"}],"description":"Page size","title":"Limit"},"description":"Page size"},{"name":"sort_by","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Sort expression (e.g. created_at:desc)","title":"Sort By"},"description":"Sort expression (e.g. created_at:desc)"},{"name":"fields","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Field projection (e.g. id,name)","title":"Fields"},"description":"Field projection (e.g. id,name)"},{"name":"pq","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Pagination cursor query","title":"Pq"},"description":"Pagination cursor query"},{"name":"from_prev","in":"query","required":false,"schema":{"type":"boolean","description":"Backward pagination flag","default":false,"title":"From Prev"},"description":"Backward pagination flag"},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Paginated tool definition list.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__tool__ToolDefinition__SearchValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/tool-definitions/{id}":{"get":{"tags":["tool-definitions","tool-definitions"],"summary":"Get tool definition","description":"Retrieve a single tool definition by ID.","operationId":"get_item_v1_tool_definitions__id__get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Id"}},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"The requested tool definition.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/models__tool__ToolDefinition__FullValidator"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs-stats":{"get":{"tags":["usage"],"summary":"Aggregate run/usage stats","description":"Tenant-scoped run/usage aggregate over a UTC window: a zero-filled timeline, window totals (runs, credits, terminal-only success rate; tokens for internal callers), a by-source split, and, when `compare` is set, the prior window's totals. Usage is reported in credits (metered COGS → whole credits); the raw dollar figure is never surfaced. `start` and `end` are required, timezone-aware ISO-8601 (normalized to UTC); `end` must be after `start` and the window must not exceed 366 days (else 422). Requires `usage:read`.","operationId":"get_runs_stats_v1_runs_stats_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Window start (inclusive). Required, timezone-aware ISO-8601; normalized to UTC.","title":"Start"},"description":"Window start (inclusive). Required, timezone-aware ISO-8601; normalized to UTC."},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Window end (exclusive). Required, timezone-aware ISO-8601; normalized to UTC.","title":"End"},"description":"Window end (exclusive). Required, timezone-aware ISO-8601; normalized to UTC."},{"name":"granularity","in":"query","required":false,"schema":{"$ref":"#/components/schemas/StatsGranularity","description":"Timeline bucket size: day (default) / week / month.","default":"day"},"description":"Timeline bucket size: day (default) / week / month."},{"name":"compare","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/StatsCompare"},{"type":"null"}],"description":"Prior-window selector that populates `previous_totals` (omit for none).","title":"Compare"},"description":"Prior-window selector that populates `previous_totals` (omit for none)."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunStatsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/runs-stats/by-member":{"get":{"tags":["usage"],"summary":"Per-member run/usage breakdown","description":"Tenant-scoped per-member usage over a UTC window: runs and credits (metered COGS → whole credits, never dollars; tokens carried for internal callers) attributed per teammate by the run's actor, most credits first. Runs with no actor (scheduled / system work) collapse into a single null-actor slice the dashboard labels 'Automated'; members with no runs in the window are omitted. `start` and `end` are required, timezone-aware ISO-8601 (normalized to UTC); `end` must be after `start` and the window must not exceed 366 days (else 422). Requires `usage:read`.","operationId":"get_runs_stats_by_member_v1_runs_stats_by_member_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"start","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Window start (inclusive). Required, timezone-aware ISO-8601; normalized to UTC.","title":"Start"},"description":"Window start (inclusive). Required, timezone-aware ISO-8601; normalized to UTC."},{"name":"end","in":"query","required":true,"schema":{"type":"string","format":"date-time","description":"Window end (exclusive). Required, timezone-aware ISO-8601; normalized to UTC.","title":"End"},"description":"Window end (exclusive). Required, timezone-aware ISO-8601; normalized to UTC."},{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RunStatsByMemberResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/usage-limits":{"get":{"tags":["usage-limits"],"summary":"Get the workspace usage against every limit","description":"Every limit the caller's workspace has, with current usage where one applies: monthly spend and per-run budgets, credits, meeting-recording slots and minutes, proactive-reply caps, the bug-report filing cap, the data-retention window, and the reasoning posture. Read-only; each limit is changed on its own settings surface.","operationId":"get_usage_limits_v1_usage_limits_get","security":[{"HTTPBearer":[]}],"parameters":[{"name":"X-Tenant-Id","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Tenant-Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UsageLimitsResponse"}}}},"401":{"description":"Unauthorized","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"400":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"403":{"description":"Forbidden. Inspect response body `code` for the specific reason (for example: PERMISSION_DENIED, EMAIL_NOT_VERIFIED, TENANT_ACCESS_REQUIRED, ROLE_UNRESOLVED)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"404":{"description":"Not found","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}}}}},"/v1/webhooks/attio":{"post":{"tags":["webhooks"],"summary":"Attio Webhook","description":"Verify the Attio signature, enqueue the deal mirror for any Deals ``record.updated``, ACK fast.","operationId":"attio_webhook_v1_webhooks_attio_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Attio Webhook V1 Webhooks Attio Post"}}}}}}},"/v1/webhooks/calcom":{"post":{"tags":["webhooks"],"summary":"Calcom Webhook","description":"Verify the Cal signature, enqueue the booking ingest for a subscribed trigger, ACK fast.","operationId":"calcom_webhook_v1_webhooks_calcom_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Calcom Webhook V1 Webhooks Calcom Post"}}}}}}},"/v1/webhooks/inbound/{capability}":{"post":{"tags":["webhooks"],"summary":"Inbound Event Webhook","description":"Admit one signed event from a workspace's own system, or refuse it.\n\nA followed event commits before its critical broker publish. A broker failure therefore leaves\na durable pending row and returns 503. The sender's retry reaches the tenant/source/event\nconflict and does not publish a second task.","operationId":"inbound_event_webhook_v1_webhooks_inbound__capability__post","parameters":[{"name":"capability","in":"path","required":true,"schema":{"type":"string","title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Inbound Event Webhook V1 Webhooks Inbound  Capability  Post"}}}},"400":{"description":"The JSON payload is invalid or exceeds the body-size limit.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"401":{"description":"The capability or event-source signature is invalid, or the workspace it names has been deleted. Do not retry this delivery.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"The event source has no verifier or usable signing secret, the workspace it names is suspended or cancelled, or the task broker is unavailable. Retry: the endpoint is real and may accept this event later.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"description":"The raw event JSON. Signature verification uses these exact request bytes.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}},"/v1/webhooks/meta/data-deletion":{"post":{"tags":["webhooks"],"summary":"Meta Data Deletion Webhook","description":"Accept one verified Meta deletion request and return its public status capability.","operationId":"meta_data_deletion_webhook_v1_webhooks_meta_data_deletion_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"string"},"type":"object","title":"Response Meta Data Deletion Webhook V1 Webhooks Meta Data Deletion Post"}}}}}}},"/v1/webhooks/pipedream/{capability}":{"post":{"tags":["webhooks"],"summary":"Pipedream Webhook","description":"Authenticate by capability, then record the connected account against its pending intent.","operationId":"pipedream_webhook_v1_webhooks_pipedream__capability__post","parameters":[{"name":"capability","in":"path","required":true,"schema":{"type":"string","title":"Capability"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Pipedream Webhook V1 Webhooks Pipedream  Capability  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/recall":{"post":{"tags":["webhooks"],"summary":"Recall Webhook","description":"Verify the Recall (Svix) signature, enqueue transcript ingest on a ready event, ACK fast.","operationId":"recall_webhook_v1_webhooks_recall_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Recall Webhook V1 Webhooks Recall Post"}}}}}}},"/v1/webhooks/resend":{"post":{"tags":["webhooks"],"summary":"Resend Webhook","description":"Verify, parse, enqueue the deliverability event, ACK.","operationId":"resend_webhook_v1_webhooks_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Response Resend Webhook V1 Webhooks Resend Post"}}}}}}},"/v1/webhooks/slack/events":{"post":{"tags":["webhooks"],"summary":"Slack Events","description":"Verify + ACK (<3s); enqueue normalized events; answer the URL challenge.","operationId":"slack_events_v1_webhooks_slack_events_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Slack Events V1 Webhooks Slack Events Post"}}}}}}},"/v1/webhooks/slack/interactions":{"post":{"tags":["webhooks"],"summary":"Slack Interactions","description":"Verify + ACK (<3s); enqueue an approval resume for button clicks.\n\nFour answer shapes, because Slack reads them differently. A ``block_actions`` click is happy\nwith any 2xx and keeps the ``{\"ok\": true}`` body it has always had. A ``view_submission`` is\nnot: Slack closes the modal only on a 200 with an EMPTY body, and treats a JSON body as a\n``response_action`` instruction, and ``{\"ok\": true}`` names none, so the modal would sit there\nlooking broken. A submission the service could not carry out answers with a real\n``response_action`` — without one the modal closes as though it had worked. And a\n``block_suggestion`` type-ahead request wants neither: it must get its ``{\"options\": [...]}``\nbody back, on every keystroke, or the field simply shows nothing.\n\nThe service decides all four and this route only relays them, INCLUDING the body: composing a\n``response_action`` or an options list here would put user-facing copy in a transport.\n\nallow-long-function: one four-way relay over the answer shapes documented above; splitting it\nwould separate a branch from the Slack behavior it exists to match.","operationId":"slack_interactions_v1_webhooks_slack_interactions_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/webhooks/slack/oauth/callback":{"get":{"tags":["webhooks"],"summary":"Slack Oauth Callback","description":"Verify state (+ browser-binding nonce), exchange the code, persist the install, then\nbounce the browser back to the dashboard page the install started from.\n\nSlack hands the user's browser to this route as a top-level navigation, so both exits\nare redirects: the installer lands back in-app on the page they clicked Connect from,\nflagged ``?slack=connected`` or ``?slack=error``, never on a raw JSON body. The return\npage rides in the signed state (the SPA fetches the install URL over XHR, so a cookie\nset at mint time would never come back), and is resolved BEFORE the exchange so a\nfailure returns to the same page a success would.\n\nThe generic error flag is deliberate: the reason for a failure (an already-claimed\nworkspace, a stale state) never leaks into the URL, matching the Teams callback.\n\nThe installer's IP rides along because the starter-verification gate checks it against our\ncached Tor exit-node list for a multi-member workspace, the only shape a clean verdict can\nwaive. It comes from ``provable_client_ip``, so only a proxy-written forwarded entry is ever\nbelieved: a chain too short to prove one yields no address, which reads as unknown at the\ngate and holds the grant.\n\nThe binder cookie is single-use: it is cleared on the returned response whatever the\noutcome, including a rejection. We build the response explicitly (rather than letting\nan exception propagate) so the ``Set-Cookie`` deletion survives the error path: a\nraised ``AppException`` is rendered by the global handler into a *fresh* response that\nwould not carry a header set on an injected ``Response``.","operationId":"slack_oauth_callback_v1_webhooks_slack_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/slack/oauth/install":{"get":{"tags":["webhooks"],"summary":"Slack Oauth Install","description":"Redirect to Slack's authorize URL with an HMAC-signed, short-TTL marketing state.\n\nThis is the public \"Add to Slack\" entry point for the marketing site. The\nsigned state carries NO ``tenant_id`` so the OAuth callback routes through the\nmarketing-site resolver (``resolve_or_create_workspace``) instead of the\ntenant-attach path. A fresh nonce is sealed into the state AND dropped as an\nHttpOnly cookie; the callback requires the two to match, binding the round-trip\nto this browser (OAuth-CSRF defense). Dashboard-initiated installs (where the\nworkspace must be bound to an existing tenant) use the authenticated\n``POST /v1/integrations/slack/install-url`` endpoint instead, which requires\n``integrations:edit`` and takes the tenant from the bearer token.\n\nThe ad click ids (appended by the marketing site from its stored copies, one\nper major platform, see ``AdClickIdsProps``) are sealed into the signed state\nso the callback can stamp them on the ``platform_installed`` /\n``workspace_created`` funnel events. They are NORMALIZED, never validated:\n``normalize_click_id`` strips and truncates so a junk or over-long value is\ndropped or trimmed. Rejecting one would let an attribution artifact 422 the\npublic install entry point, which must always reach Slack.","operationId":"slack_oauth_install_v1_webhooks_slack_oauth_install_get","parameters":[{"name":"gclid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"}},{"name":"fbclid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid"}},{"name":"ttclid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ttclid"}},{"name":"li_fat_id","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Li Fat Id"}},{"name":"msclkid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Msclkid"}},{"name":"epik","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Epik"}},{"name":"twclid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twclid"}},{"name":"sccid","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sccid"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/webhooks/stripe":{"post":{"tags":["webhooks"],"summary":"Stripe Webhook","description":"Verify the Stripe signature, enqueue the event sync, and ACK fast.","operationId":"stripe_webhook_v1_webhooks_stripe_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Stripe Webhook V1 Webhooks Stripe Post"}}}}}}},"/v1/webhooks/teams/messages":{"post":{"tags":["webhooks"],"summary":"Teams Messages","description":"Verify the Connector JWT + ACK; enqueue a run (message) or resume (card press).\n\nA press on an ``Action.Execute`` button arrives as an ``adaptiveCard/action`` invoke, and\nMicrosoft reads the BODY of this 200 as the answer to it. That is the only way Teams moves\nanything on screen at press time, because the platform hands an interaction no reply address\nand every other answer waits for the worker. The service decides WHICH answer the press earns,\nsince a card replacement and a line to the presser change the screen for different people.","operationId":"teams_messages_v1_webhooks_teams_messages_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Teams Messages V1 Webhooks Teams Messages Post"}}}}}}},"/v1/webhooks/teams/oauth/callback":{"get":{"tags":["webhooks"],"summary":"Teams Oauth Callback","description":"Azure AD consent redirect: verify state, redeem the code, persist the install, then\nbounce the browser back to the dashboard with a success/error flag (so the admin lands\nin-app, not on raw JSON).\n\nThe page it bounces to rides in the signed state, narrowed to an exact allowlist, and falls\nback to workspace settings.\n\nAzure also sends ``tenant`` / ``admin_consent`` query params; they are intentionally not\nconsumed: the tenant is taken from the verified code exchange, not the redirect.","operationId":"teams_oauth_callback_v1_webhooks_teams_oauth_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}}},"components":{"schemas":{"AbandonedRevokeClearance":{"properties":{"upstream_confirmed_revoked":{"type":"boolean","title":"Upstream Confirmed Revoked","description":"True when the operator verified in the provider's own console that the credential is gone. False records nothing and clears nothing, because an unconfirmed abandoned row already reports itself: kill the credential first, then call this."}},"type":"object","required":["upstream_confirmed_revoked"],"title":"AbandonedRevokeClearance","description":"The one fact this route records: the operator watched the credential die at the provider.\n\nRequired rather than defaulted, and the only accepted answer is ``true``. This route writes a\nmoney statement and nothing else, so a default would answer that question on the operator's\nbehalf, and ``false`` asks it to record a confirmation nobody made.\n\nThere is deliberately no \"I accept this leak\" arm, unlike the dead-letter clearance. That route\noffers one because it must lift an access fence either way; here the row is already exactly what\nan accepted leak looks like, so accepting one is the act of doing nothing."},"AbandonedRevokeClearanceRefusal":{"type":"string","enum":["upstream_not_confirmed","not_abandoned","live_debt_exists","too_recent"],"title":"AbandonedRevokeClearanceRefusal","description":"Why an abandoned-revoke clearance did not take. DERIVED at the point of refusal, never stored.\n\n- ``UPSTREAM_NOT_CONFIRMED``: the request itself declined to confirm the kill. This route only\n  records a confirmation, so there was nothing to write. Kill the credential in the provider's\n  own console first, then call again.\n- ``NOT_ABANDONED``: the row is not an abandoned revoke. It is live, or it already carries an\n  outcome, or an earlier clearance already recorded one. Nothing to do.\n- ``LIVE_DEBT_EXISTS``: a non-terminal outbox debt is still owed on the credential, so a worker\n  may yet kill it. The leak report shows this account as ``owned``. Wait for that debt to settle.\n- ``TOO_RECENT``: the row is abandoned in shape but too young to be treated as abandoned in fact.\n  A disconnect commits this exact marker BEFORE it calls the provider, so a call that is still\n  running looks identical. Wait, then re-run the leak report."},"AbandonedRevokeClearanceResult":{"properties":{"account":{"type":"string","title":"Account"},"tenant_id":{"type":"string","title":"Tenant Id"},"cleared":{"type":"boolean","title":"Cleared","description":"False when the clearance did not take; see ``refusal`` for why."},"refusal":{"anyOf":[{"$ref":"#/components/schemas/AbandonedRevokeClearanceRefusal"},{"type":"null"}],"description":"Why the clearance did not take. Null when ``cleared`` is true. The values are described on the AbandonedRevokeClearanceRefusal schema. Read as a hint, not a verdict: every value except ``upstream_not_confirmed`` is measured just after the write rather than inside it, so a debt that settles in that instant can shift which one is reported. ``cleared`` is the record of what happened."},"still_reported_as_orphaned":{"type":"boolean","title":"Still Reported As Orphaned","description":"True when the account remains on the COGS orphan report, either because the row was not this route's to clear or because it never reached the write."}},"type":"object","required":["account","tenant_id","cleared","still_reported_as_orphaned"],"title":"AbandonedRevokeClearanceResult","description":"What the operator's clearance did.\n\n``cleared`` is exact. ``refusal`` says which of four conditions stopped it, and each one is a\ndifferent next action: nothing to do, kill it at the provider first, wait for a worker, or wait\nfor a disconnect. Reported rather than raised, so a double-click is an honest no-op."},"AcceptResponse":{"properties":{"suggestion_id":{"type":"string","format":"uuid","title":"Suggestion Id"},"group_id":{"type":"string","format":"uuid","title":"Group Id"},"status":{"type":"string","title":"Status"},"linked_count":{"type":"integer","title":"Linked Count"}},"type":"object","required":["suggestion_id","group_id","status","linked_count"],"title":"AcceptResponse","description":"Result of accepting a suggestion."},"AccountToolConsent":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"audience_class":{"$ref":"#/components/schemas/AudienceClass"},"audience_label":{"type":"string","title":"Audience Label"},"state":{"$ref":"#/components/schemas/ToolOverrideState"}},"type":"object","required":["id","audience_class","audience_label","state"],"title":"AccountToolConsent","description":"One stored per-tool consent the viewing member holds on an action, whatever its class or state."},"AccountToolSummary":{"properties":{"name":{"type":"string","title":"Name"},"display_name":{"type":"string","title":"Display Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"risk_tier_code":{"type":"string","title":"Risk Tier Code"},"gate":{"type":"string","enum":["auto","ask"],"title":"Gate"},"ordinary_write":{"type":"boolean","title":"Ordinary Write","default":false},"locked":{"type":"boolean","title":"Locked"},"enabled":{"type":"boolean","title":"Enabled"},"personal_choice":{"anyOf":[{"type":"string","enum":["ask","block"]},{"type":"null"}],"title":"Personal Choice"},"tool_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Ref"},"override_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Override Id"},"override_eligible":{"type":"boolean","title":"Override Eligible","default":false},"override_ineligible_reason":{"anyOf":[{"$ref":"#/components/schemas/OverrideIneligibleReason"},{"type":"null"}]},"override_needs_reconfirmation":{"type":"boolean","title":"Override Needs Reconfirmation","default":false},"override_granted_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Override Granted Tier"},"override_stored_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Override Stored Id"},"overrides":{"items":{"$ref":"#/components/schemas/AccountToolConsent"},"type":"array","title":"Overrides","default":[]},"model_chosen_route":{"type":"boolean","title":"Model Chosen Route","default":false},"consent_token":{"type":"string","title":"Consent Token"}},"type":"object","required":["name","display_name","risk_tier_code","gate","locked","enabled","consent_token"],"title":"AccountToolSummary","description":"One tool (provider action) Patricia can take through a connected account, with its behavior FOR YOU.\n\nRead-only projection, and deliberately PER-VIEWER: two members of the same workspace can see\ndifferent values on the same row of a shared connection, because each one's own approval policy\nand per-tool overrides shape it. ``locked`` is the exception and stays account-level — it marks a\nfloor that belongs to the ACTION rather than to any viewer."},"AccountToolsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AccountToolSummary"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AccountToolsResponse"},"ActivationRequest":{"properties":{"activated":{"type":"boolean","title":"Activated","default":true}},"type":"object","title":"ActivationRequest","description":"Activation review: flip the installation live from now (past dates won't back-send)."},"ActiveRecordingView":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The meeting's title, when one was given."},"platform":{"type":"string","title":"Platform","description":"The meeting platform (e.g. 'Zoom', 'Google Meet'), or 'the meeting'."},"status":{"type":"string","title":"Status","description":"Lifecycle status: 'requested' (joining) or 'recording' (in the call)."},"started_at":{"type":"string","format":"date-time","title":"Started At","description":"When the recording was requested (bot dispatched)."},"requested_by_run":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requested By Run","description":"The agent run that requested this recording, when known."}},"type":"object","required":["id","platform","status","started_at"],"title":"ActiveRecordingView","description":"One in-flight recording (bot dispatched or recording) shown in the usage surface."},"ActorDirectoryRow":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"platform_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Code"},"kind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind Code"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"ActorDirectoryRow","description":"Row shape returned by the directory query.\n\nAll fields optional so ``fields=`` projection validates (runflow pattern)."},"ActorKind":{"type":"string","enum":["human","bot","system"],"title":"ActorKind"},"ActorKindRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ActorKindRefReferenceFullValidator"},"ActorTimezoneBody":{"properties":{"timezone":{"type":"string","maxLength":64,"title":"Timezone"},"source":{"type":"string","enum":["user_provided","browser_detected"],"title":"Source","default":"user_provided"}},"additionalProperties":false,"type":"object","required":["timezone"],"title":"ActorTimezoneBody","description":"Request body for ``PUT /actor-preferences/timezone`` — always the caller's own actor.\n``source`` defaults to ``user_provided``; only that and ``browser_detected`` are accepted."},"ActorTimezoneResponse":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"timezone_source":{"anyOf":[{"$ref":"#/components/schemas/ActorTimezoneSource"},{"type":"null"}]}},"type":"object","required":["actor_id","timezone","timezone_source"],"title":"ActorTimezoneResponse","description":"An actor's stored timezone and where it came from."},"ActorTimezoneSource":{"type":"string","enum":["slack_profile","google_calendar","user_provided","browser_detected","chat_client"],"title":"ActorTimezoneSource","description":"Where an actor's stored IANA ``timezone`` came from. ``SLACK_PROFILE``/``GOOGLE_CALENDAR``/\n``BROWSER_DETECTED``/``CHAT_CLIENT`` are write-once (``services.actor_timezone.write_actor_timezone_if_unset``\nnever displaces one resolver's write with another's); ``USER_PROVIDED`` is the one exception,\nsince a person's own save (``repositories.actor.ActorRepository.set_timezone_user_provided``)\nalways overwrites."},"AdAnomalyWatchConfig":{"properties":{"accounts":{"items":{"type":"string"},"type":"array","title":"Accounts","description":"The ad accounts to watch, each exactly as the read lists it, for example \"google_ads 1234567890\". An empty list watches the default account of every connected ad platform."},"platform_goals":{"additionalProperties":{"$ref":"#/components/schemas/PlatformGoal"},"propertyNames":{"enum":["google_ads","meta","linkedin"]},"type":"object","title":"Platform Goals","description":"Per platform (\"google_ads\", \"meta\", \"linkedin\"): the result that counts, the goal, and the day the counted result changed. Sending it replaces every platform's entry, so include the unchanged ones."},"campaign_goals":{"items":{"$ref":"#/components/schemas/CampaignGoal"},"type":"array","title":"Campaign Goals","description":"Campaigns with their own goal. Sending it replaces the whole list."},"brand_terms":{"items":{"type":"string"},"type":"array","title":"Brand Terms","description":"The advertiser's own name and its spellings. Google Ads searches with one are read apart from the others. An empty list uses the account and workspace names."},"proposal_hold_until":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Proposal Hold Until","description":"A day (YYYY-MM-DD). Until then the watch flags but suggests no budget or bid change. Null clears it."},"drift_percent":{"type":"integer","title":"Drift Percent","description":"How much worse CPA or ROAS must be, last 7 complete days against the 7 before, to flag. 10 to 100.","default":25},"min_conversions":{"type":"integer","title":"Min Conversions","description":"Below this count of counted results in either window, a CPA or ROAS change is too thin to judge. 5 to 500.","default":20},"spike_percent":{"type":"integer","title":"Spike Percent","description":"How far above the normal daily spend one day must be to flag. 100 means twice the norm. 30 to 500.","default":100},"mention":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mention","description":"A person or group named on critical alerts only. Null mentions nobody."},"quiet_days":{"type":"string","enum":["silent","weekly_note"],"title":"Quiet Days","description":"\"silent\" posts nothing on a day with nothing wrong. \"weekly_note\" also posts one line each Monday.","default":"weekly_note"}},"additionalProperties":false,"type":"object","title":"AdAnomalyWatchConfig","description":"The settings a person chose for the watch. Every field has a default that needs no answer."},"AdminAccountSyncResult":{"properties":{"status":{"type":"string","title":"Status","default":"queued"},"account":{"type":"string","title":"Account"},"tenant_id":{"type":"string","title":"Tenant Id"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"Broker task id for the queued sync, for tracing its worker logs."}},"type":"object","required":["account","tenant_id"],"title":"AdminAccountSyncResult","description":"Queued tool-catalog sync for one connected integration account.\n\n``status`` is only ever ``queued`` because the dispatch is ``critical``: a broker that refused the\nwork raises before this model is built, so the operator gets a 503 rather than a receipt to wait on."},"AdminActorRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"unavailable":{"type":"boolean","title":"Unavailable","default":false}},"additionalProperties":false,"type":"object","required":["id","display_name"],"title":"AdminActorRef"},"AdminAutomationOption":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"}},"additionalProperties":false,"type":"object","required":["key","title"],"title":"AdminAutomationOption","description":"One built-in automation the Automation filter offers."},"AdminBootstrapResponse":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"email":{"type":"string","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"is_internal":{"type":"boolean","title":"Is Internal"},"environment":{"type":"string","title":"Environment"},"dashboard_url":{"type":"string","title":"Dashboard Url"}},"additionalProperties":false,"type":"object","required":["user_id","email","first_name","last_name","is_internal","environment","dashboard_url"],"title":"AdminBootstrapResponse","description":"Current staff identity, API environment, and where the dashboard lives."},"AdminChatStyleResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"source":{"anyOf":[{"type":"string","enum":["learned","edited"]},{"type":"null"}],"title":"Source","description":"Where the saved chat style came from, or null if none is saved."}},"type":"object","required":["enabled","source"],"title":"AdminChatStyleResponse"},"AdminChatStyleUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"AdminChatStyleUpdate"},"AdminConsoleApproval":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"},"status":{"type":"string","title":"Status"},"tool_label":{"type":"string","title":"Tool Label"},"title":{"type":"string","title":"Title"},"body":{"type":"string","title":"Body"}},"type":"object","required":["id","run_id","status","tool_label","title","body"],"title":"AdminConsoleApproval","description":"One approval raised by a console-chat run, decidable inline in the admin transcript."},"AdminConsoleApprovalDecision":{"properties":{"status":{"type":"string","title":"Status"},"permission_request_id":{"type":"string","format":"uuid","title":"Permission Request Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"},"approved":{"type":"boolean","title":"Approved"}},"type":"object","required":["status","permission_request_id","run_id","approved"],"title":"AdminConsoleApprovalDecision","description":"Acknowledgement that an admin's approval decision was accepted for async resume."},"AdminConsoleMemoryBulkItem":{"properties":{"description":{"type":"string","title":"Description"},"body":{"type":"string","title":"Body"}},"additionalProperties":false,"type":"object","required":["description","body"],"title":"AdminConsoleMemoryBulkItem","description":"One row of a parsed bulk import, before it is checked against existing memory.\n\nCarries no length or blankness constraint: a per-field Pydantic bound would fail the WHOLE\nrequest over one bad row. ``_plan_bulk_memory_item`` rejects those per item instead."},"AdminConsoleMemoryBulkRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminConsoleMemoryBulkItem"},"type":"array","maxItems":50,"minItems":1,"title":"Items"},"on_conflict":{"type":"string","enum":["skip","overwrite"],"title":"On Conflict","default":"skip"}},"additionalProperties":false,"type":"object","required":["items"],"title":"AdminConsoleMemoryBulkRequest","description":"Up to ``ADMIN_CONSOLE_MEMORY_BULK_MAX_ITEMS`` items to import for the selected tenant.\n\nThe frontend chunks a larger import into several requests this size, so the cap here is a\ntransport limit, not a product one — see ``ADMIN_CONSOLE_MEMORY_BULK_MAX_ITEMS``."},"AdminConsoleMemoryBulkResponse":{"properties":{"results":{"items":{"$ref":"#/components/schemas/AdminConsoleMemoryBulkResult"},"type":"array","title":"Results"}},"type":"object","required":["results"],"title":"AdminConsoleMemoryBulkResponse","description":"Every bulk-import item's outcome, in request order."},"AdminConsoleMemoryBulkResult":{"properties":{"index":{"type":"integer","title":"Index"},"status":{"type":"string","enum":["created","overwritten","skipped","rejected"],"title":"Status"},"item":{"anyOf":[{"$ref":"#/components/schemas/AdminConsoleMemoryItem"},{"type":"null"}]},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["index","status"],"title":"AdminConsoleMemoryBulkResult","description":"One bulk-import item's outcome, independent of its siblings' outcomes."},"AdminConsoleMemoryCreateRequest":{"properties":{"content":{"type":"string","maxLength":2000,"minLength":1,"title":"Content"},"kind":{"$ref":"#/components/schemas/MemoryKind","default":"fact"}},"additionalProperties":false,"type":"object","required":["content"],"title":"AdminConsoleMemoryCreateRequest","description":"One thing an operator asks Patricia to remember for the selected tenant."},"AdminConsoleMemoryForgetResult":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"}},"type":"object","required":["id"],"title":"AdminConsoleMemoryForgetResult","description":"Acknowledgement that one org memory was forgotten."},"AdminConsoleMemoryItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"content":{"type":"string","title":"Content"},"kind_code":{"type":"string","title":"Kind Code"},"kind_label":{"type":"string","title":"Kind Label"},"source":{"type":"string","title":"Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","content","kind_code","kind_label","source","created_at"],"title":"AdminConsoleMemoryItem","description":"One workspace-wide org memory shown in the admin console memory panel."},"AdminConsoleMemoryList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminConsoleMemoryItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AdminConsoleMemoryList","description":"An operator-selected tenant's org memory, newest first."},"AdminConsoleMessage":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"role":{"type":"string","title":"Role"},"content":{"type":"string","title":"Content"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"approvals":{"items":{"$ref":"#/components/schemas/AdminConsoleApproval"},"type":"array","title":"Approvals"}},"type":"object","required":["id","role","content","created_at"],"title":"AdminConsoleMessage","description":"A minimal operator transcript message."},"AdminConsoleTranscriptResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminConsoleMessage"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AdminConsoleTranscriptResponse","description":"The operator's recent messages in one selected tenant."},"AdminConversationRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title"},"platform_code":{"type":"string","title":"Platform Code"},"kind_code":{"type":"string","title":"Kind Code"},"unavailable":{"type":"boolean","title":"Unavailable","default":false}},"additionalProperties":false,"type":"object","required":["id","title","platform_code","kind_code"],"title":"AdminConversationRef"},"AdminCreditAdjustmentList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminCreditAdjustmentRead"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["items","count"],"title":"AdminCreditAdjustmentList"},"AdminCreditAdjustmentRead":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount","description":"Signed requested credits (positive = add)."},"applied_credits":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Applied Credits","description":"Signed credits actually moved on the COGS ledger."},"applied_retail_micro_usd":{"type":"integer","title":"Applied Retail Micro Usd","description":"Signed micro-USD moved on the legacy retail ledger."},"balance_after":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Balance After"},"retail_balance_after_micro_usd":{"type":"integer","title":"Retail Balance After Micro Usd"},"reason":{"type":"string","title":"Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"created_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Email","description":"Admin's email when the principal was a user."},"created_by_principal_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Principal Type"},"replayed":{"type":"boolean","title":"Replayed","description":"True when this response replays a previous idempotency claim.","default":false}},"type":"object","required":["id","amount","applied_credits","applied_retail_micro_usd","balance_after","retail_balance_after_micro_usd","reason","created_at"],"title":"AdminCreditAdjustmentRead","description":"One applied (or replayed) adjustment, with both ledgers' outcome."},"AdminMeetingLimitsUpdate":{"properties":{"max_concurrent_bots":{"anyOf":[{"type":"integer","maximum":100.0,"minimum":0.0},{"type":"null"}],"title":"Max Concurrent Bots"},"monthly_minutes_budget":{"anyOf":[{"type":"integer","maximum":20000.0,"minimum":0.0},{"type":"null"}],"title":"Monthly Minutes Budget"},"expected_revision":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expected Revision","description":"The revision this edit was based on, from GET (an offset-aware timestamp). Send null if that reported no row. A 409 means someone else changed it first: reload and re-apply."}},"additionalProperties":false,"type":"object","required":["expected_revision"],"title":"AdminMeetingLimitsUpdate","description":"PUT body: an omitted field is left alone, an explicit ``null`` CLEARS the override.\n\nThe three states are the point. ``max_concurrent_bots`` is nullable in the database precisely so a\ntenant can inherit ``API_RECALL_MAX_CONCURRENT_BOTS_DEFAULT`` rather than be pinned to whatever it\nhappened to equal on the day someone edited it — sending ``null`` puts a tenant back on the default\nand keeps it moving with future default changes. ``model_fields_set`` on the handler is what\nseparates \"omitted\" from \"explicitly null\"; a plain ``None`` default cannot."},"AdminMeetingLimitsView":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"max_concurrent_bots":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Concurrent Bots","description":"This tenant's override, or null when it inherits."},"monthly_minutes_budget":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Minutes Budget","description":"This tenant's override, or null when it inherits."},"default_max_concurrent_bots":{"type":"integer","title":"Default Max Concurrent Bots","description":"The fleet default an override-less tenant inherits."},"default_monthly_minutes_budget":{"type":"integer","title":"Default Monthly Minutes Budget","description":"The fleet default an override-less tenant inherits."},"effective_max_concurrent_bots":{"type":"integer","title":"Effective Max Concurrent Bots","description":"What the pre-join gate actually enforces today."},"effective_monthly_minutes_budget":{"type":"integer","title":"Effective Monthly Minutes Budget","description":"What the pre-join gate actually enforces today."},"revision":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revision","description":"Opaque token for this row's state; send it back as expected_revision to edit safely."}},"type":"object","required":["tenant_id","max_concurrent_bots","monthly_minutes_budget","default_max_concurrent_bots","default_monthly_minutes_budget","effective_max_concurrent_bots","effective_monthly_minutes_budget"],"title":"AdminMeetingLimitsView","description":"The three-layer readout: the override, the inherited default, and what the gate enforces.\n\nAn operator about to change a cap needs to know whether the number on screen is this tenant's own\nor the fleet default it is currently inheriting, because clearing an override and setting it to the\nsame value look identical afterwards but behave differently the next time the default moves."},"AdminMemberMergeCarriedItem":{"properties":{"table":{"type":"string","title":"Table"},"column":{"type":"string","title":"Column"},"row_count":{"type":"integer","title":"Row Count"}},"type":"object","required":["table","column","row_count"],"title":"AdminMemberMergeCarriedItem","description":"One group of rows that the merge plan moves."},"AdminMemberMergePreview":{"properties":{"allowed":{"type":"boolean","title":"Allowed"},"evidence_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence Code"},"refusal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refusal Code"},"operator_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Operator Email"},"detail":{"additionalProperties":true,"type":"object","title":"Detail"},"emails_gained":{"items":{"type":"string"},"type":"array","title":"Emails Gained"},"chat_identity_moves":{"type":"boolean","title":"Chat Identity Moves","default":false},"rows_moved":{"type":"integer","title":"Rows Moved","default":0},"carried":{"items":{"$ref":"#/components/schemas/AdminMemberMergeCarriedItem"},"type":"array","title":"Carried"}},"type":"object","required":["allowed"],"title":"AdminMemberMergePreview","description":"The current verdict and the full carry plan."},"AdminMemberMergeRequest":{"properties":{"surviving_membership_id":{"type":"string","format":"uuid","title":"Surviving Membership Id","description":"The member who remains active."},"retiring_membership_id":{"type":"string","format":"uuid","title":"Retiring Membership Id","description":"The duplicate member that becomes inactive."},"reason":{"type":"string","maxLength":500,"minLength":10,"title":"Reason"}},"additionalProperties":false,"type":"object","required":["surviving_membership_id","retiring_membership_id","reason"],"title":"AdminMemberMergeRequest","description":"Two tenant-bound members and the staff operator's reason."},"AdminMemberMergeResult":{"properties":{"merge_id":{"type":"string","format":"uuid","title":"Merge Id"},"surviving_membership_id":{"type":"string","format":"uuid","title":"Surviving Membership Id"},"retiring_membership_id":{"type":"string","format":"uuid","title":"Retiring Membership Id"},"evidence_code":{"type":"string","title":"Evidence Code"},"rows_moved":{"type":"integer","title":"Rows Moved"},"emails_gained":{"items":{"type":"string"},"type":"array","title":"Emails Gained"}},"type":"object","required":["merge_id","surviving_membership_id","retiring_membership_id","evidence_code","rows_moved"],"title":"AdminMemberMergeResult","description":"The attributed merge record and its carry totals."},"AdminMemberRoleUpdate":{"properties":{"role_code":{"$ref":"#/components/schemas/Role","description":"The role to give this member."},"reason":{"type":"string","maxLength":500,"minLength":10,"title":"Reason","description":"Why the role is being changed. Stored on the audit row."}},"additionalProperties":false,"type":"object","required":["role_code","reason"],"title":"AdminMemberRoleUpdate","description":"A staff cross-tenant role change: the new role plus the operator's reason.\n\n``reason`` is required and stored on the audit row. A cross-tenant access change whose record\ncannot say WHY it happened is only half a record, and this route is the supported replacement\nfor a hand-written database update, which said nothing at all."},"AdminMessageItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"role":{"type":"string","title":"Role"},"author":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"token_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Token Count"},"content_length":{"type":"integer","title":"Content Length"},"has_platform_coordinates":{"type":"boolean","title":"Has Platform Coordinates"}},"additionalProperties":false,"type":"object","required":["id","role","created_at","content_length","has_platform_coordinates"],"title":"AdminMessageItem"},"AdminMessageList":{"properties":{"audit_id":{"type":"string","format":"uuid","title":"Audit Id"},"items":{"items":{"$ref":"#/components/schemas/AdminMessageItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["audit_id","items"],"title":"AdminMessageList"},"AdminPermissionRequestItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tool_name":{"type":"string","title":"Tool Name"},"risk_tier_code":{"type":"string","title":"Risk Tier Code"},"status_code":{"type":"string","title":"Status Code"},"decision":{"type":"string","title":"Decision"},"decider":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"reason":{"type":"null","title":"Reason","description":"The current permission-request model stores no decision reason."},"input_present":{"type":"boolean","title":"Input Present"},"input_byte_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Byte Size"},"pending_snapshot_present":{"type":"boolean","title":"Pending Snapshot Present"},"pending_snapshot_byte_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Pending Snapshot Byte Size"},"execution_claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Execution Claimed At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","tool_name","risk_tier_code","status_code","decision","input_present","pending_snapshot_present","created_at"],"title":"AdminPermissionRequestItem"},"AdminPermissionRequestList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminPermissionRequestItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["items"],"title":"AdminPermissionRequestList"},"AdminPerson":{"properties":{"email":{"type":"string","title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"is_internal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Internal"},"has_dashboard_login":{"type":"boolean","title":"Has Dashboard Login","default":false},"teams":{"items":{"$ref":"#/components/schemas/AdminPersonTeam"},"type":"array","title":"Teams"}},"type":"object","required":["email","teams"],"title":"AdminPerson","description":"One person (keyed by email) across every team they belong to."},"AdminPersonAuditEntry":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"action":{"type":"string","title":"Action"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","tenant_id","action","created_at"],"title":"AdminPersonAuditEntry"},"AdminPersonDetail":{"properties":{"person":{"$ref":"#/components/schemas/AdminPerson"},"recent_runs":{"items":{"$ref":"#/components/schemas/AdminPersonRun"},"type":"array","title":"Recent Runs"},"recent_audit":{"items":{"$ref":"#/components/schemas/AdminPersonAuditEntry"},"type":"array","title":"Recent Audit"}},"type":"object","required":["person","recent_runs","recent_audit"],"title":"AdminPersonDetail","description":"Everything the cockpit shows about one person."},"AdminPersonList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminPerson"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["items","count"],"title":"AdminPersonList"},"AdminPersonRun":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"tenant_display_name":{"type":"string","title":"Tenant Display Name"},"status_code":{"type":"string","title":"Status Code"},"trigger_code":{"type":"string","title":"Trigger Code"},"credits":{"type":"integer","title":"Credits","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","tenant_id","tenant_display_name","status_code","trigger_code","created_at"],"title":"AdminPersonRun","description":"A run in the person detail, with the team it happened in."},"AdminPersonTeam":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"tenant_display_name":{"type":"string","title":"Tenant Display Name"},"role_code":{"type":"string","title":"Role Code"},"status_code":{"type":"string","title":"Status Code"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},"type":"object","required":["membership_id","tenant_id","tenant_display_name","role_code","status_code","joined_at"],"title":"AdminPersonTeam","description":"One team a person belongs to, with their role there."},"AdminProactiveProgramListResponse":{"properties":{"programs":{"items":{"$ref":"#/components/schemas/AdminProactiveProgramResponse"},"type":"array","title":"Programs"}},"type":"object","required":["programs"],"title":"AdminProactiveProgramListResponse","description":"Every live program row for one tenant."},"AdminProactiveProgramResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"program_type_code":{"type":"string","title":"Program Type Code"},"mode_code":{"type":"string","title":"Mode Code"},"enabled":{"type":"boolean","title":"Enabled"},"schedule":{"type":"string","title":"Schedule"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"paused_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Paused Reason"},"paused_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Paused At"},"consecutive_failures":{"type":"integer","title":"Consecutive Failures"},"scope":{"additionalProperties":true,"type":"object","title":"Scope"}},"type":"object","required":["id","tenant_id","program_type_code","mode_code","enabled","schedule","next_run_at","last_run_at","paused_reason","paused_at","consecutive_failures","scope"],"title":"AdminProactiveProgramResponse","description":"One tenant program row as staff see it, including why it is dormant."},"AdminProactiveSendDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"team":{"$ref":"#/components/schemas/AdminTeamRef"},"actor":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"automation_key":{"type":"string","title":"Automation Key"},"automation_title":{"type":"string","title":"Automation Title"},"outcome":{"$ref":"#/components/schemas/SendOutcome"},"silence_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Silence Reason"},"reaction":{"anyOf":[{"$ref":"#/components/schemas/Reaction"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"status_code":{"type":"string","title":"Status Code"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"additionalProperties":false,"type":"object","required":["id","team","automation_key","automation_title","outcome","created_at","status_code"],"title":"AdminProactiveSendDetail"},"AdminProactiveSendItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"team":{"$ref":"#/components/schemas/AdminTeamRef"},"actor":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"automation_key":{"type":"string","title":"Automation Key"},"automation_title":{"type":"string","title":"Automation Title"},"outcome":{"$ref":"#/components/schemas/SendOutcome"},"silence_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Silence Reason"},"reaction":{"anyOf":[{"$ref":"#/components/schemas/Reaction"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"message_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Excerpt"}},"additionalProperties":false,"type":"object","required":["id","team","automation_key","automation_title","outcome","created_at"],"title":"AdminProactiveSendItem"},"AdminProactiveSendListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminProactiveSendItem"},"type":"array","title":"Items"},"automation_options":{"items":{"$ref":"#/components/schemas/AdminAutomationOption"},"type":"array","title":"Automation Options"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["items","automation_options"],"title":"AdminProactiveSendListResponse"},"AdminRecentRun":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status_code":{"type":"string","title":"Status Code"},"trigger_code":{"type":"string","title":"Trigger Code"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"credits":{"type":"integer","title":"Credits","description":"Whole credits this run consumed.","default":0},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"actor_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Display Name"}},"type":"object","required":["id","status_code","trigger_code","created_at"],"title":"AdminRecentRun","description":"One recent run, attributed to the human who triggered it."},"AdminRequestDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"team":{"$ref":"#/components/schemas/AdminTeamRef"},"reporter":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"source":{"type":"string","title":"Source"},"intake_kind":{"type":"string","title":"Intake Kind"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"summary":{"type":"string","title":"Summary"},"platform_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Code"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"thread_ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Ts"},"message_ts":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Ts"},"permalink":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Permalink"},"processing":{"$ref":"#/components/schemas/AdminRequestProcessing"},"triage":{"$ref":"#/components/schemas/AdminRequestTriage"},"linear":{"$ref":"#/components/schemas/AdminRequestLinear"},"duplicates":{"$ref":"#/components/schemas/AdminRequestDuplicates"},"related_run":{"anyOf":[{"$ref":"#/components/schemas/AdminRunRef"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["id","team","source","intake_kind","summary","processing","triage","linear","duplicates","created_at","updated_at"],"title":"AdminRequestDetail"},"AdminRequestDuplicates":{"properties":{"parent":{"anyOf":[{"$ref":"#/components/schemas/AdminRequestRef"},{"type":"null"}]},"children":{"items":{"$ref":"#/components/schemas/AdminRequestRef"},"type":"array","title":"Children"}},"additionalProperties":false,"type":"object","required":["children"],"title":"AdminRequestDuplicates"},"AdminRequestLinear":{"properties":{"issue_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issue Id"},"issue_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issue Url"},"issue_identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issue Identifier"},"state_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Type"},"state_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"State Checked At"}},"additionalProperties":false,"type":"object","title":"AdminRequestLinear"},"AdminRequestListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"team":{"$ref":"#/components/schemas/AdminTeamRef"},"reporter":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"source":{"type":"string","title":"Source"},"intake_kind":{"type":"string","title":"Intake Kind"},"status_code":{"type":"string","title":"Status Code"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"summary":{"type":"string","title":"Summary"},"attempt_count":{"type":"integer","title":"Attempt Count"},"claimed":{"type":"boolean","title":"Claimed"},"shipped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shipped At"},"linear_issue_identifier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linear Issue Identifier"},"linear_state_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Linear State Type"},"duplicate_parent":{"anyOf":[{"$ref":"#/components/schemas/AdminRequestRef"},{"type":"null"}]},"related_run":{"anyOf":[{"$ref":"#/components/schemas/AdminRunRef"},{"type":"null"}]},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["id","team","source","intake_kind","status_code","summary","attempt_count","claimed","created_at","updated_at"],"title":"AdminRequestListItem"},"AdminRequestListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminRequestListItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["items"],"title":"AdminRequestListResponse"},"AdminRequestProcessing":{"properties":{"status_code":{"type":"string","title":"Status Code"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"attempt_count":{"type":"integer","title":"Attempt Count"},"claim_token_present":{"type":"boolean","title":"Claim Token Present"},"claimed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claimed At"},"claim_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Claim Expires At"},"idempotency_key_present":{"type":"boolean","title":"Idempotency Key Present"},"shipped_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Shipped At"},"fixed_notified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fixed Notified At"},"last_occurrence_comment_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Occurrence Comment At"}},"additionalProperties":false,"type":"object","required":["status_code","attempt_count","claim_token_present","idempotency_key_present"],"title":"AdminRequestProcessing"},"AdminRequestRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"summary":{"type":"string","title":"Summary"},"status_code":{"type":"string","title":"Status Code"},"source":{"type":"string","title":"Source"},"unavailable":{"type":"boolean","title":"Unavailable","default":false}},"additionalProperties":false,"type":"object","required":["id","summary","status_code","source"],"title":"AdminRequestRef"},"AdminRequestStats":{"properties":{"total":{"type":"integer","title":"Total"},"by_status_code":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status Code"},"by_severity":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Severity"},"shipped":{"type":"integer","title":"Shipped"},"drafted":{"type":"integer","title":"Drafted"},"errored":{"type":"integer","title":"Errored"},"stuck_claims":{"type":"integer","title":"Stuck Claims"}},"additionalProperties":false,"type":"object","required":["total","by_status_code","by_severity","shipped","drafted","errored","stuck_claims"],"title":"AdminRequestStats"},"AdminRequestTriage":{"properties":{"is_bug":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Bug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"public_description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Public Description"},"severity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Severity"},"area":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Area"},"priority":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Priority"},"confidence":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Confidence"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"drafted_cause":{"anyOf":[{"$ref":"#/components/schemas/DraftedCause"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"AdminRequestTriage"},"AdminRunArtifactItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"key":{"type":"string","title":"Key"},"byte_size":{"type":"integer","title":"Byte Size"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","key","byte_size","created_at"],"title":"AdminRunArtifactItem"},"AdminRunArtifactList":{"properties":{"state":{"$ref":"#/components/schemas/ArtifactState"},"items":{"items":{"$ref":"#/components/schemas/AdminRunArtifactItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["state","items"],"title":"AdminRunArtifactList"},"AdminRunCompleteness":{"properties":{"tool_calls":{"$ref":"#/components/schemas/StreamState"},"messages":{"$ref":"#/components/schemas/StreamState"},"permission_requests":{"$ref":"#/components/schemas/StreamState"},"artifacts":{"$ref":"#/components/schemas/StreamState"},"inbound_events":{"$ref":"#/components/schemas/StreamState"}},"additionalProperties":false,"type":"object","required":["tool_calls","messages","permission_requests","artifacts","inbound_events"],"title":"AdminRunCompleteness"},"AdminRunDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"team":{"$ref":"#/components/schemas/AdminTeamRef"},"actor":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"request_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Excerpt"},"conversation":{"anyOf":[{"$ref":"#/components/schemas/AdminConversationRef"},{"type":"null"}]},"parent":{"anyOf":[{"$ref":"#/components/schemas/AdminRunRef"},{"type":"null"}]},"status_code":{"type":"string","title":"Status Code"},"trigger_code":{"type":"string","title":"Trigger Code"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"},"model":{"type":"string","title":"Model"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens"},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens"},"cost_micro_usd":{"type":"integer","title":"Cost Micro Usd"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"truncated":{"type":"boolean","title":"Truncated"},"no_result":{"type":"boolean","title":"No Result"},"silent":{"type":"boolean","title":"Silent"},"pending_effect_at_close":{"type":"boolean","title":"Pending Effect At Close"},"deferred_effect_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deferred Effect Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"request_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Text"},"request_context":{"$ref":"#/components/schemas/AdminRunRequestContext"},"child_count":{"type":"integer","title":"Child Count"},"health":{"$ref":"#/components/schemas/AdminRunHealth"}},"additionalProperties":false,"type":"object","required":["id","team","status_code","trigger_code","model","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","cost_micro_usd","truncated","no_result","silent","pending_effect_at_close","deferred_effect_status","created_at","child_count","health"],"title":"AdminRunDetail"},"AdminRunHealth":{"properties":{"liveness":{"type":"string","enum":["available","unavailable"],"title":"Liveness"},"attempt":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Attempt"},"heartbeat_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Heartbeat At"}},"additionalProperties":false,"type":"object","required":["liveness"],"title":"AdminRunHealth"},"AdminRunListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"team":{"$ref":"#/components/schemas/AdminTeamRef"},"actor":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"actor_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Email"},"request_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Excerpt"},"conversation":{"anyOf":[{"$ref":"#/components/schemas/AdminConversationRef"},{"type":"null"}]},"parent":{"anyOf":[{"$ref":"#/components/schemas/AdminRunRef"},{"type":"null"}]},"status_code":{"type":"string","title":"Status Code"},"trigger_code":{"type":"string","title":"Trigger Code"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"},"model":{"type":"string","title":"Model"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens"},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens"},"cost_micro_usd":{"type":"integer","title":"Cost Micro Usd"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"truncated":{"type":"boolean","title":"Truncated"},"no_result":{"type":"boolean","title":"No Result"},"silent":{"type":"boolean","title":"Silent"},"pending_effect_at_close":{"type":"boolean","title":"Pending Effect At Close"},"deferred_effect_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Deferred Effect Status"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","team","status_code","trigger_code","model","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","cost_micro_usd","truncated","no_result","silent","pending_effect_at_close","deferred_effect_status","created_at"],"title":"AdminRunListItem"},"AdminRunListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminRunListItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["items"],"title":"AdminRunListResponse"},"AdminRunRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status_code":{"type":"string","title":"Status Code"},"trigger_code":{"type":"string","title":"Trigger Code"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"unavailable":{"type":"boolean","title":"Unavailable","default":false}},"additionalProperties":false,"type":"object","required":["id","status_code","trigger_code"],"title":"AdminRunRef"},"AdminRunRequestContext":{"properties":{"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"},"schedule_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Name"},"cron_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Job Id"}},"additionalProperties":false,"type":"object","title":"AdminRunRequestContext"},"AdminRunStats":{"properties":{"total":{"type":"integer","title":"Total"},"by_status_code":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Status Code"},"cost_micro_usd":{"type":"integer","title":"Cost Micro Usd"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens"},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens"},"truncated":{"type":"integer","title":"Truncated"},"no_result":{"type":"integer","title":"No Result"},"silent":{"type":"integer","title":"Silent"}},"additionalProperties":false,"type":"object","required":["total","by_status_code","cost_micro_usd","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","truncated","no_result","silent"],"title":"AdminRunStats"},"AdminRunTimeline":{"properties":{"run":{"$ref":"#/components/schemas/AdminRunRef"},"health":{"$ref":"#/components/schemas/AdminRunHealth"},"completeness":{"$ref":"#/components/schemas/AdminRunCompleteness"},"items":{"items":{"$ref":"#/components/schemas/AdminRunTimelineItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["run","health","completeness","items"],"title":"AdminRunTimeline"},"AdminRunTimelineItem":{"properties":{"id":{"type":"string","title":"Id"},"kind":{"$ref":"#/components/schemas/TimelineKind"},"journal_kind":{"anyOf":[{"$ref":"#/components/schemas/RunJournalKind"},{"type":"null"}]},"at":{"type":"string","format":"date-time","title":"At"},"clock":{"type":"string","const":"ingested","title":"Clock","default":"ingested"},"sequence":{"type":"integer","title":"Sequence"},"actor":{"anyOf":[{"$ref":"#/components/schemas/AdminActorRef"},{"type":"null"}]},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"summary":{"type":"string","title":"Summary"},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"entity_refs":{"items":{"$ref":"#/components/schemas/AdminTimelineEntityRef"},"type":"array","title":"Entity Refs"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input"},"output":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Output"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"detail":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Detail"}},"additionalProperties":false,"type":"object","required":["id","kind","at","sequence","summary","entity_refs"],"title":"AdminRunTimelineItem"},"AdminSearchResults":{"properties":{"teams":{"items":{"$ref":"#/components/schemas/AdminTeamSummary"},"type":"array","title":"Teams"},"people":{"items":{"$ref":"#/components/schemas/AdminPerson"},"type":"array","title":"People"}},"type":"object","required":["teams","people"],"title":"AdminSearchResults","description":"Grouped results for the cockpit's single search box."},"AdminSelectedNoticeRepairRequest":{"properties":{"confirm_not_delivered":{"type":"boolean","title":"Confirm Not Delivered","default":false},"expected_claim_generation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Claim Generation"}},"additionalProperties":false,"type":"object","title":"AdminSelectedNoticeRepairRequest","description":"POST body. A destination is resolved by the service, never taken from the caller."},"AdminSelectedNoticeRepairView":{"properties":{"notice_id":{"type":"string","format":"uuid","title":"Notice Id"},"kind_code":{"type":"string","title":"Kind Code"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"outcome":{"type":"string","enum":["requeued","cancelled"],"title":"Outcome"},"state_code":{"type":"string","title":"State Code"},"claim_generation":{"type":"integer","title":"Claim Generation"},"previous_state_code":{"type":"string","title":"Previous State Code"},"previous_claim_generation":{"type":"integer","title":"Previous Claim Generation"}},"type":"object","required":["notice_id","kind_code","reason_code","outcome","state_code","claim_generation","previous_state_code","previous_claim_generation"],"title":"AdminSelectedNoticeRepairView","description":"The CAS result. No destination refs."},"AdminSubscriptionPackageRevert":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":10,"title":"Reason","description":"Why this deal is ending."}},"additionalProperties":false,"type":"object","required":["reason"],"title":"AdminSubscriptionPackageRevert","description":"POST body: why this negotiated deal is ending."},"AdminSubscriptionPackageRevertResult":{"properties":{"canceled_stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Canceled Stripe Subscription Id","description":"The subscription canceled, or null if nothing billed the attached price."},"package":{"$ref":"#/components/schemas/AdminSubscriptionPackageView"}},"type":"object","required":["package"],"title":"AdminSubscriptionPackageRevertResult","description":"What reverting to the default package just did, plus the package's new readout."},"AdminSubscriptionPackageUpdate":{"properties":{"monthly_credit_grant":{"type":"integer","maximum":1000000.0,"minimum":0.0,"title":"Monthly Credit Grant"},"negotiated_stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Negotiated Stripe Price Id","description":"A hand-made Stripe price to attach; validated against Stripe before it's saved."},"reason":{"type":"string","maxLength":500,"minLength":10,"title":"Reason","description":"Why this allocation is changing."},"expected_monthly_credit_grant":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Monthly Credit Grant","description":"The monthly_credit_grant GET most recently reported (null if it reported none, meaning the workspace had no row yet). A 409 means someone else changed it first: reload and re-apply."}},"additionalProperties":false,"type":"object","required":["monthly_credit_grant","reason","expected_monthly_credit_grant"],"title":"AdminSubscriptionPackageUpdate","description":"PUT body: the new allocation, an optional Stripe price to attach, and why."},"AdminSubscriptionPackageView":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"monthly_credit_grant":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Credit Grant","description":"This tenant's own LIVE allocation, or null when the workspace has no subscription row yet."},"default_monthly_credit_grant":{"type":"integer","title":"Default Monthly Credit Grant","description":"The fleet default an unset workspace runs on."},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id","description":"This workspace's cus_… id, or null."},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id","description":"The synced sub_… id, or null."},"cancelable_stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cancelable Stripe Subscription Id","description":"The sub_… a revert would cancel, or null when nothing bills the attached price."},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"The tier Stripe last synced onto this row."},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status","description":"The subscription status Stripe last synced."},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End","description":"The synced current period end."},"last_grant_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Grant At","description":"When the monthly sweep last granted this row."},"negotiated_stripe_price_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Negotiated Stripe Price Id","description":"The attached negotiated price, or null."},"negotiated_monthly_price_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Negotiated Monthly Price Cents","description":"Stripe's amount for that price."},"negotiated_monthly_credit_grant":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Negotiated Monthly Credit Grant","description":"The negotiated allocation; promoted into monthly_credit_grant once synced."},"has_attached_package":{"type":"boolean","title":"Has Attached Package","description":"Whether a negotiated price is attached — an offer, not a sale."},"on_negotiated_package":{"type":"boolean","title":"On Negotiated Package","description":"Whether the workspace is actually billing on it right now."}},"type":"object","required":["tenant_id","monthly_credit_grant","default_monthly_credit_grant","has_attached_package","on_negotiated_package"],"title":"AdminSubscriptionPackageView","description":"The staff readout for a tenant's negotiated package."},"AdminTeamList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminTeamSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"}},"type":"object","required":["items","total"],"title":"AdminTeamList","description":"One page of team summaries plus the un-paged total."},"AdminTeamMember":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"email":{"type":"string","title":"Email"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Best human name (actor, else dashboard profile)."},"role_code":{"type":"string","title":"Role Code"},"status_code":{"type":"string","title":"Status Code"},"source_code":{"type":"string","title":"Source Code"},"joined_at":{"type":"string","format":"date-time","title":"Joined At"},"first_interacted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Interacted At"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"actor_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Kind"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id","description":"Set when the member has a dashboard login."},"is_internal":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Internal"}},"type":"object","required":["membership_id","email","role_code","status_code","source_code","joined_at"],"title":"AdminTeamMember","description":"One roster row: membership + chat identity + dashboard login, resolved to names."},"AdminTeamMemberList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminTeamMember"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["items","count"],"title":"AdminTeamMemberList"},"AdminTeamPayment":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"issued_at":{"type":"string","format":"date-time","title":"Issued At"},"description":{"type":"string","title":"Description"},"purpose":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Purpose","description":"Credit-grant source (topup / auto_refill / proration / …), or the synthesized value ``subscription`` for a cycle invoice, which never gets its own grant."},"status":{"type":"string","title":"Status","description":"paid / refunded / partially_refunded"},"total_cents":{"type":"integer","title":"Total Cents"},"currency_code":{"type":"string","title":"Currency Code"},"credits_granted":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Credits Granted"},"clawback_credits":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Clawback Credits","description":"Credits reversed by a refund, if any.","default":"0"},"card_brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Brand"},"card_last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Card Last4"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_checkout_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Checkout Session Id"},"stripe_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Invoice Id"}},"type":"object","required":["id","issued_at","description","status","total_cents","currency_code","credits_granted"],"title":"AdminTeamPayment","description":"One local :class:`Invoice` row, enriched.\n\nWritten for top-up and subscription-cycle events today; an auto-refill charge writes none\nyet, a known gap (see ``AdminTeamPaymentsRepository``), so it never appears here either."},"AdminTeamPaymentList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminTeamPayment"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"AdminTeamPaymentList","description":"One cursor-paginated page of a team's payment ledger."},"AdminTeamRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"unavailable":{"type":"boolean","title":"Unavailable","default":false}},"additionalProperties":false,"type":"object","required":["id","display_name"],"title":"AdminTeamRef"},"AdminTeamSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"status_code":{"type":"string","title":"Status Code"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed"},"skill_testing_workspace":{"type":"boolean","title":"Skill Testing Workspace"},"workspace_names":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Names","description":"Connected chat workspace name(s)."},"plan_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Plan Tier"},"subscription_status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subscription Status"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"credit_balance":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Credit Balance","description":"COGS-unit prepaid credits (2 decimals)."},"credit_balance_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Balance Micro Usd","description":"Legacy retail prepaid ledger, micro-USD."},"monthly_credit_grant":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Credit Grant"},"member_count":{"type":"integer","title":"Member Count","default":0},"runs_30d":{"type":"integer","title":"Runs 30D","default":0},"credits_30d":{"type":"integer","title":"Credits 30D","description":"Credits consumed in the trailing 30 days.","default":0},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"}},"type":"object","required":["id","display_name","status_code","created_at","onboarding_completed","skill_testing_workspace"],"title":"AdminTeamSummary","description":"One enriched team row: identity, plan, ledgers, and recent activity."},"AdminTeamUsage":{"properties":{"days":{"items":{"$ref":"#/components/schemas/Day"},"type":"array","title":"Days"},"recent_runs":{"items":{"$ref":"#/components/schemas/AdminRecentRun"},"type":"array","title":"Recent Runs"}},"type":"object","required":["days","recent_runs"],"title":"AdminTeamUsage","description":"A team's usage panel: daily credit totals plus its latest runs."},"AdminTimelineEntityRef":{"properties":{"kind":{"type":"string","enum":["team","person","conversation","request","run"],"title":"Kind"},"id":{"type":"string","format":"uuid","title":"Id"},"label":{"type":"string","title":"Label"},"unavailable":{"type":"boolean","title":"Unavailable","default":false}},"additionalProperties":false,"type":"object","required":["kind","id","label"],"title":"AdminTimelineEntityRef"},"AdminToolCallItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tool_name":{"type":"string","title":"Tool Name"},"status_code":{"type":"string","title":"Status Code"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"input_present":{"type":"boolean","title":"Input Present"},"input_byte_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Byte Size"},"output_present":{"type":"boolean","title":"Output Present"},"output_byte_size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Byte Size"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"additionalProperties":false,"type":"object","required":["id","tool_name","status_code","input_present","output_present","created_at"],"title":"AdminToolCallItem"},"AdminToolCallList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AdminToolCallItem"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"additionalProperties":false,"type":"object","required":["items"],"title":"AdminToolCallList"},"AdminUnhappinessBucket":{"properties":{"day":{"type":"string","format":"date","title":"Day"},"checked":{"type":"integer","title":"Checked"},"unhappy":{"type":"integer","title":"Unhappy"},"by_label":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Label"}},"additionalProperties":false,"type":"object","required":["day","checked","unhappy","by_label"],"title":"AdminUnhappinessBucket"},"AdminUnhappinessItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"received_at":{"type":"string","format":"date-time","title":"Received At"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"tenant_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Name"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"actor_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Display Name"},"platform_code":{"type":"string","title":"Platform Code"},"label":{"$ref":"#/components/schemas/UnhappinessLabel"},"evidence":{"type":"string","title":"Evidence"},"user_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"User Text"},"prior_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prior Message"},"prior_run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Prior Run Id"},"classifier_version":{"type":"string","title":"Classifier Version"}},"additionalProperties":false,"type":"object","required":["id","received_at","tenant_id","tenant_name","actor_id","actor_display_name","platform_code","label","evidence","user_text","prior_message","prior_run_id","classifier_version"],"title":"AdminUnhappinessItem"},"AdminUnhappinessListResponse":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/AdminUnhappinessItem"},"type":"array","title":"Items"}},"additionalProperties":false,"type":"object","required":["since","until","total","items"],"title":"AdminUnhappinessListResponse"},"AdminUnhappinessPeopleResponse":{"properties":{"total":{"type":"integer","title":"Total"},"items":{"items":{"$ref":"#/components/schemas/AdminUnhappinessPerson"},"type":"array","title":"Items"}},"additionalProperties":false,"type":"object","required":["total","items"],"title":"AdminUnhappinessPeopleResponse"},"AdminUnhappinessPerson":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"display_name":{"type":"string","title":"Display Name"}},"additionalProperties":false,"type":"object","required":["actor_id","tenant_id","display_name"],"title":"AdminUnhappinessPerson"},"AdminUnhappinessSummaryResponse":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"checked":{"type":"integer","title":"Checked"},"unhappy":{"type":"integer","title":"Unhappy"},"unhappy_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Unhappy Rate"},"labels":{"additionalProperties":{"type":"integer"},"type":"object","title":"Labels"},"buckets":{"items":{"$ref":"#/components/schemas/AdminUnhappinessBucket"},"type":"array","title":"Buckets"}},"additionalProperties":false,"type":"object","required":["since","until","checked","unhappy","unhappy_rate","labels","buckets"],"title":"AdminUnhappinessSummaryResponse"},"AdminUsageResponse":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"total_runs":{"type":"integer","title":"Total Runs"},"scored_replies":{"type":"integer","title":"Scored Replies"},"replies_with_topic":{"type":"integer","title":"Replies With Topic","description":"Scorecards that carry a topic — the topic chart's own denominator, not scored_replies."},"active_teams":{"type":"integer","title":"Active Teams","description":"Workspaces with at least one run in the window, not the customer count."},"coverage_since":{"type":"string","format":"date-time","title":"Coverage Since","description":"Where the coverage pair starts: no earlier than the shortest scorecard retention in scope."},"coverage_eligible_runs":{"type":"integer","title":"Coverage Eligible Runs","description":"Runs the judge could have graded, since coverage_since."},"coverage_scored_replies":{"type":"integer","title":"Coverage Scored Replies","description":"Runs it actually graded, since coverage_since."},"weekly_runs":{"items":{"$ref":"#/components/schemas/UsageWeek"},"type":"array","title":"Weekly Runs"},"runs_by_trigger":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Runs By Trigger"},"runs_by_source_kind":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Runs By Source Kind"},"replies_by_type":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Replies By Type"},"replies_by_outcome":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Replies By Outcome"},"replies_by_complexity":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Replies By Complexity"},"replies_by_tool_use":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Replies By Tool Use","description":"Whether a tool ran at all. Which tool is not recorded online, so it is not counted here."},"replies_by_topic":{"items":{"$ref":"#/components/schemas/UsageCount"},"type":"array","title":"Replies By Topic","description":"The subject a reply was about. Divide by replies_with_topic, not scored_replies."}},"additionalProperties":false,"type":"object","required":["since","until","total_runs","scored_replies","replies_with_topic","active_teams","coverage_since","coverage_eligible_runs","coverage_scored_replies","weekly_runs","runs_by_trigger","runs_by_source_kind","replies_by_type","replies_by_outcome","replies_by_complexity","replies_by_tool_use","replies_by_topic"],"title":"AdminUsageResponse","description":"Every number the page draws, for one window, in one response."},"AgreementCell":{"properties":{"band":{"type":"string","title":"Band","description":"The judge's own verdict band: failing, borderline or passing."},"response":{"type":"string","title":"Response","description":"What the human said: a review verdict, or a thumb rating."},"count":{"type":"integer","title":"Count"}},"type":"object","required":["band","response","count"],"title":"AgreementCell","description":"One cell of an agreement matrix: how a band of judge scores was received."},"AnalysisPhase":{"properties":{"code":{"type":"string","enum":["reach","look","identity","voice","palette","typography","logo","save"],"title":"Code"},"state":{"type":"string","enum":["pending","running","done","empty","skipped","unavailable"],"title":"State"}},"type":"object","required":["code","state"],"title":"AnalysisPhase","description":"One step of the read and the state it is in. Copy is chosen client-side from the pair."},"AnalysisProgressResponse":{"properties":{"status":{"type":"string","enum":["idle","running"],"title":"Status"},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"phases":{"items":{"$ref":"#/components/schemas/AnalysisPhase"},"type":"array","title":"Phases","default":[]}},"type":"object","required":["status"],"title":"AnalysisProgressResponse","description":"A live look at the analysis in flight for the caller's workspace.\n\n``idle`` with no phases is the honest answer whenever there is nothing to watch: no run,\na run that already settled, a marker too old to trust, or a deployment with no Redis."},"AnalyzeWebsiteRequest":{"properties":{"website_url":{"type":"string","title":"Website Url"},"mode":{"type":"string","enum":["fill","replace"],"title":"Mode","default":"fill"}},"additionalProperties":false,"type":"object","required":["website_url"],"title":"AnalyzeWebsiteRequest","description":"Body for ``POST /company-profile/analyze``: the site to read.\n\n``mode=\"fill\"`` (default) only fills fields currently ``missing``; ``mode=\"replace\"`` overwrites\nevery analyzer-produced field, colour, and logo regardless of prior state — except typography,\nwhich keeps its own fill-only guard in both modes."},"AnalyzeWebsiteResponse":{"properties":{"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"target_audience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience"},"what_you_do":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"What You Do"},"differentiation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Differentiation"},"tone_of_voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone Of Voice"},"voice_warmth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Warmth"},"voice_formality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Formality"},"voice_length":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Length"},"voice_technical_depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Technical Depth"},"voice_emoji":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Emoji"},"sells":{"items":{"type":"string"},"type":"array","title":"Sells","default":[]},"brand_colors":{"items":{"type":"string"},"type":"array","title":"Brand Colors","default":[]},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"analyzed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Analyzed At"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":false},"color_roles":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Color Roles","default":{}},"chart_palette":{"items":{"type":"string"},"type":"array","title":"Chart Palette","default":[]},"chart_palettes":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Chart Palettes","default":{}},"typography":{"additionalProperties":true,"type":"object","title":"Typography","default":{}},"add_ons":{"additionalProperties":true,"type":"object","title":"Add Ons","default":{}},"theme":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Theme"},"brand_rules":{"additionalProperties":true,"type":"object","title":"Brand Rules","default":{}},"voice_traits":{"items":{"type":"string"},"type":"array","title":"Voice Traits","default":[]},"brand_words":{"additionalProperties":true,"type":"object","title":"Brand Words","default":{}},"field_states":{"additionalProperties":{"$ref":"#/components/schemas/BrandFieldState"},"type":"object","title":"Field States","default":{}},"brand_kit_version":{"type":"integer","title":"Brand Kit Version","default":1},"logos":{"items":{"$ref":"#/components/schemas/BrandLogoSlot"},"type":"array","title":"Logos","default":[]},"readiness":{"$ref":"#/components/schemas/BrandReadiness","default":{"completeness_pct":0,"outputs":[],"nudges":[]}},"host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Host"},"phases":{"items":{"$ref":"#/components/schemas/AnalysisPhase"},"type":"array","title":"Phases","default":[]}},"type":"object","title":"AnalyzeWebsiteResponse","description":"The analyze result: the saved profile plus how every step of the read finished.\n\nThe phases ride the response so the screen never has to guess a terminal state from the\nlast thing it happened to poll: whatever the run recorded is what the checklist shows,\nincluding a step that started and finished between two polls. ``host`` travels with them\nfor the same reason: on a deployment with no Redis, or on a read that settled before the\nfirst poll, it is the only way the screen learns which host was actually reached."},"AppExecutionCreate":{"properties":{"submission_id":{"type":"string","format":"uuid","title":"Submission Id"}},"additionalProperties":false,"type":"object","required":["submission_id"],"title":"AppExecutionCreate"},"AppExecutionStatus":{"properties":{"app_id":{"type":"string","format":"uuid","title":"App Id"},"execution_id":{"type":"string","format":"uuid","title":"Execution Id"},"status":{"type":"string","title":"Status"},"action":{"type":"string","title":"Action"},"approval_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Approval Id"},"approval_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approval State"},"app_url":{"type":"string","title":"App Url"},"executions":{"items":{"$ref":"#/components/schemas/AppSourceExecution"},"type":"array","title":"Executions"},"terminal_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Terminal Reason"},"result_availability":{"type":"string","const":"unavailable","title":"Result Availability"},"result":{"anyOf":[{"$ref":"#/components/schemas/AppResultEnvelope"},{"type":"null"}]}},"type":"object","required":["app_id","execution_id","status","action","approval_id","approval_state","app_url","terminal_reason","result_availability","result"],"title":"AppExecutionStatus"},"AppExecutionSubmission":{"properties":{"app_id":{"type":"string","format":"uuid","title":"App Id"},"execution_id":{"type":"string","format":"uuid","title":"Execution Id"},"status":{"type":"string","title":"Status"},"action":{"type":"string","title":"Action"},"approval_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Approval Id"},"approval_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approval State"},"app_url":{"type":"string","title":"App Url"},"executions":{"items":{"$ref":"#/components/schemas/AppSourceExecution"},"type":"array","title":"Executions"}},"type":"object","required":["app_id","execution_id","status","action","approval_id","approval_state","app_url"],"title":"AppExecutionSubmission"},"AppMetadata":{"properties":{"app_id":{"type":"string","format":"uuid","title":"App Id"},"name":{"type":"string","title":"Name"},"action":{"type":"string","title":"Action"},"action_label":{"type":"string","title":"Action Label"},"source":{"type":"string","title":"Source"},"source_label":{"type":"string","title":"Source Label"},"result":{"anyOf":[{"$ref":"#/components/schemas/AppResultEnvelope"},{"type":"null"}]},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"},"result_availability":{"type":"string","enum":["available","missing","needs_reconnecting","owner_only"],"title":"Result Availability"},"updating":{"type":"boolean","title":"Updating"},"can_refresh":{"type":"boolean","title":"Can Refresh"},"refresh_execution_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Refresh Execution Id"},"sources":{"items":{"$ref":"#/components/schemas/AppSourceMetadata"},"type":"array","title":"Sources"}},"type":"object","required":["app_id","name","action","action_label","source","source_label","result","fetched_at","result_availability","updating","can_refresh","refresh_execution_id"],"title":"AppMetadata"},"AppPreinstall":{"properties":{"install_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Install Url"},"admin_only":{"type":"boolean","title":"Admin Only","default":true}},"type":"object","required":["install_url"],"title":"AppPreinstall","description":"The vendor install one account clears once, before OAuth for that account can complete."},"AppResultEnvelope":{"properties":{"status":{"type":"string","enum":["succeeded","partial","failed","uncertain"],"title":"Status"},"data":{"$ref":"#/components/schemas/JsonValue"}},"type":"object","required":["status"],"title":"AppResultEnvelope"},"AppSourceExecution":{"properties":{"source_name":{"type":"string","title":"Source Name"},"execution_id":{"type":"string","format":"uuid","title":"Execution Id"},"status":{"type":"string","title":"Status"},"approval_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Approval Id"},"approval_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Approval State"}},"type":"object","required":["source_name","execution_id","status","approval_id","approval_state"],"title":"AppSourceExecution"},"AppSourceMetadata":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"fetched_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fetched At"},"status":{"type":"string","enum":["available","missing","updating","waiting_approval","failed","needs_reconnecting"],"title":"Status"}},"type":"object","required":["name","label","fetched_at","status"],"title":"AppSourceMetadata"},"ApprovalDecisionResponse":{"properties":{"status":{"type":"string","title":"Status"},"permission_request_id":{"type":"string","format":"uuid","title":"Permission Request Id"},"run_id":{"type":"string","format":"uuid","title":"Run Id"},"approved":{"type":"boolean","title":"Approved"}},"type":"object","required":["status","permission_request_id","run_id","approved"],"title":"ApprovalDecisionResponse","description":"Acknowledgement that an approval decision was accepted for async resume."},"ApprovalPolicyBody":{"properties":{"mode":{"$ref":"#/components/schemas/ApprovalPolicyMode","description":"When Patricia asks you to approve a tool call. Authorized mail labels, drafts, read status and archiving run without confirmation regardless of saved choices. Outlook moves to Archive or the Inbox run without confirmation. Other folders, Trash and Spam follow your approval settings. Critical actions keep their approval floor under general mode choices. A separate per-tool consent can waive one action. Provider-required actions keep their approval floor. Actions whose name matches the audience rule, and actions requiring a card decision, keep theirs on any action Patricia already asks about. Choosing Always allow on an approval card clears the provider-required, card-required and audience floors for that kind of call. Patricia's own tools, such as asking you a question, updating her progress checklist, or finding a tool, always run without asking whatever you choose here. Her internal bookkeeping, such as making a folder or scheduling one of Patricia's tasks, also runs without asking; only your saved choice for read actions turns one of those back into an approval, unless you chose Always allow on that action's card. On scheduled tasks and automations, saving a file to the file library and getting a link to it run without asking, whatever you choose here. Publishing a file still asks, and other approval rules still apply."},"tiers":{"items":{"$ref":"#/components/schemas/RiskTier"},"type":"array","uniqueItems":true,"title":"Tiers","description":"The risk tiers that ask for approval when mode is tiers."},"read_tier":{"anyOf":[{"$ref":"#/components/schemas/TierDecision"},{"type":"null"}],"description":"Your own choice for read actions. Sticky: once set it outranks mode/tiers for reads even across a later mode change, until you send null here to clear it back to following mode/tiers."},"write_tier":{"anyOf":[{"$ref":"#/components/schemas/TierDecision"},{"type":"null"}],"description":"Your own choice for write actions. Sticky: once set it outranks mode/tiers for writes even across a later mode change, until you send null here to clear it back to following mode/tiers."},"critical_tier":{"anyOf":[{"$ref":"#/components/schemas/TierDecision"},{"type":"null"}],"description":"Your own choice for critical actions. General policy ignores this field."},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"}},"additionalProperties":false,"type":"object","required":["mode"],"title":"ApprovalPolicyBody","description":"Request body for setting an actor's approval policy (``PUT``).\n\nInherits the shared ``mode``/``tiers`` fields + validation (a malformed body is a\n4xx here, unlike the fail-closed read path) and adds the routing-only ``actor_id``.\n``mode`` is required (no default) so a caller states intent explicitly. ``actor_id``\nis optional and admin-only: when omitted the route targets the CALLER's own actor,\nso the dashboard never needs to know its own actor id."},"ApprovalPolicyMode":{"type":"string","enum":["default","always","never","tiers"],"title":"ApprovalPolicyMode","description":"How a user's per-actor approval preference shapes the tool-approval gate.\n\nPure runtime concept, NOT a code-table. It never appears as a ``*_code``\ncolumn; it is the ``mode`` field inside the JSON value of the\n``approval_policy`` :class:`~models.preference.ActorPreference`, so it is\nvalidated by Pydantic (``models.approval_policy``) rather than seeded into a\nreference table. The gate applies it OVER the computed default, and this\nsetting can only ever ADD approvals: no value of it relaxes a\ndestructive/CRITICAL action below approval. The one thing that can is a\nseparate lane — a member's own per-tool integration consent on one action of\none connection, granted from that connection's Tools tab, which this setting\nneither reaches nor represents (``tools.approval_policy``)."},"ApprovalPolicyResponse":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"mode":{"$ref":"#/components/schemas/ApprovalPolicyMode"},"tiers":{"items":{"$ref":"#/components/schemas/RiskTier"},"type":"array","title":"Tiers"},"floor_tiers":{"items":{"$ref":"#/components/schemas/RiskTier"},"type":"array","title":"Floor Tiers","description":"The approval floor for mode and group policy choices."},"read_tier":{"$ref":"#/components/schemas/TierDecision","description":"Your own read-tier choice when you set one — it decides this tier and mode/tiers cannot override it. A synthesized default otherwise, decided by mode/tiers instead."},"write_tier":{"$ref":"#/components/schemas/TierDecision","description":"Your own write-tier choice when you set one — it decides this tier and mode/tiers cannot override it. A synthesized default otherwise, decided by mode/tiers instead."},"critical_tier":{"$ref":"#/components/schemas/TierDecision","description":"Your own critical-tier choice (defaulted when unset). General policy ignores this value."},"explicit_tier_groups":{"items":{"type":"string","enum":["read","write","critical"]},"type":"array","title":"Explicit Tier Groups","description":"Which of read/write/critical above are YOUR OWN choice rather than a value synthesized from mode/tiers. Trust read_tier/write_tier/critical_tier as the actor's real, unambiguous decision only for a group listed here — for one that is not, mode/tiers can still disagree with part of the group even though this field reports one value for it. Transitional for PAT-1755's mode/tiers retirement: expect every actor to list all three groups, and this field to become a no-op, once that series removes mode/tiers."}},"type":"object","required":["actor_id","mode","tiers","floor_tiers","read_tier","write_tier","critical_tier","explicit_tier_groups"],"title":"ApprovalPolicyResponse","description":"An actor's effective approval policy and its general-policy tier floor."},"ApprovalsFeedRow":{"properties":{"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"risk_tier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Tier Code"},"input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input","description":"Tool arguments, sanitized. Present only on kind=tool rows, and only for callers holding runs:execute (the authority that can decide the request); null for read-only callers, which receive input_summary instead."},"input_summary":{"anyOf":[{"items":{"$ref":"#/components/schemas/ArgSummaryEntry"},"type":"array"},{"type":"null"}],"title":"Input Summary","description":"Value-free per-argument summary, populated in place of input for callers without runs:execute."},"repeat_coverage_announced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Repeat Coverage Announced"},"task_offer_manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Task Offer Manifest"},"task_offer_manifest_digest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Offer Manifest Digest"},"delivery_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Ref"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"snapshot_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Title"},"snapshot_tool_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Tool Label"},"snapshot_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Body"},"snapshot_link_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Link Kind"},"snapshot_link_value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Snapshot Link Value"},"asked_because":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Asked Because","description":"One sentence naming which rule asked for this approval, for example a workspace setting on the connected account or an action that reaches an audience. Null when the request records no cause."},"installation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Installation Id"},"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id"},"skill_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Slug"},"skill_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Title"},"skill_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Summary"},"requester_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Requester Name"},"requester_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requester Actor Id"},"requested_by_viewer":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Requested By Viewer","description":"True when the caller is the person whose run raised this request, false when somebody else did or nobody did (a proactive run). Resolved server-side because the browser holds no actor id to compare against. Null on a skill-share row, which the server does not yet resolve it for."},"connection_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Label","description":"One sentence naming the connection this action would run on, already filtered for what the caller may know: a personal connection they do not own is described without naming its owner. Null when the request binds no connection."}},"type":"object","title":"ApprovalsFeedRow","description":"One feed row of either kind. Every field is optional so ``fields=`` projection validates.\n\n``kind`` is the discriminator: a reader keys on it rather than on which columns happen to be null,\nsince a tool row can legitimately carry no stored arguments and a share row carries no run.\n\n``input`` is shaped per caller by the router and never returned raw: sanitized values for callers\nwho can decide (``runs:execute``), a value-free ``input_summary`` for read-only ones. Only a ``tool``\nrow carries stored arguments; a share request has none, so it is handed neither."},"ApproveResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"semver":{"type":"string","title":"Semver"},"status_code":{"type":"string","title":"Status Code"}},"type":"object","required":["id","skill_id","semver","status_code"],"title":"ApproveResponse","description":"The result of approving a proposed version → active."},"ArgSummaryEntry":{"properties":{"key":{"type":"string","title":"Key","description":"Argument name (schema-level, never customer data)."},"type":{"type":"string","title":"Type","description":"JSON type of the hidden value: string, number, boolean, object, array, or null."},"size":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size","description":"Size of the hidden value: characters for a string, item count for an array, key count for an object. Null for other scalars, and always null for a credential-named argument."}},"type":"object","required":["key","type"],"title":"ArgSummaryEntry","description":"Value-free summary of ONE stored tool argument, for callers without the approval scope.\n\nRead surfaces that carry tool arguments (the approval queue, the run's tool-call timeline) return\nargument VALUES only to callers holding ``runs:execute`` (the authority that may decide the request);\na plain ``runs:read`` caller gets one of these per top-level argument instead. Built by\n``agent.arg_visibility.summarize_args``. Deliberately carries NO value hash: a row-salted digest was\nreviewed and rejected as a practical value-confirmation oracle (the salt travels in the same response)."},"ArtifactState":{"type":"string","enum":["complete","partial","expired_or_swept","unavailable","not_applicable"]},"AssetAuthor":{"properties":{"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id","description":"The workspace member credited with this file. The key the author filter takes; null when no person is recorded (an API-key upload, or a run with no requester)."},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"That member's name. Null when nothing resolves — render 'Patricia' or 'Someone'."},"made_by_patricia":{"type":"boolean","title":"Made By Patricia","description":"Whether a Patricia run created this file. True with a display_name reads 'Patricia for <name>'; true without one reads 'Patricia'; false reads the name alone.","default":false}},"additionalProperties":false,"type":"object","title":"AssetAuthor","description":"Who made a file, as a person reads it — the designs' \"Made by\" column and detail row.\n\nTwo fields answer two different questions and neither substitutes for the other.\n``display_name`` is WHOSE work this is; ``made_by_patricia`` is whether Patricia's hands did it.\nA file Patricia generated because Ricardo asked her to carries both — the dashboard renders\n\"Patricia for Ricardo\" — and that is the ordinary case, not an edge one.\n\n``display_name`` is ``null`` only when nothing resolves: an API-key upload (not a person), a\nheadless cron run with no requester, or a workspace member whose chat profile was never\nenriched. It is NEVER a raw platform id — it comes from\n:meth:`~repositories.actor.ActorRepository.resolve_actor_displays`, the one resolver every\nhuman-facing render site shares, which humanizes a placeholder id back into ``null`` here."},"AssetCanvaDesign":{"properties":{"edit_url":{"type":"string","title":"Edit Url","description":"The HTTPS Canva editor URL for the new design."},"design_id":{"type":"string","title":"Design Id","description":"Canva's identifier for the new design."}},"additionalProperties":false,"type":"object","required":["edit_url","design_id"],"title":"AssetCanvaDesign","description":"The Canva design created from one Patricia media file."},"AssetCreate":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"UTF-8 text for a text kind (markdown, html). Mutually exclusive with content_base64."},"content_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Base64","description":"Base64-encoded bytes for any kind. Mutually exclusive with content."},"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name","description":"The file's name. Must be free among the workspace's live assets."},"kind":{"type":"string","enum":["app","audio","docx","file","html","image","markdown","pdf","slides","spreadsheet","video"],"title":"Kind","description":"What sort of file this is."},"content_type":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Content Type","description":"Media type to store. Omit for the kind's default."},"folder_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Folder Id","description":"File the new asset into this folder as it is created. Omit (or send null) to leave it unfiled. Answers 404 when the folder does not exist or belongs to another workspace, and stores nothing when it does."}},"additionalProperties":false,"type":"object","required":["name","kind"],"title":"AssetCreate","description":"Create a new asset at version 1.\n\nThere is deliberately NO ``visibility`` field, and the inherited ``extra=\"forbid\"`` makes\nsending one a 422 rather than a value that is quietly dropped. A new file takes the column's own\ndefault (``team``); widening it to ``external`` is a separate, separately-authorized request\n(``PUT /assets/{id}/visibility``, the file's author or a workspace admin). So no create — an\nupload from the dashboard included — can put a file into the library at a level wider than the\none every other file in it already has."},"AssetDelete":{"properties":{"reason":{"type":"string","maxLength":500,"minLength":1,"title":"Reason","description":"Why this file is being removed. Stored on the tombstone."}},"additionalProperties":false,"type":"object","required":["reason"],"title":"AssetDelete","description":"Move an asset to the trash. The reason is required and kept as the audit record."},"AssetDetail":{"properties":{"asset":{"$ref":"#/components/schemas/AssetSummary"},"versions":{"items":{"$ref":"#/components/schemas/AssetVersionSummary"},"type":"array","title":"Versions","description":"Stored versions, newest first, capped at the most recent 200."},"source":{"anyOf":[{"$ref":"#/components/schemas/AssetSource"},{"type":"null"}],"description":"Where this file came from. Null only for a payload built before this field existed."},"can_change_visibility":{"type":"boolean","title":"Can Change Visibility","description":"Whether YOU may change this file's visibility: your role carries assets:edit, AND you added the file or are a workspace admin. Both halves are what the PUT /assets/{id}/visibility route checks for itself, so a picker enabled by this flag is never refused by that request.","default":false},"can_share":{"type":"boolean","title":"Can Share","description":"Whether YOU may create this file's link. Requires assets:edit. A link is the file's ADDRESS and publishes nothing: who can open it stays the file's own visibility, tested against whoever asks, so a file set to 'Only me' has a link too and only you can open it. Changing who can see a file is a separate act with its own permission, can_change_visibility. Computed server-side from the same rules POST /assets/{id}/share-links enforces, so a button enabled by this flag is never refused by that request.","default":false}},"additionalProperties":false,"type":"object","required":["asset","versions"],"title":"AssetDetail","description":"One asset plus its version history: the detail panel's payload."},"AssetFolderAssign":{"properties":{"folder_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Folder Id","description":"The folder to file this into, or null to take it out of the one it is in."}},"additionalProperties":false,"type":"object","required":["folder_id"],"title":"AssetFolderAssign","description":"Put a file in a folder, or take it out of one.\n\n``folder_id`` is REQUIRED and nullable rather than optional: \"move to no folder\" is a real,\nordinary request, and an optional field cannot tell it apart from a body that forgot to say."},"AssetFolderCreate":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name","description":"What to call it. Must be free inside the SAME parent, ignoring letter case, so '2026/Q3' and '2027/Q3' can both exist. Cannot contain '/'."},"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id","description":"The folder to make it inside. Omit or send null to make a top-level folder. Answers 404 when the parent is not this workspace's."}},"additionalProperties":false,"type":"object","required":["name"],"title":"AssetFolderCreate","description":"Make a folder, at the top level or inside another one."},"AssetFolderList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssetFolderSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Folders in this workspace, including any beyond the returned list."}},"additionalProperties":false,"type":"object","required":["items","total"],"title":"AssetFolderList","description":"Every folder the workspace has, plus the true count.\n\n``total`` is a real ``COUNT(*)``, like :class:`AssetPage`'s: the list is capped, and a capped\nrail that reported its own length as the total would read as the whole set."},"AssetFolderRef":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name","description":"The folder's label. UNTRUSTED text: render escaped."},"path":{"type":"string","title":"Path","description":"The folder's full path (e.g. 'Clients/Acme'). UNTRUSTED text: render escaped. The detail panel shows this rather than the bare name, because several folders can share a name.","default":""}},"additionalProperties":false,"type":"object","required":["id","name"],"title":"AssetFolderRef","description":"The folder a file is filed under — id to navigate to, name and path to show."},"AssetFolderRemoved":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"unfiled_count":{"type":"integer","title":"Unfiled Count","description":"Live files that went back to being unfiled."},"reparented_count":{"type":"integer","title":"Reparented Count","description":"Folders that were inside it and have moved up one level. None of them is deleted.","default":0}},"additionalProperties":false,"type":"object","required":["id","name","unfiled_count"],"title":"AssetFolderRemoved","description":"What removing a folder did — the copy the dashboard shows afterwards.\n\nBoth counts exist so the confirmation can be specific (\"Its 5 files are back at the top level\nand its 2 folders moved up one level\") rather than reassuring in the abstract. Removing a folder\nnever removes a file and never removes a folder inside it."},"AssetFolderRename":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name","description":"The new name. Must be free in this workspace, ignoring letter case."}},"additionalProperties":false,"type":"object","required":["name"],"title":"AssetFolderRename","description":"Give a folder a different name."},"AssetFolderReparent":{"properties":{"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id","description":"The folder to move it into, or null to move it to the top level. A folder cannot be moved into itself or into anything inside it."}},"additionalProperties":false,"type":"object","required":["parent_id"],"title":"AssetFolderReparent","description":"Move a folder into another folder, or out to the top level.\n\n``parent_id`` is REQUIRED and nullable rather than optional, exactly like\n:class:`AssetFolderAssign`: \"move it to the top level\" is a real, ordinary request, and an\noptional field cannot tell it apart from a body that forgot to say."},"AssetFolderShareLinkCreate":{"properties":{"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"How many days the link works for, from now. Defaults to 30, and a chosen number must be between 1 and 365. Send null for a link with no end date, which then works until somebody turns it off, the file is deleted, or the file is set to 'Only me'. Each of those three REVOKES it, so none of them can be undone by re-sharing the file.","default":30},"refresh_deadline":{"type":"boolean","title":"Refresh Deadline","description":"Whether handing back a link this caller already has open may move its end date outward. True, the default, is a republish: the deadline moves to whichever of the two dates is later, never inward. Moving it is the file author's or a workspace admin's act unless the file is already 'Anyone with the link'; anyone else gets their link back unchanged, and `deadline_moved` in the response says which happened. Send false when the request is only for the file's address, so reading a URL cannot keep a capability alive by being asked for. It changes nothing when there is no link to hand back; one is minted either way. This body serves the FOLDER mint too, which has nothing to hand back: a folder link is always a new row, so the field does not apply there and that route ignores it.","default":true}},"additionalProperties":false,"type":"object","title":"AssetFolderShareLinkCreate","description":"How long a new share link should last, and whether asking may move an open one's deadline.\n\n``expires_in_days`` carries THREE distinct requests, and the difference between two of them is\nthe guard rather than a nicety: omitting the field asks for the default life, sending a number\nasks for that many days, and sending ``null`` asks for a link with NO end date. An omitted field\ncan therefore never become a never-expiring link — a caller has to name that state to get it.\n\n``refresh_deadline`` separates two acts this one route serves. Publishing a file is a decision\nabout reach and may push its link's deadline outward; asking for the file's address is a read\nand must not. The field defaults to the publishing behaviour, so no existing caller changes, and\na surface that only wants the URL back sends ``false``. Without it such a surface extends a live\ncapability on every press, invisibly, because nobody treats \"what is the URL\" as a decision."},"AssetFolderShareLinkCreated":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"token":{"type":"string","title":"Token","description":"The capability. Shown once; the server stores only its hash."},"url":{"type":"string","title":"Url","description":"The full share URL, ready to copy. Opens the folder's public page."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"additionalProperties":false,"type":"object","required":["id","token","url","created_at"],"title":"AssetFolderShareLinkCreated","description":"A freshly minted folder link, token included — the ONLY response that ever carries it."},"AssetFolderShareLinkInfo":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"additionalProperties":false,"type":"object","required":["id","created_at"],"title":"AssetFolderShareLinkInfo","description":"One folder link as the management view lists it — no token, ever. Mirrors\n:class:`AssetShareLinkInfo` exactly; see it for why revoked/expired are reported separately."},"AssetFolderShareLinksRevoked":{"properties":{"revoked_count":{"type":"integer","title":"Revoked Count","description":"How many not-yet-revoked links this folder had."}},"additionalProperties":false,"type":"object","required":["revoked_count"],"title":"AssetFolderShareLinksRevoked","description":"What turning a folder's sharing off did — how many links it closed."},"AssetFolderSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name","description":"The folder's label. UNTRUSTED text: render escaped."},"parent_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Parent Id","description":"The folder this one is inside, or null when it sits at the top level."},"path":{"type":"string","title":"Path","description":"The full path, separated by '/' (e.g. 'Clients/Acme'). UNTRUSTED text: render escaped. Names repeat across folders, so this is what tells two folders called 'Q3' apart.","default":""},"depth":{"type":"integer","title":"Depth","description":"How deep the folder sits. A top-level folder is 1.","default":1},"asset_count":{"type":"integer","title":"Asset Count","description":"Live files filed in THIS folder. Removed files are not counted."},"byte_size":{"type":"integer","title":"Byte Size","description":"What those files weigh, in bytes."},"subtree_asset_count":{"type":"integer","title":"Subtree Asset Count","description":"Live files in this folder AND everything inside it. The rail shows both numbers ('Clients (3, 47 in all)') because one number that could mean either is a number nobody can act on.","default":0},"subtree_byte_size":{"type":"integer","title":"Subtree Byte Size","description":"What the whole branch weighs, in bytes.","default":0},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the folder was made (UTC)."},"is_shared":{"type":"boolean","title":"Is Shared","description":"Whether this folder currently holds a live share link. When true, every live file in it is readable outside the workspace through that link, whatever each file's own 'Only me' / 'My team' / 'Anyone with the link' setting says."},"content_modified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Content Modified At","description":"The newest 'last touched' stamp across this folder's whole branch (UTC); null when the branch holds no live file. 'Touched' matches the file grouping's own meaning: a new version, but also filing a file here or favoriting it, moves this — not only editing content."},"author":{"anyOf":[{"$ref":"#/components/schemas/AssetAuthor"},{"type":"null"}],"description":"Who made this folder. Null only when a mutation route could not resolve it."}},"additionalProperties":false,"type":"object","required":["id","name","asset_count","byte_size","created_at","is_shared"],"title":"AssetFolderSummary","description":"One folder as the rail draws it: where it sits, what it holds, and what its branch holds."},"AssetGenerationInfo":{"properties":{"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt","description":"The prompt as it was actually sent. UNTRUSTED text."},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model","description":"The generation model's catalog key."},"settings":{"anyOf":[{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"},{"type":"number"},{"type":"boolean"}]},"type":"object"},{"type":"null"}],"title":"Settings","description":"The scalar dispatch settings (aspect ratio, resolution, seed, ...)."},"brand_assets":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Brand Assets","description":"The brand-kit logo names placed into the generation, when any were."}},"additionalProperties":false,"type":"object","title":"AssetGenerationInfo","description":"How a run generated one version — the detail panel's prompt / settings / brand-kit rows.\n\nEverything here is what Patricia herself recorded at dispatch time; ``prompt`` is model-written\nUNTRUSTED text (render escaped), and ``settings`` values are short scalars by construction\n(``agent.image_generation._scalar_settings``)."},"AssetKindTotal":{"properties":{"category":{"type":"string","enum":["document","media","app"],"title":"Category"},"kind":{"type":"string","enum":["app","audio","docx","file","html","image","markdown","pdf","slides","spreadsheet","video"],"title":"Kind"},"count":{"type":"integer","title":"Count"},"byte_size":{"type":"integer","title":"Byte Size"}},"additionalProperties":false,"type":"object","required":["category","kind","count","byte_size"],"title":"AssetKindTotal","description":"How many live assets of one kind the workspace holds, and how much they weigh."},"AssetLibraryStats":{"properties":{"kinds":{"items":{"$ref":"#/components/schemas/AssetKindTotal"},"type":"array","title":"Kinds"},"total_count":{"type":"integer","title":"Total Count"},"total_byte_size":{"type":"integer","title":"Total Byte Size"}},"additionalProperties":false,"type":"object","required":["kinds","total_count","total_byte_size"],"title":"AssetLibraryStats","description":"Library-wide totals: the type filter's counts and the library's footprint."},"AssetPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AssetSummary"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Live assets matching the filter, across all pages."},"limit":{"type":"integer","title":"Limit","description":"The page size actually applied."},"offset":{"type":"integer","title":"Offset","description":"The offset actually applied."}},"additionalProperties":false,"type":"object","required":["items","total","limit","offset"],"title":"AssetPage","description":"One page of the library plus the TRUE number of matches for the same filter.\n\n``total`` is a real count, not ``len(items)``: the dashboard uses it for \"Showing N of M\" and to\ndecide whether a next page exists, and a page-length stand-in would make a truncated library\nread as a complete one."},"AssetShareLinkCreate":{"properties":{"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"How many days the link works for, from now. Defaults to 30, and a chosen number must be between 1 and 365. Send null for a link with no end date, which then works until somebody turns it off, the file is deleted, or the file is set to 'Only me'. Each of those three REVOKES it, so none of them can be undone by re-sharing the file.","default":30},"refresh_deadline":{"type":"boolean","title":"Refresh Deadline","description":"Whether handing back a link this caller already has open may move its end date outward. True, the default, is a republish: the deadline moves to whichever of the two dates is later, never inward. Moving it is the file author's or a workspace admin's act unless the file is already 'Anyone with the link'; anyone else gets their link back unchanged, and `deadline_moved` in the response says which happened. Send false when the request is only for the file's address, so reading a URL cannot keep a capability alive by being asked for. It changes nothing when there is no link to hand back; one is minted either way. This body serves the FOLDER mint too, which has nothing to hand back: a folder link is always a new row, so the field does not apply there and that route ignores it.","default":true},"password":{"anyOf":[{"type":"string","minLength":8},{"type":"null"}],"title":"Password","description":"An optional password, at most 72 UTF-8 bytes."}},"additionalProperties":false,"type":"object","title":"AssetShareLinkCreate","description":"The file mint body: omit expiry for the default life, or send null for no end date.\n\nrefresh_deadline decides whether reuse may extend a working link's deadline.\nAn optional password protects the new link and creates a separate link outside reuse."},"AssetShareLinkCreated":{"properties":{"password_protected":{"type":"boolean","title":"Password Protected"},"id":{"type":"string","format":"uuid","title":"Id"},"token":{"type":"string","title":"Token","description":"The capability, returned in API responses only. The server stores it as a hash plus an encrypted copy that only this person's own republish can read. A republish that reuses the link returns this same token; it is not a one-time value."},"url":{"type":"string","title":"Url","description":"The full share URL, ready to copy. An eligible published HTML site opens on sites.patricia.app. Other files open the console recipient page with file details and a download button. The file's visibility and link password determine access."},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When this link stops working. Null when it was created with no end date, which only happens when the request asked for one."},"asset_visibility":{"type":"string","enum":["private","team","external"],"title":"Asset Visibility","description":"The file's visibility AFTER the mint, which is always 'external': publishing a file is what decides its audience, so minting a link for a file below that level raises it. Returned so a caller can show the new level without re-reading the file.","default":"external"},"reused":{"type":"boolean","title":"Reused","description":"True when this is the link you already had for this file rather than a new one. Publishing a file you have an open link for returns that link, and its end date only moves further out, so one URL keeps serving the file's latest version. Reuse is per person: it finds the link YOU created. False means a link was created — the file had none of yours, the one it had was revoked or has expired, or your membership carries no actor for a link to be recorded against.","default":false},"deadline_moved":{"type":"boolean","title":"Deadline Moved","description":"True when this call moved the link's end date further out. False for a new link (its date was set, not moved), for a request with refresh_deadline false, for a republish of a link whose date was already the later one, and for a republish by someone who is not the file's author or a workspace admin on a file that is not 'Anyone with the link': that link comes back unchanged, and only the author or an admin can extend it.","default":false}},"additionalProperties":false,"type":"object","required":["password_protected","id","token","url","created_at"],"title":"AssetShareLinkCreated","description":"The file's share link, token included — the ONLY response that ever carries it.\n\nNot always a FRESH link: publishing a file that this person already has an open link for hands\nthat same link back, so the URL a recipient holds keeps working and keeps showing the current\nversion. ``reused`` is how a caller tells the two apart."},"AssetShareLinkExtend":{"properties":{"expires_in_days":{"anyOf":[{"type":"integer","maximum":365.0,"minimum":1.0},{"type":"null"}],"title":"Expires In Days","description":"How many days from now the link should keep working. Send null to take its end date away, so it works until somebody turns it off."}},"additionalProperties":false,"type":"object","required":["expires_in_days"],"title":"AssetShareLinkExtend","description":"A new deadline for a link that still works, counted from now rather than added to the old\none — \"another 30 days\" is a promise a person can check on a calendar.\n\nUnlike the create body this field is REQUIRED, so ``null`` here can only ever be a deliberate\n\"take the end date off\"; there is no omission that could be read as one."},"AssetShareLinkInfo":{"properties":{"password_protected":{"type":"boolean","title":"Password Protected"},"id":{"type":"string","format":"uuid","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At","description":"When this link was shut off, or null while it still works."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When this link stops working on its own. Null means it never does: either somebody created it with no end date, or it predates expiry entirely. Such a link is still revoked the moment somebody turns it off, deletes the file, or sets the file to 'Only me' — and a revoked link never comes back."}},"additionalProperties":false,"type":"object","required":["password_protected","id","created_at"],"title":"AssetShareLinkInfo","description":"One share link as the management view lists it — no token, ever.\n\nThe token is shown exactly once, on creation; the server keeps only its hash, so this shape\nCANNOT carry it.\n\nA link works while BOTH dates say so: ``revoked_at`` null (nobody shut it off) and ``expires_at``\nstill ahead (it has not run out). The two are reported separately rather than collapsed into one\n\"active\" boolean because the screen has to say WHICH happened — a revoked link was a decision, an\nexpired one just ran out, and only one of them is worth explaining as an accident."},"AssetShareLinkPassword":{"properties":{"password":{"anyOf":[{"type":"string","minLength":8},{"type":"null"}],"title":"Password","description":"A password, or null to remove protection."}},"additionalProperties":false,"type":"object","required":["password"],"title":"AssetShareLinkPassword"},"AssetSource":{"properties":{"kind":{"type":"string","enum":["generated","uploaded"],"title":"Kind","description":"'generated' — a Patricia run produced this file. 'uploaded' — a person added it directly. Derived from whether a run is recorded, so it can never disagree with run_id."},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id","description":"The run that created it, when one did — opens /runs/{id} in the dashboard."},"conversation":{"anyOf":[{"$ref":"#/components/schemas/AssetSourceConversation"},{"type":"null"}],"description":"The chat conversation the creating run was serving. Null for an upload, for a scheduled or proactive run with no conversation, for a run stored before the library recorded them, AND for a caller who is not part of that conversation — a DM or a private channel is readable only by its participants, while this library is workspace-wide."}},"additionalProperties":false,"type":"object","required":["kind"],"title":"AssetSource","description":"Where a file came from: the detail panel's provenance block.\n\n``kind`` is DERIVED from ``created_by_run_id``, not stored: a run wrote it, or a person\nuploaded it, and there is no third write path into this library today. That is deliberate over\na ``source`` column duplicating a fact the row already carries — two copies of one fact drift,\nand the first thing that drifts is the one nobody reads. The day an inbound chat attachment can\nbe saved to the library, that path IS indistinguishable from a dashboard upload here and needs\na real column; this docstring is where that gets noticed."},"AssetSourceConversation":{"properties":{"platform_code":{"type":"string","title":"Platform Code","description":"Which chat platform, e.g. 'slack'."},"channel_ref":{"type":"string","title":"Channel Ref","description":"The platform's own id for the channel or DM."},"thread_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Ref","description":"The thread this happened in, when it was in a thread rather than the channel."},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The channel or conversation name, when known. UNTRUSTED text: render escaped."}},"additionalProperties":false,"type":"object","required":["platform_code","channel_ref"],"title":"AssetSourceConversation","description":"The chat conversation a file came out of — the detail panel's \"From\" row.\n\nCarries the platform's own coordinates rather than a ready-made URL. Building a Slack permalink\nneeds an API call per file (``chat.getPermalink``), which a detail read must not make, and the\ndashboard already holds the workspace's team id from its Slack connection — so it composes the\ndeep link from these three values with the builder it already uses for \"Open Slack\". A\nserver-side permalink would arrive later as one more optional field here."},"AssetSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name","description":"The workspace's handle for the file. UNTRUSTED text: render escaped."},"category":{"type":"string","enum":["document","media","app"],"title":"Category","description":"Which library this file lives in: 'document' or 'media'."},"kind":{"type":"string","enum":["app","audio","docx","file","html","image","markdown","pdf","slides","spreadsheet","video"],"title":"Kind","description":"What sort of file this is."},"content_type":{"type":"string","title":"Content Type","description":"The current version's media type, e.g. 'application/pdf'."},"byte_size":{"type":"integer","title":"Byte Size","description":"The current version's size in bytes."},"current_version":{"type":"integer","title":"Current Version","description":"The newest version number (versions count from 1)."},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the file last changed (UTC)."},"created_by_run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Run Id","description":"The Patricia run that created this file. Null when no run is recorded for it: a person uploaded it, or it was stored before Patricia began recording runs. Later versions can come from other runs, so read each version's own created_by_run_id for those."},"favorite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Favorite","description":"Whether the workspace marked this file a favourite (the Liked filter shows these). The server always sends it; the default exists for the same temporary fixture-compatibility reason the module docstring records for created_by_run_id."},"thumbnail_status":{"type":"string","enum":["ready","pending","unavailable"],"title":"Thumbnail Status","description":"Whether this file has a grid preview. 'ready' means GET /assets/{id}/thumbnail serves it; 'pending' means one is being prepared, ask again shortly; 'unavailable' means the type icon is the answer (no preview exists for this file type, or this file could not be rendered).","default":"unavailable"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the file was first added to the workspace (UTC)."},"author":{"$ref":"#/components/schemas/AssetAuthor","description":"Who made this file: the 'Made by' column."},"folder":{"anyOf":[{"$ref":"#/components/schemas/AssetFolderRef"},{"type":"null"}],"description":"The folder this file is filed under, or null when it is not filed into one."},"is_owner":{"type":"boolean","title":"Is Owner","description":"Whether the caller is the person who owns this file.","default":false},"requires_access_acknowledgement":{"type":"boolean","title":"Requires Access Acknowledgement","description":"Whether opening this file requires an access_acknowledgement UUID and a durable audit receipt.","default":false},"visibility":{"type":"string","enum":["private","team","external"],"title":"Visibility","description":"Who can read this file. 'private' — only the person who added it, plus workspace admins. 'team' — everyone in the workspace (the default). 'external' — everyone in the workspace, and it may also be shared outside through a link. A file you can see at all is one you may read; the level tells you who ELSE can.","default":"team"},"shared_via_folder_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Shared Via Folder Name","description":"The name of the folder making this file reachable beyond its own visibility level, when a live folder share link is why — for a private file, why anybody else in the workspace can read it; for any file, why anybody outside the workspace holding that folder's link can too. Null when no folder link is why this file is reachable."},"can_edit":{"type":"boolean","title":"Can Edit","description":"Whether YOU may change this file: save a new version, restore an older one, rename it, or move it to another folder. Computed server-side by the same may_mutate rule every mutation route enforces, so a control enabled by this flag is never refused by that request. A shared folder can make a private file READABLE without making it EDITABLE, so this answers the write question on its own — never inferred from visibility or from shared_via_folder_name.","default":false},"can_open_in_canva":{"type":"boolean","title":"Can Open In Canva","description":"Whether YOU may open this media file as a Canva design. Requires edit access to THIS file, a supported image type, a live Canva connection, and the Canva provider in this deployment. Edit access is the same per-file rule this row reports as `can_edit`, because sending a file out to a third-party account is an export. Computed server-side by the same rule POST /assets/{id}/canva-design enforces, so a menu item enabled by this flag is never refused by that request.","default":false}},"additionalProperties":false,"type":"object","required":["id","name","category","kind","content_type","byte_size","current_version","updated_at"],"title":"AssetSummary","description":"One library entry as a listing row (metadata only)."},"AssetUpdate":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255,"minLength":1},{"type":"null"}],"title":"Name","description":"The file's new name. Must be free among the workspace's live files."},"favorite":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Favorite","description":"True to mark the file a favourite, false to unmark it."}},"additionalProperties":false,"type":"object","title":"AssetUpdate","description":"Rename an asset and/or set its favourite mark — the PATCH body.\n\nBoth fields optional so one control can send one change, but an empty body is a 422 rather\nthan a silent no-op the client would mistake for success."},"AssetVersionCreate":{"properties":{"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content","description":"UTF-8 text for a text kind (markdown, html). Mutually exclusive with content_base64."},"content_base64":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content Base64","description":"Base64-encoded bytes for any kind. Mutually exclusive with content."},"content_type":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Content Type","description":"Media type for the new version. Omit to keep the asset's current type."}},"additionalProperties":false,"type":"object","title":"AssetVersionCreate","description":"Append the next version of an existing asset. Kind and category never change."},"AssetVersionSummary":{"properties":{"version":{"type":"integer","title":"Version"},"content_type":{"type":"string","title":"Content Type"},"byte_size":{"type":"integer","title":"Byte Size"},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When this version was stored (UTC)."},"created_by_run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Run Id","description":"The Patricia run that wrote this version. Null when no run is recorded for it. This is what answers 'which run replaced the file', version by version."},"author":{"$ref":"#/components/schemas/AssetAuthor","description":"Who wrote THIS version. Deliberately per version, not inherited from the file: a report Patricia generated and a person then revised has two different answers, and the version history is the only place that difference is visible."},"generation":{"anyOf":[{"$ref":"#/components/schemas/AssetGenerationInfo"},{"type":"null"}],"description":"How this version was generated (prompt, model, settings, brand assets), when a run generated it. Null for uploads, document renders, and versions stored before generation provenance was recorded."}},"additionalProperties":false,"type":"object","required":["version","content_type","byte_size","created_at"],"title":"AssetVersionSummary","description":"One stored revision of an asset."},"AssetVisibilityUpdate":{"properties":{"level":{"type":"string","enum":["private","team","external"],"title":"Level","description":"Who should be able to read this file from now on."}},"additionalProperties":false,"type":"object","required":["level"],"title":"AssetVisibilityUpdate","description":"Change who may read one file.\n\nA sub-resource body rather than a field on a general update, exactly like\n:class:`AssetFolderAssign`: this is a relationship with its own authority (only the file's author\nor a workspace admin) and its own refusals, and a PUT says the true thing about it — sending the\nsame level twice leaves the same state, so a double-clicked picker is harmless."},"AttributeValueType":{"type":"string","enum":["date","recurring_date","text","number","bool","enum","json"],"title":"AttributeValueType","description":"The typed value shape of a canonical fact (``attribute_definition.value_type_code``).\n\nDenormalized onto ``attribute_source_value``/``attribute_current`` (via a composite FK\nto the definition) so a CHECK can enforce that exactly the matching typed column is\npopulated. A *new* value type is a platform migration, never runtime data."},"AudienceClass":{"type":"string","enum":["non_audience","audience","legacy"],"title":"AudienceClass","description":"Which calls of one action a standing consent covers, named by the audience each call reaches.\n\n``tools.contracts.call_audience_class`` reads every call as ``non_audience`` or ``audience``, from\nthe call itself and before any consent is consulted. A ``tool_overrides`` row stores the class it\ncovers, and the class is part of its key, so a non-audience consent never covers an\naudience-reaching call of the same action. The ``ck_tool_overrides_audience_class`` CHECK holds\nthe stored values to this set."},"AuthEmailAcceptedResponse":{"properties":{"status":{"type":"string","const":"accepted","title":"Status","default":"accepted"}},"additionalProperties":false,"type":"object","title":"AuthEmailAcceptedResponse","description":"The ONE answer both link-request endpoints give, whatever the address.\n\nA body that varied by outcome — or a 404 for an unknown address — would turn either\nendpoint into an account-existence oracle for anyone who can type an email in."},"AuthProviderState":{"properties":{"code":{"type":"string","title":"Code"},"available":{"type":"boolean","title":"Available"}},"type":"object","required":["code","available"],"title":"AuthProviderState","description":"Whether ONE sign-in provider may start a flow on the surface that asked.\n\n``available`` means exactly \"this surface may start a sign-in with this provider right now\" —\nits credentials are configured AND the surface is allowlisted for it. It says NOTHING about any\nparticular directory or tenant; that is decided later, in the callback, by an install lookup the\nproviders route has no coordinate to perform."},"AuthProvidersResponse":{"properties":{"providers":{"items":{"$ref":"#/components/schemas/AuthProviderState"},"type":"array","title":"Providers"}},"type":"object","required":["providers"],"title":"AuthProvidersResponse","description":"Which sign-in providers a surface may offer.\n\nThe list always names EVERY known provider, including unavailable ones, so a console renders a\nstable set of buttons and DISABLES rather than hides one that is not configured. A provider that\nvanished from the payload would look like a deploy that lost a feature."},"AuthorResponse":{"properties":{"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"manifest_version_id":{"type":"string","format":"uuid","title":"Manifest Version Id"},"slug":{"type":"string","title":"Slug"},"semver":{"type":"string","title":"Semver"},"title":{"type":"string","title":"Title"},"status_code":{"type":"string","title":"Status Code"},"created":{"type":"boolean","title":"Created"}},"type":"object","required":["skill_id","manifest_version_id","slug","semver","title","status_code","created"],"title":"AuthorResponse","description":"The outcome of authoring a version (manual / ZIP / a chosen GitHub candidate)."},"AuthoredBundleFile":{"properties":{"path":{"type":"string","title":"Path"},"kind":{"type":"string","title":"Kind"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"size_bytes":{"type":"integer","title":"Size Bytes"}},"type":"object","required":["path","kind","content","size_bytes"],"title":"AuthoredBundleFile","description":"One stored bundle file for the playground editor."},"AuthoredBundleFilePayload":{"properties":{"path":{"type":"string","title":"Path"},"content":{"type":"string","title":"Content"}},"type":"object","required":["path","content"],"title":"AuthoredBundleFilePayload","description":"One text bundle file supplied by the playground editor."},"AuthoredInstallResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"manifest_version_id":{"type":"string","format":"uuid","title":"Manifest Version Id"},"status_code":{"type":"string","title":"Status Code"},"config_version":{"type":"integer","title":"Config Version"},"projection_generation":{"type":"integer","title":"Projection Generation"},"activated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activated At"},"first_live_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Live At"},"killed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Killed At"},"kill_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kill Reason"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_state":{"anyOf":[{"$ref":"#/components/schemas/SkillListingState"},{"type":"null"}]},"is_portable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Portable"},"archetype_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archetype Code"},"can_edit_definition":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Edit Definition"},"removable":{"type":"boolean","title":"Removable","description":"Whether this installation may be removed from the workspace.","default":true},"visibility_code":{"$ref":"#/components/schemas/SkillVisibility"},"is_mine":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Mine"},"can_change_visibility":{"type":"boolean","title":"Can Change Visibility","default":false},"has_settings":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Settings"},"is_catalog_default":{"type":"boolean","title":"Is Catalog Default","default":false},"effectively_enabled":{"type":"boolean","title":"Effectively Enabled","default":false},"update_available":{"type":"boolean","title":"Update Available","default":false},"available_version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Available Version Id"},"outdated_config":{"type":"boolean","title":"Outdated Config","default":false},"outdated_config_reasons":{"items":{"type":"string"},"type":"array","title":"Outdated Config Reasons"},"about":{"anyOf":[{"$ref":"#/components/schemas/SkillAboutSummary"},{"type":"null"}]},"recommended_to_connect":{"items":{"type":"string"},"type":"array","title":"Recommended To Connect"}},"type":"object","required":["id","skill_id","manifest_version_id","status_code","config_version","projection_generation","activated_at","first_live_at","killed_at","kill_reason","visibility_code"],"title":"AuthoredInstallResponse","description":"An authored-skill install result + the recommended integrations the workspace still needs to connect.\n\n``recommended_to_connect`` is the subset of the skill's recommended app slugs the tenant has NOT\nconnected yet, and the dashboard shows a friendly nudge (with the existing connect flow) for each."},"AuthoredSkillDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"provenance_code":{"type":"string","title":"Provenance Code"},"archetype_code":{"type":"string","title":"Archetype Code"},"in_use":{"type":"boolean","title":"In Use","default":false},"can_manage":{"type":"boolean","title":"Can Manage","default":false},"authored_by_caller":{"type":"boolean","title":"Authored By Caller","default":false},"versions":{"items":{"$ref":"#/components/schemas/AuthoredVersionSummary"},"type":"array","title":"Versions"},"latest_manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Latest Manifest"},"installation":{"anyOf":[{"$ref":"#/components/schemas/InstallationSummary"},{"type":"null"}]}},"type":"object","required":["id","slug","title","provenance_code","archetype_code"],"title":"AuthoredSkillDetail","description":"One authored skill + its version history + the latest editable manifest (for the editor)."},"AuthoredSkillFilesRequest":{"properties":{"base_version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Base Version Id"},"manifest_yaml":{"type":"string","title":"Manifest Yaml"},"files":{"items":{"$ref":"#/components/schemas/AuthoredBundleFilePayload"},"type":"array","title":"Files"}},"type":"object","required":["manifest_yaml"],"title":"AuthoredSkillFilesRequest","description":"A complete replacement for an authored skill's editable manifest and text files."},"AuthoredSkillFilesResponse":{"properties":{"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"base_version_id":{"type":"string","format":"uuid","title":"Base Version Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"semver":{"type":"string","title":"Semver"},"manifest_yaml":{"type":"string","title":"Manifest Yaml"},"files":{"items":{"$ref":"#/components/schemas/AuthoredBundleFile"},"type":"array","title":"Files"},"health":{"$ref":"#/components/schemas/SkillHealthReport"},"can_manage":{"type":"boolean","title":"Can Manage"}},"type":"object","required":["skill_id","base_version_id","slug","title","semver","manifest_yaml","health","can_manage"],"title":"AuthoredSkillFilesResponse","description":"The newest editable version, its files, its health, and caller authority."},"AuthoredSkillSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"provenance_code":{"type":"string","title":"Provenance Code"},"archetype_code":{"type":"string","title":"Archetype Code"},"in_use":{"type":"boolean","title":"In Use","default":false},"can_manage":{"type":"boolean","title":"Can Manage","default":false},"authored_by_caller":{"type":"boolean","title":"Authored By Caller","default":false}},"type":"object","required":["id","slug","title","provenance_code","archetype_code"],"title":"AuthoredSkillSummary","description":"A tenant's authored skill (list row)."},"AuthoredVersionSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"semver":{"type":"string","title":"Semver"},"status_code":{"type":"string","title":"Status Code"},"source_kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Kind"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","semver","status_code","created_at"],"title":"AuthoredVersionSummary","description":"One authored version (history row)."},"AutoApproveActorResponse":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"tenant_enabled":{"type":"boolean","title":"Tenant Enabled"},"durable_tool_refs":{"items":{"type":"string"},"type":"array","title":"Durable Tool Refs"},"floor_tiers":{"items":{"$ref":"#/components/schemas/RiskTier"},"type":"array","title":"Floor Tiers"},"eligible_tiers":{"items":{"$ref":"#/components/schemas/RiskTier"},"type":"array","title":"Eligible Tiers"}},"type":"object","required":["actor_id","tenant_enabled","durable_tool_refs","floor_tiers","eligible_tiers"],"title":"AutoApproveActorResponse","description":"An actor's auto-approve view for the settings UI: the tenant switch + their durable grants."},"AutoEnrollmentItem":{"properties":{"template_key":{"type":"string","title":"Template Key"},"title":{"type":"string","title":"Title"},"enabled":{"type":"boolean","title":"Enabled"},"turned_off_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Turned Off At"},"turned_off_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Turned Off By Email"}},"type":"object","required":["template_key","title","enabled","turned_off_at","turned_off_by_email"],"title":"AutoEnrollmentItem"},"AutoEnrollmentList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/AutoEnrollmentItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"AutoEnrollmentList"},"AutoEnrollmentUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"AutoEnrollmentUpdate","description":"PUT body. ``enabled`` is a strict boolean, so a JSON ``0`` or ``\"false\"`` is a 422, never a silent switch."},"AutoRefillConfigUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold":{"anyOf":[{"type":"number","minimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Threshold"},"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount"},"monthly_cap":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Monthly Cap"}},"additionalProperties":false,"type":"object","required":["enabled","threshold","amount","monthly_cap"],"title":"AutoRefillConfigUpdate","description":"PUT body: set (upsert) a tenant's auto-refill config.\n\nA full replace of the tenant's single config (1:1), so the dashboard's \"save\" posts the\nwhole desired state. ``amount`` must equal a ladder rung's credit count (that's the\nprice we charge off-session); ``monthly_cap >= amount >= MIN_AUTO_REFILL_CREDITS`` and\n``threshold >= 0`` mirror the model validators."},"AutoRefillConfigView":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"threshold":{"type":"integer","title":"Threshold"},"amount":{"type":"integer","title":"Amount"},"monthly_cap":{"type":"integer","title":"Monthly Cap"}},"type":"object","required":["enabled","threshold","amount","monthly_cap"],"title":"AutoRefillConfigView","description":"GET view of a tenant's auto-refill config (the dashboard toggle + thresholds).\n\n``enabled`` is derived from ``enabled_at`` (opt-in gate); ``armed_at`` is never exposed\n(engine-internal). All credit values are whole-credit ints for display."},"AutojoinStateView":{"properties":{"active":{"type":"boolean","title":"Active","description":"True when auto-join would actually run for this person's meetings."},"blockers":{"items":{"type":"string"},"type":"array","title":"Blockers","description":"Why auto-join is not active, in fix-it order: 'recording_off', 'team_autojoin_off', 'personal_autojoin_off', 'calendar_not_connected'. Empty when active."}},"type":"object","required":["active"],"title":"AutojoinStateView","description":"The resolved auto-join decision for the caller, with machine-readable blockers."},"AutomationInstructionsRequest":{"properties":{"instructions":{"anyOf":[{"type":"string","maxLength":40000},{"type":"null"}],"title":"Instructions"},"expected_instructions":{"anyOf":[{"type":"string","maxLength":40000},{"type":"null"}],"title":"Expected Instructions"}},"additionalProperties":false,"type":"object","required":["instructions","expected_instructions"],"title":"AutomationInstructionsRequest"},"BDeclarationMode":{"type":"string","enum":["fixed","omitted","model_text","model_selected_resource","server_resolved"],"title":"BDeclarationMode"},"BeliefGroup":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["code","label","count"],"title":"BeliefGroup","description":"One non-empty provenance family in the search-filtered corpus."},"BeliefItem":{"properties":{"id":{"type":"string","title":"Id","description":"Opaque id: a memory/lesson UUID, or 'company:<field>' for a company fact."},"kind":{"type":"string","title":"Kind","description":"One of 'memory' | 'lesson' | 'fact'."},"kind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind Code","description":"Raw memory kind, or null for a company fact."},"kind_label":{"type":"string","title":"Kind Label","description":"Friendly memory-kind label. Never a raw code."},"source":{"type":"string","title":"Source","description":"Provenance code (e.g. lesson_promoted, review, company_profile)."},"source_label":{"type":"string","title":"Source Label","description":"Friendly provenance label, e.g. 'learned lesson'."},"group":{"type":"string","title":"Group","description":"Provenance family code."},"group_label":{"type":"string","title":"Group Label","description":"Friendly provenance-family label. Never a raw code."},"origin_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Origin Title","description":"Human name of the place the memory came from, when known."},"content":{"type":"string","title":"Content"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At","description":"When Patricia learned the item, or null when the source has no creation time."},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"The last write to the row. The Curator's 6-hourly decay sweep restamps this value. It is never a learn time and must never be labelled 'learned'."},"editable":{"type":"boolean","title":"Editable","default":false},"forgettable":{"type":"boolean","title":"Forgettable","default":false}},"type":"object","required":["id","kind","kind_code","kind_label","source","source_label","group","group_label","origin_title","content","created_at"],"title":"BeliefItem","description":"One thing Patricia believes for this tenant, ready to render as a card."},"BeliefList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BeliefItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"True count of items matching the request filters."},"groups":{"items":{"$ref":"#/components/schemas/BeliefGroup"},"type":"array","title":"Groups","description":"Non-empty family counts over the search-filtered corpus, ignoring kind and group filters."},"new_since_yesterday":{"type":"integer","title":"New Since Yesterday","description":"Search-filtered items learned during the last 24 hours, excluding company facts."}},"type":"object","required":["items","total","groups","new_since_yesterday"],"title":"BeliefList","description":"A page of beliefs plus stable corpus counts."},"BillToUpdate":{"properties":{"billing_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Billing Name"},"billing_email":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Billing Email"},"billing_address_line1":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Billing Address Line1"},"billing_address_line2":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Billing Address Line2"},"billing_city":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Billing City"},"billing_state":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Billing State"},"billing_postal_code":{"anyOf":[{"type":"string","maxLength":20},{"type":"null"}],"title":"Billing Postal Code"},"billing_country":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Billing Country"},"billing_tax_id":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Billing Tax Id"}},"type":"object","title":"BillToUpdate","description":"PUT body: replace the tenant's billing profile (all fields, blank clears a field).\n\nA full-replace (not a patch): the dashboard form always submits every field, and\nwhitespace-only values normalize to ``None`` so a cleared input truly clears the column."},"BillToView":{"properties":{"billing_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Name"},"billing_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Email"},"billing_address_line1":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Address Line1"},"billing_address_line2":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Address Line2"},"billing_city":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing City"},"billing_state":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing State"},"billing_postal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Postal Code"},"billing_country":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Country"},"billing_tax_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Billing Tax Id"}},"type":"object","title":"BillToView","description":"GET /v1/billing/bill-to: the tenant's billing profile (the invoice \"Bill to\" block).\n\nAll fields optional: an empty profile is valid (invoices fall back to the workspace\ndisplay name). Snapshotted onto each invoice at creation, so edits only affect future\ninvoices."},"BillingPlan":{"type":"string","enum":["team","business"],"title":"BillingPlan","description":"A purchasable seat plan, mapped to a per-seat recurring Stripe price (legacy).\n\nSuperseded by the flat Founding subscription (``CheckoutKind.SUBSCRIPTION`` needs no\nplan); kept so the legacy seat checkout path still validates for historical callers."},"BillingSummary":{"properties":{"tier":{"$ref":"#/components/schemas/BillingTier"},"status":{"type":"string","title":"Status"},"seats":{"type":"integer","title":"Seats"},"credits_remaining":{"type":"integer","title":"Credits Remaining","description":"Legacy prepaid credit-pack balance in whole legacy retail credits, floored from the micro-USD ledger. The retail peg is RETAIL_MICRO_USD_PER_CREDIT = 1,000 micro-USD per credit. This balance still funds work. Drawdown cascades into this ledger after credit_balance is exhausted. Legacy retail credits and Patricia credits are different credit units; never add the raw numbers. These are display balances. Admission is decided server-side from the unrounded ledgers; neither field nor their combination determines whether Patricia will run."},"credit_balance":{"type":"number","title":"Credit Balance","description":"The workspace's balance in Patricia credits, a COGS-denominated credit unit, scaled from whole hundredths for display with at most two decimal places. Drawdown spends this ledger first, then cascades into the legacy credits_remaining ledger. The dashboard shows this balance as credits available. Patricia credits and legacy retail credits are different credit units; never add the raw numbers. These are display balances. Admission is decided server-side from the unrounded ledgers; neither field nor their combination determines whether Patricia will run."},"monthly_credit_grant":{"type":"integer","title":"Monthly Credit Grant"},"cancel_at_period_end":{"type":"boolean","title":"Cancel At Period End"},"current_period_end":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Current Period End"},"has_active_subscription":{"type":"boolean","title":"Has Active Subscription"},"stripe_publishable_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Publishable Key"},"auto_refill":{"anyOf":[{"$ref":"#/components/schemas/AutoRefillConfigView"},{"type":"null"}]},"has_payment_method":{"type":"boolean","title":"Has Payment Method","default":false},"starter_verification_required":{"type":"boolean","title":"Starter Verification Required","default":false},"starter_verification_reason":{"anyOf":[{"type":"string","enum":["card_verification","challenge_verification"]},{"type":"null"}],"title":"Starter Verification Reason"},"custom_plan":{"anyOf":[{"$ref":"#/components/schemas/CustomPlanView"},{"type":"null"}]},"holds_live_subscription":{"type":"boolean","title":"Holds Live Subscription","default":false},"next_payment_attempt_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Payment Attempt At"},"payment_recovery_state":{"anyOf":[{"type":"string","enum":["retrying","action_needed","failed","ended"]},{"type":"null"}],"title":"Payment Recovery State"}},"type":"object","required":["tier","status","seats","credits_remaining","credit_balance","monthly_credit_grant","cancel_at_period_end","current_period_end","has_active_subscription","stripe_publishable_key"],"title":"BillingSummary","description":"GET /v1/billing: the tenant's current plan, credit balance, and publishable key."},"BillingTier":{"type":"string","enum":["free","founding","team","business","enterprise","custom"],"title":"BillingTier","description":"The subscription tier (price anchor + included-credit allowance).\n\n``FOUNDING`` is the Pricing-v2 self-serve plan ($45/mo → 20,000 credits/period,\nfull rollover); ``TEAM``/``BUSINESS`` are the legacy per-seat tiers kept for\nhistorical rows during the transition. ``ENTERPRISE`` stays a manual, off-catalog\nsale. ``CUSTOM`` is a staff-attached negotiated Stripe price — see\n``services.billing.validate_negotiated_price``."},"BrainDocScope":{"type":"string","enum":["company","group","team","domain","agent"],"title":"BrainDocScope"},"BrainDocScopeRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"BrainDocScopeRefReferenceFullValidator"},"BrainStats":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"memory_totals":{"$ref":"#/components/schemas/MemoryTotals"},"by_scope_kind":{"items":{"$ref":"#/components/schemas/ScopeKindCount"},"type":"array","title":"By Scope Kind"},"salience_histogram":{"items":{"$ref":"#/components/schemas/SalienceBucket"},"type":"array","title":"Salience Histogram"},"docs_by_scope_status":{"items":{"$ref":"#/components/schemas/DocScopeStatusCount"},"type":"array","title":"Docs By Scope Status"},"per_group":{"items":{"$ref":"#/components/schemas/GroupBreakdown"},"type":"array","title":"Per Group"},"recent_docs":{"items":{"$ref":"#/components/schemas/RecentDoc"},"type":"array","title":"Recent Docs"}},"type":"object","required":["tenant_id","memory_totals","by_scope_kind","salience_histogram","docs_by_scope_status","per_group","recent_docs"],"title":"BrainStats","description":"Full memory-structure snapshot for one tenant."},"BrandFieldReadiness":{"properties":{"path":{"type":"string","title":"Path"},"state":{"type":"string","title":"State"},"label":{"type":"string","title":"Label"}},"type":"object","required":["path","state","label"],"title":"BrandFieldReadiness","description":"A single field an output still wants, with its warm label (never a blocker, just a nudge)."},"BrandFieldState":{"properties":{"state":{"type":"string","title":"State"},"source":{"type":"string","title":"Source"},"label":{"type":"string","title":"Label","default":""},"confirmed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed By"},"confirmed_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Confirmed At"},"legibility":{"anyOf":[{"type":"string","enum":["ok","low_contrast","unknown"]},{"type":"null"}],"title":"Legibility"}},"type":"object","required":["state","source"],"title":"BrandFieldState","description":"One field's provenance for the dashboard: internal state + a warm, non-technical label.\n\n``label`` supplies display copy for non-confirmed states. Confirmed states stay quiet with an\nempty label, and the dashboard never hard-codes this copy.\n\n``legibility`` rides logo entries only: a warn-only contrast verdict (``\"ok\"`` / ``\"low_contrast\"``\n/ ``\"unknown\"``) for whether the logo reads on its slot's background. ``None`` on every non-logo\nfield and on logos written before the safeguard existed (they classify on their next write)."},"BrandLogoSlot":{"properties":{"slot":{"type":"string","title":"Slot"},"mode":{"type":"string","title":"Mode"},"url":{"type":"string","title":"Url"}},"type":"object","required":["slot","mode","url"],"title":"BrandLogoSlot","description":"One resolved logo variant (slot × mode) with its self-hosted capability URL."},"BrandNudge":{"properties":{"path":{"type":"string","title":"Path"},"state":{"type":"string","title":"State"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","enum":["confirm","add","addons_off"],"title":"Kind"},"tone":{"type":"string","enum":["attention","neutral"],"title":"Tone"}},"type":"object","required":["path","state","label","kind","tone"],"title":"BrandNudge","description":"One readiness chip: a confirmation, missing add-on field, or switched-off add-on summary."},"BrandOutputReadiness":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"},"live":{"type":"boolean","title":"Live"},"ready":{"type":"boolean","title":"Ready"},"confirmed_count":{"type":"integer","title":"Confirmed Count"},"required_count":{"type":"integer","title":"Required Count"},"needs":{"items":{"$ref":"#/components/schemas/BrandFieldReadiness"},"type":"array","title":"Needs","default":[]}},"type":"object","required":["code","label","live","ready","confirmed_count","required_count"],"title":"BrandOutputReadiness","description":"How prepared the kit is for one output. ``ready`` is informational and never gates it."},"BrandReadiness":{"properties":{"completeness_pct":{"type":"integer","title":"Completeness Pct","default":0},"outputs":{"items":{"$ref":"#/components/schemas/BrandOutputReadiness"},"type":"array","title":"Outputs","default":[]},"nudges":{"items":{"$ref":"#/components/schemas/BrandNudge"},"type":"array","title":"Nudges","default":[]}},"type":"object","title":"BrandReadiness","description":"The kit's completeness meter + per-output readiness. An encouragement signal, never a gate."},"BrandThemeUpdate":{"properties":{"default":{"type":"string","enum":["light","dark","ask"],"title":"Default"}},"additionalProperties":false,"type":"object","required":["default"],"title":"BrandThemeUpdate","description":"The preferred starting mode for outputs that support both themes."},"BrandWordsUpdate":{"properties":{"never_use":{"items":{"type":"string"},"type":"array","title":"Never Use"},"claims":{"items":{"type":"string"},"type":"array","title":"Claims"}},"additionalProperties":false,"type":"object","required":["never_use","claims"],"title":"BrandWordsUpdate","description":"Words and claims guidance edited together by the Brand Kit screen."},"BrowserLoginListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BrowserLoginResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"BrowserLoginListResponse"},"BrowserLoginResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Identifier of this sign-in, for the forget call."},"site":{"type":"string","title":"Site","description":"The site the sign-in is for, for example 'example.com'."},"origins":{"items":{"type":"string"},"type":"array","title":"Origins","description":"Every site whose cookies the sign-in keeps."},"status":{"type":"string","title":"Status","description":"'active', or 'revoking' while the browser service deletes it."},"consented_at":{"type":"string","format":"date-time","title":"Consented At","description":"When the person chose to keep it."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"When it is deleted on its own."},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At","description":"When a task last used it."}},"type":"object","required":["id","site","origins","status","consented_at","expires_at"],"title":"BrowserLoginResponse","description":"One site the person is signed in to for Patricia's browser."},"BrowserViewAnswer":{"properties":{"status":{"type":"string","enum":["done","cancel","stale"],"title":"Status","description":"'done' or 'cancel' when Patricia got the answer, 'stale' when the browser had already closed."}},"type":"object","required":["status"],"title":"BrowserViewAnswer","description":"What the answer did."},"BrowserViewAnswerBody":{"properties":{"code":{"type":"string","maxLength":128,"minLength":16,"format":"password","title":"Code","writeOnly":true},"answer":{"type":"string","enum":["done","cancel"],"title":"Answer"}},"additionalProperties":false,"type":"object","required":["code","answer"],"title":"BrowserViewAnswerBody","description":"The person's answer from the page: they finished, or they stop."},"BrowserViewCodeBody":{"properties":{"code":{"type":"string","maxLength":128,"minLength":16,"format":"password","title":"Code","writeOnly":true}},"additionalProperties":false,"type":"object","required":["code"],"title":"BrowserViewCodeBody","description":"The page's link code, read from the page's address."},"BrowserViewLiveView":{"properties":{"url":{"type":"string","title":"Url","description":"The live view to show in the page's frame. A bearer credential: never store it."}},"type":"object","required":["url"],"title":"BrowserViewLiveView","description":"The live browser's address, for the page's frame only."},"BrowserViewSession":{"properties":{"site":{"type":"string","title":"Site","description":"The site the person is asked to use, for example 'example.com'."},"reason":{"type":"string","title":"Reason","description":"Why Patricia asks, in the person's words, for example 'Sign in to example.com'."},"expires_at":{"type":"string","format":"date-time","title":"Expires At","description":"When the page stops working."},"opened_here":{"type":"boolean","title":"Opened Here","description":"Whether this browser opened the page, so it can show the browser now."}},"type":"object","required":["site","reason","expires_at","opened_here"],"title":"BrowserViewSession","description":"What the page shows around the live browser."},"BugReportSource":{"type":"string","enum":["slack","teams","web","email","system"],"title":"BugReportSource","description":"Where a report originated. For a chat report it is the platform (``slack`` / ``teams``); the\ncolumn is also the seam for external reporters (a public web form, an inbound email) later, so the\nsweep is source-neutral. Derived from the reporting platform, never hardcoded (a Teams report must\nnot be stamped ``slack``)."},"BugReportStatus":{"type":"string","enum":["new","triaging","shipping","shipped","duplicate","rejected","drafted","cancel_requested","failed"],"title":"BugReportStatus","description":"The triage lifecycle of a single bug report (plain ``String`` column, not a PG enum)."},"BuiltInTemplateConfigOption":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"}},"type":"object","required":["value","label"],"title":"BuiltInTemplateConfigOption"},"BuiltInTemplateListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BuiltInTemplateStatus"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"BuiltInTemplateListResponse"},"BuiltInTemplateNeeds":{"properties":{"apps":{"items":{"$ref":"#/components/schemas/NeededApp"},"type":"array","title":"Apps","description":"The apps the folder names, with the labels the dashboard shows."},"app_rule":{"type":"string","enum":["any_of","all_of"],"title":"App Rule","description":"any_of: one of the apps is enough. all_of: every app is needed."},"checked":{"type":"string","enum":["before_turning_on","before_each_run"],"title":"Checked","description":"When the apps are checked: when the person turns it on, or at each run."},"needs_workspace_admin":{"type":"boolean","title":"Needs Workspace Admin","description":"True when only a workspace admin may add or resume it."},"connect_first":{"anyOf":[{"$ref":"#/components/schemas/ConnectFirstDialog"},{"type":"null"}],"description":"The dialog that asks the person to connect an app first. Set when checked before turning on."}},"type":"object","required":["apps","app_rule","checked","needs_workspace_admin","connect_first"],"title":"BuiltInTemplateNeeds","description":"What the automation's folder says it needs before it can run."},"BuiltInTemplateStatus":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"enabled":{"type":"boolean","title":"Enabled"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"cron_job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cron Job Id"},"trigger_kind":{"type":"string","enum":["cron","per_meeting","before_each_meeting"],"title":"Trigger Kind"},"instructions_status":{"type":"string","enum":["available","unavailable","unknown"],"title":"Instructions Status"},"teammate_watch_on":{"type":"boolean","title":"Teammate Watch On","default":false},"created_by_teammate":{"type":"boolean","title":"Created By Teammate","default":false},"created":{"type":"boolean","title":"Created","default":false},"config":{"anyOf":[{"$ref":"#/components/schemas/EmailSweepConfig"},{"$ref":"#/components/schemas/DailyBriefConfig"},{"$ref":"#/components/schemas/AdAnomalyWatchConfig"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"config_options":{"additionalProperties":{"items":{"$ref":"#/components/schemas/BuiltInTemplateConfigOption"},"type":"array"},"type":"object","title":"Config Options"},"email_account_options":{"items":{"$ref":"#/components/schemas/MailboxOption"},"type":"array","title":"Email Account Options"},"needs":{"anyOf":[{"$ref":"#/components/schemas/BuiltInTemplateNeeds"},{"type":"null"}],"description":"What the template needs before it can run. Null when it needs nothing."},"reads_mail":{"type":"boolean","title":"Reads Mail","description":"True when the template reads the person's mailboxes and offers a choice of which.","default":false},"settings":{"items":{"$ref":"#/components/schemas/ConfigFieldSchema"},"type":"array","title":"Settings","description":"The fields the automation's folder declares for the person to fill in. Empty for none."},"fixed_local_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fixed Local Time","description":"The local HH:MM a fixed-schedule template always runs at, Monday to Friday, in the person's own timezone and direct messages. Null when the person chooses the schedule.","examples":["12:00"]}},"type":"object","required":["key","title","description","enabled","schedule","local_schedule","timezone","cron_job_id","trigger_kind","instructions_status"],"title":"BuiltInTemplateStatus"},"BulkTriageRequest":{"properties":{"score_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Score Ids"},"status_code":{"type":"string","title":"Status Code","description":"The triage state to apply to every selected card."}},"additionalProperties":false,"type":"object","required":["score_ids","status_code"],"title":"BulkTriageRequest","description":"Move a selection of cards to one triage state."},"BulkTriageResult":{"properties":{"updated":{"type":"integer","title":"Updated"},"status_code":{"type":"string","title":"Status Code"}},"type":"object","required":["updated","status_code"],"title":"BulkTriageResult","description":"What the sweep changed."},"CalendarConnectionView":{"properties":{"personal_connected":{"type":"boolean","title":"Personal Connected","description":"The caller has connected their own calendar."},"team_connected":{"type":"boolean","title":"Team Connected","description":"A team-shared calendar connection exists."},"connected_provider_slugs":{"items":{"type":"string"},"type":"array","title":"Connected Provider Slugs","description":"Which calendar providers the caller has personally connected (e.g. googlecalendar, outlook)."}},"type":"object","required":["personal_connected","team_connected"],"title":"CalendarConnectionView","description":"Whether a calendar is connected: the caller's own, and one shared with the team."},"CampaignGoal":{"properties":{"platform":{"type":"string","enum":["google_ads","meta","linkedin"],"title":"Platform","description":"\"google_ads\", \"meta\" or \"linkedin\"."},"campaign_id":{"type":"string","title":"Campaign Id","description":"The campaign's number ID from the ad platform, never its name."},"metric":{"type":"string","enum":["cpa","roas"],"title":"Metric","description":"\"cpa\" or \"roas\"."},"floor":{"type":"number","title":"Floor","description":"The break-even line for this campaign, in its metric's unit."},"action":{"type":"string","title":"Action","description":"The action agreed with the client when the campaign passes its floor, for example \"cut the budget\" or \"tell me only\"."}},"additionalProperties":false,"type":"object","required":["platform","campaign_id","metric","floor","action"],"title":"CampaignGoal","description":"A campaign with its own break-even line and the action agreed for when it passes it."},"CanvaReturnRequest":{"properties":{"correlation_jwt":{"type":"string","title":"Correlation Jwt"}},"additionalProperties":false,"type":"object","required":["correlation_jwt"],"title":"CanvaReturnRequest","description":"A Canva return-navigation JWT supplied by the console landing page."},"CanvaReturnResponse":{"properties":{"asset_id":{"type":"string","format":"uuid","title":"Asset Id"},"design_id":{"type":"string","title":"Design Id"}},"additionalProperties":false,"type":"object","required":["asset_id","design_id"],"title":"CanvaReturnResponse","description":"The verified design and the caller-visible Patricia asset it names."},"CaseRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"status_code":{"type":"string","title":"Status Code"},"reason_code":{"type":"string","title":"Reason Code"},"target_tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Target Tenant Id"},"candidate_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Candidate User Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"has_approved_manifest":{"type":"boolean","title":"Has Approved Manifest","description":"Whether this case carries a decision that commit would accept: both the stored document and its digest are present."},"issuer":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Issuer"},"subject":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject"},"subject_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Subject Scope"},"platform_team_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Team Id"},"platform_actor_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Actor Id"},"expected_credential_epoch":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Expected Credential Epoch"},"incoming_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incoming Email"},"candidate_display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Candidate Display Name"}},"type":"object","required":["id","status_code","reason_code","target_tenant_id","candidate_user_id","created_at","expires_at","has_approved_manifest"],"title":"CaseRow","description":"One case in the operator queue: the identifiers, plus what a human needs to recognise them.\n\nThe identifiers are the record and the label beside them is orientation. The candidate's name\nis optional and mutable — an account is deleted and its name goes with it — so it is served\nnext to the stable id it describes rather than in place of it, and a missing label says so\ninstead of rendering blank.\n\n**This row carries the captured address, and that reverses an earlier decision.** It used to\nserve only a boolean saying whether that address matched the candidate's, on the reasoning that\nthis queue spans every workspace and an address is the one field identifying somebody outside\nour own identifier space.\nThat reasoning is sound and it was overruled on 2026-08-24: without the address an operator\ncannot answer the question the screen exists to ask, so the queue served six opaque ids and no\nway to act on them. The disclosure carries its own cost instead — the list route sets\n``no_store`` and commits a platform read-audit row before any address is returned."},"CatalogApp":{"properties":{"app_slug":{"type":"string","title":"App Slug"},"name":{"type":"string","title":"Name"},"provider":{"type":"string","title":"Provider"},"logo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo"},"description":{"type":"string","title":"Description","default":""},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]},"managed":{"type":"boolean","title":"Managed","default":false},"native":{"type":"boolean","title":"Native","default":false},"managed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Managed By"},"pricing":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pricing"},"connected_account_count":{"type":"integer","title":"Connected Account Count","default":0},"team_only_connect":{"type":"boolean","title":"Team Only Connect","default":false},"connected":{"type":"boolean","title":"Connected","readOnly":true}},"type":"object","required":["app_slug","name","provider","connected"],"title":"CatalogApp","description":"A catalog app with ownership, pricing, and caller-visible connection state."},"CatalogResponse":{"properties":{"featured":{"items":{"$ref":"#/components/schemas/CatalogApp"},"type":"array","title":"Featured"},"managed":{"items":{"$ref":"#/components/schemas/CatalogApp"},"type":"array","title":"Managed","default":[]},"items":{"items":{"$ref":"#/components/schemas/CatalogApp"},"type":"array","title":"Items","default":[]},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor"},"total":{"type":"integer","title":"Total","default":0},"categories":{"items":{"type":"string"},"type":"array","title":"Categories","default":[]}},"type":"object","required":["featured"],"title":"CatalogResponse"},"CatalogSkillConfigResponse":{"properties":{"installation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Installation Id"},"config_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Config Version"},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"fields":{"items":{"$ref":"#/components/schemas/ConfigFieldSchema"},"type":"array","title":"Fields"},"values":{"additionalProperties":true,"type":"object","title":"Values"}},"type":"object","required":["fields"],"title":"CatalogSkillConfigResponse","description":"The settings form for a catalog skill, resolved by SLUG so reading it before any install exists\ncreates no row: ``installation_id``/``config_version``/``status_code`` are ``None`` until one is.\n``fields`` is the install's pinned schema when a row exists, else the catalog's active version."},"CatalogSkillDetail":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_state":{"anyOf":[{"$ref":"#/components/schemas/SkillListingState"},{"type":"null"}]},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"is_workspace_skill":{"type":"boolean","title":"Is Workspace Skill"},"current_version_rating":{"anyOf":[{"$ref":"#/components/schemas/SkillRatingSummary"},{"type":"null"}]},"rating":{"anyOf":[{"$ref":"#/components/schemas/SkillRatingSummary"},{"type":"null"}]},"rating_history":{"items":{"$ref":"#/components/schemas/SkillVersionRatingSummary"},"type":"array","title":"Rating History"},"own_rating":{"anyOf":[{"$ref":"#/components/schemas/OwnSkillRatingSummary"},{"type":"null"}]}},"type":"object","required":["slug","title","is_workspace_skill"],"title":"CatalogSkillDetail","description":"One skill's title + rendered guide — the run timeline's \"See skill\" peek drawer.\n\nResolved by slug GLOBAL-first (``GET /skill-catalog/{slug}``): an audience-visible global catalog\nskill first, else a hidden global this workspace has installed and the runtime would actually load,\nelse the workspace's own skill (through the same occupancy fence every installation-id route uses).\nGlobal-first matches the runtime's own tie-break — ``_drop_shadowed_tenant_skills``\n(``services.skill_platform.availability``) drops a tenant entry whose slug a platform-owned entry\nIN THE RUNTIME'S EFFECTIVE SET already holds (installed-and-active, or released-by-default), trusted\nwins the tie — so the drawer never shows tenant-authored content under a slug the platform actually\nshadows with, and describes the definition the run actually loaded, on the version the run actually\nused. A platform-owned row this workspace has NOT installed and that is not offered by default never\nshadows a same-slug tenant skill: the runtime never loaded it either, so refusing here would 404 a\nskill the run actually ran. Every refusal — unknown slug, an installed global the runtime would not\nadmit (wrong archetype/provenance, archived, paused, or killed), another member's personal skill, an\nauthor's own uninstalled skill, or another tenant's — answers with the same 404, so the response\nnever discloses which one it was. Display + guidance text only, never a personal fact (G4)."},"CatalogSkillSummary":{"properties":{"slug":{"type":"string","title":"Slug"},"title":{"type":"string","title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_state":{"$ref":"#/components/schemas/SkillListingState"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"taxonomy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taxonomy"},"stage":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stage"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"integrations_required":{"items":{"type":"string"},"type":"array","title":"Integrations Required"},"integrations_recommended":{"items":{"type":"string"},"type":"array","title":"Integrations Recommended"},"installed":{"type":"boolean","title":"Installed","default":false},"default_suppressed":{"type":"boolean","title":"Default Suppressed","default":false},"default_restore_would_lose_settings":{"type":"boolean","title":"Default Restore Would Lose Settings","default":false},"default_enabled":{"type":"boolean","title":"Default Enabled","default":false},"installation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Installation Id"},"installation_status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Installation Status Code"},"install_count_band":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Install Count Band"},"use_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Use Count"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"rating":{"anyOf":[{"$ref":"#/components/schemas/SkillRatingSummary"},{"type":"null"}]},"has_settings":{"type":"boolean","title":"Has Settings"},"effectively_enabled":{"type":"boolean","title":"Effectively Enabled"},"default_capable":{"type":"boolean","title":"Default Capable"}},"type":"object","required":["slug","title","listing_state","has_settings","effectively_enabled","default_capable"],"title":"CatalogSkillSummary","description":"One installable catalog skill + this workspace's install overlay: the dashboard catalog card.\n\nThe catalog rows are the released platform offer (``SkillDefinitionRepository.list_global``: trusted\nprovenance, inside this workspace's listing audience, not archived, with an active version).\n``listing_state`` lets a testing workspace mark testing skills. The install fields overlay this\ntenant's own install. Staff test-installs never count."},"ChannelOptionSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_private":{"type":"boolean","title":"Is Private","default":false},"is_member":{"type":"boolean","title":"Is Member","default":false}},"type":"object","required":["id","name"],"title":"ChannelOptionSummary","description":"One workspace channel option for the channel picker (a friendly, non-technical config input).\n\n``is_member`` is whether Patricia is already IN the channel; the picker warns when she isn't, since\nshe can only post to channels she has joined."},"ChatPlatform":{"type":"string","enum":["slack","microsoft_teams","not_yet"],"title":"ChatPlatform","description":"The chat platform a workspace has installed, or ``not_yet`` when it has installed neither.\n\nSpelled in full so it cannot be misread as the ``team`` step, which is about membership."},"ChatPlatformEntry":{"properties":{"code":{"type":"string","title":"Code","description":"The platform code stored on actors, conversations and installations."},"chat_platform":{"type":"string","enum":["slack","microsoft_teams"],"title":"Chat Platform","description":"The value the onboarding endpoints use for this platform, in fields such as `chat_platform`."},"display_name":{"type":"string","title":"Display Name","description":"The customer-facing name, e.g. \"Microsoft Teams\"."},"connect_releases_starter_credits":{"type":"boolean","title":"Connect Releases Starter Credits","description":"Whether installing this platform releases a first workspace's held starter credits."}},"type":"object","required":["code","chat_platform","display_name","connect_releases_starter_credits"],"title":"ChatPlatformEntry","description":"One chat platform, as the dashboard names and offers it."},"ChatPlatformsResponse":{"properties":{"platforms":{"items":{"$ref":"#/components/schemas/ChatPlatformEntry"},"type":"array","title":"Platforms"}},"type":"object","required":["platforms"],"title":"ChatPlatformsResponse","description":"Every chat platform a workspace can connect, in the order the dashboard lists them."},"ChatStyle":{"properties":{"length":{"anyOf":[{"type":"string","enum":["brief","balanced","detailed"]},{"type":"null"}],"title":"Length"},"formality":{"anyOf":[{"type":"string","enum":["casual","neutral","formal"]},{"type":"null"}],"title":"Formality"},"greetings":{"anyOf":[{"type":"string","enum":["none","brief","warm"]},{"type":"null"}],"title":"Greetings"},"signoffs":{"anyOf":[{"type":"string","enum":["none","brief","warm"]},{"type":"null"}],"title":"Signoffs"},"emoji":{"anyOf":[{"type":"string","enum":["none","occasional","frequent"]},{"type":"null"}],"title":"Emoji"},"phrasing":{"anyOf":[{"type":"string","enum":["direct","conversational","explanatory"]},{"type":"null"}],"title":"Phrasing"},"capitalization":{"anyOf":[{"type":"string","enum":["standard","mostly_lowercase"]},{"type":"null"}],"title":"Capitalization"},"punctuation":{"anyOf":[{"type":"string","enum":["minimal","standard","expressive"]},{"type":"null"}],"title":"Punctuation"},"structure":{"anyOf":[{"type":"string","enum":["short_lines","paragraphs","lists"]},{"type":"null"}],"title":"Structure"},"humor":{"anyOf":[{"type":"string","enum":["none","occasional","frequent"]},{"type":"null"}],"title":"Humor"},"sarcasm":{"anyOf":[{"type":"string","enum":["none","occasional","frequent"]},{"type":"null"}],"title":"Sarcasm"},"voice":{"anyOf":[{"type":"string","maxLength":300},{"type":"null"}],"title":"Voice"},"signature_phrases":{"items":{"type":"string"},"type":"array","maxItems":5,"title":"Signature Phrases"}},"additionalProperties":false,"type":"object","title":"ChatStyle"},"ChatStyleResponse":{"properties":{"style":{"anyOf":[{"$ref":"#/components/schemas/ChatStyle"},{"type":"null"}]},"source":{"anyOf":[{"type":"string","enum":["learned","edited"]},{"type":"null"}],"title":"Source"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"},"enabled":{"type":"boolean","title":"Enabled","description":"Whether staff turned on talking in the owner's chat style for this workspace."},"data_use_enabled":{"type":"boolean","title":"Data Use Enabled","description":"Whether the workspace permits using its data for learning."}},"type":"object","required":["style","source","updated_at","enabled","data_use_enabled"],"title":"ChatStyleResponse"},"CheckoutKind":{"type":"string","enum":["subscription","topup","credits","setup"],"title":"CheckoutKind","description":"What a checkout session buys.\n\n* ``SUBSCRIPTION``: the flat $45/mo Founding plan (no seats, no plan needed).\n* ``TOPUP``: a one-time credit purchase from the 7-tier ladder (``topup_tier``).\n* ``CREDITS``: the legacy one-time credit pack (per-unit ``quantity``); retained\n  so the pre-v2 pack checkout keeps working until the ladder fully replaces it.\n* ``SETUP``: no charge; a ``mode=setup`` session that saves a card for auto-refill\n  (started via the dedicated setup-session endpoint, not ``/billing/checkout``)."},"CheckoutRequest":{"properties":{"kind":{"$ref":"#/components/schemas/CheckoutKind"},"plan":{"anyOf":[{"$ref":"#/components/schemas/BillingPlan"},{"type":"null"}]},"seats":{"type":"integer","maximum":10000.0,"minimum":1.0,"title":"Seats","default":1},"quantity":{"type":"integer","maximum":1000.0,"minimum":1.0,"title":"Quantity","default":1},"topup_tier":{"anyOf":[{"$ref":"#/components/schemas/TopupTier"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["kind"],"title":"CheckoutRequest","description":"POST /v1/billing/checkout body: start a Stripe Checkout Session.\n\n* ``subscription``: the flat Founding plan; ``plan``/``seats`` are ignored (a\n  ``plan`` is still accepted for the legacy per-seat path when one is supplied).\n* ``topup``: a one-time ladder purchase; ``topup_tier`` is required.\n* ``credits``: the legacy per-unit pack; ``quantity`` applies."},"CheckoutResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["checkout_url","session_id"],"title":"CheckoutResponse","description":"The hosted Checkout Session URL the dashboard redirects the buyer to."},"ClassASourceKind":{"type":"string","enum":["task_cron","event_trigger","scheduled_program","cued_proactive","sweep_proactive","onboarding","manual","spawn"],"title":"ClassASourceKind","description":"What kind of durable thing caused a Class-A run, for ``AgentRun.source_kind``.\n\nThe source is the JOB, PROGRAM, or EVENT, deliberately not the run and not the tool family. A\ndaily cron is ONE source that fires ninety times, and the question Phase 1 has to answer (\"how\nmuch would this source actually be asking a human?\") is unanswerable if each fire looks like an\nunrelated run."},"CommitResult":{"properties":{"case_id":{"type":"string","format":"uuid","title":"Case Id"},"severed_users":{"type":"integer","title":"Severed Users"},"accounts_transferred":{"type":"integer","title":"Accounts Transferred"},"accounts_quarantined":{"type":"integer","title":"Accounts Quarantined"},"accounts_disconnected":{"type":"integer","title":"Accounts Disconnected"},"chips_transferred":{"type":"integer","title":"Chips Transferred"},"chips_quarantined":{"type":"integer","title":"Chips Quarantined"},"connectors_repaired":{"type":"integer","title":"Connectors Repaired"}},"type":"object","required":["case_id","severed_users","accounts_transferred","accounts_quarantined","accounts_disconnected","chips_transferred","chips_quarantined","connectors_repaired"],"title":"CommitResult","description":"What the commit actually changed."},"CompanyFactUpdate":{"properties":{"key":{"type":"string","title":"Key"},"value":{"type":"string","maxLength":2000,"title":"Value"}},"type":"object","required":["key","value"],"title":"CompanyFactUpdate","description":"Edit one company-profile fact. ``key`` is a whitelisted brand-profile field."},"CompanyProfileResponse":{"properties":{"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url"},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name"},"target_audience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience"},"what_you_do":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"What You Do"},"differentiation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Differentiation"},"tone_of_voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone Of Voice"},"voice_warmth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Warmth"},"voice_formality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Formality"},"voice_length":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Length"},"voice_technical_depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Technical Depth"},"voice_emoji":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Emoji"},"sells":{"items":{"type":"string"},"type":"array","title":"Sells","default":[]},"brand_colors":{"items":{"type":"string"},"type":"array","title":"Brand Colors","default":[]},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url"},"analyzed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Analyzed At"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":false},"color_roles":{"additionalProperties":{"additionalProperties":{"type":"string"},"type":"object"},"type":"object","title":"Color Roles","default":{}},"chart_palette":{"items":{"type":"string"},"type":"array","title":"Chart Palette","default":[]},"chart_palettes":{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object","title":"Chart Palettes","default":{}},"typography":{"additionalProperties":true,"type":"object","title":"Typography","default":{}},"add_ons":{"additionalProperties":true,"type":"object","title":"Add Ons","default":{}},"theme":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Theme"},"brand_rules":{"additionalProperties":true,"type":"object","title":"Brand Rules","default":{}},"voice_traits":{"items":{"type":"string"},"type":"array","title":"Voice Traits","default":[]},"brand_words":{"additionalProperties":true,"type":"object","title":"Brand Words","default":{}},"field_states":{"additionalProperties":{"$ref":"#/components/schemas/BrandFieldState"},"type":"object","title":"Field States","default":{}},"brand_kit_version":{"type":"integer","title":"Brand Kit Version","default":1},"logos":{"items":{"$ref":"#/components/schemas/BrandLogoSlot"},"type":"array","title":"Logos","default":[]},"readiness":{"$ref":"#/components/schemas/BrandReadiness","default":{"completeness_pct":0,"outputs":[],"nudges":[]}}},"type":"object","title":"CompanyProfileResponse","description":"The company profile as the dashboard sees it (+ derived logo URL & onboarding flag)."},"CompanyProfileUpdate":{"properties":{"website_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Website Url","description":"The company website URL."},"brand_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand Name","description":"The company or brand name."},"target_audience":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Audience","description":"The people the company serves."},"what_you_do":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"What You Do","description":"What the company does."},"differentiation":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Differentiation","description":"What distinguishes the company."},"tone_of_voice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tone Of Voice","description":"How the company speaks in its content."},"voice_warmth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Warmth"},"voice_formality":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Formality"},"voice_length":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Length"},"voice_technical_depth":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Voice Technical Depth"},"voice_emoji":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Voice Emoji"},"sells":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Sells"},"growth_channels":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Growth Channels","description":"The channels the company grows through."},"market_size":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Size","description":"How big the company is, in its own words."},"market_business_model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Market Business Model","description":"b2b, b2c or both."},"market_competitors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Market Competitors","description":"The competitors the company names."},"brand_colors":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Brand Colors"},"color_roles":{"anyOf":[{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"null"}]},"type":"object"},"type":"object"},{"type":"null"}],"title":"Color Roles"},"chart_palette":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Chart Palette"},"chart_palettes":{"anyOf":[{"additionalProperties":{"items":{"type":"string"},"type":"array"},"type":"object"},{"type":"null"}],"title":"Chart Palettes"},"voice_traits":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Voice Traits"},"brand_words":{"anyOf":[{"$ref":"#/components/schemas/BrandWordsUpdate"},{"type":"null"}]},"add_ons":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Add Ons"},"theme":{"anyOf":[{"$ref":"#/components/schemas/BrandThemeUpdate"},{"type":"null"}]}},"additionalProperties":false,"type":"object","title":"CompanyProfileUpdate","description":"PATCH body: partial edits to the profile. Only set fields are written.\n\nStrict: invalid colors / over-long values are rejected (422) for user edits.\nThe analyzer pre-clamps extracted data so it passes these same rules."},"CompleteConnectBody":{"properties":{"app_slug":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","title":"App Slug"},"connected_account_id":{"type":"string","maxLength":128,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","title":"Connected Account Id"},"app_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"App Name"},"visibility":{"$ref":"#/components/schemas/IntegrationVisibility","default":"team"}},"additionalProperties":true,"type":"object","required":["app_slug","connected_account_id"],"title":"CompleteConnectBody","description":"Connect-callback body. ``extra=\"allow\"`` keeps provider-specific fields without baking them\ninto the contract; the required two are what a poll-flow provider (Composio) must return to bind the\nexact account it minted. A redirect-flow provider records the account SERVER-SIDE after consent\n(webhook / pull-poll) and the dashboard confirms by watching its accounts list, so it never posts here."},"ConfigFieldOptionSchema":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"}},"type":"object","required":["value","label"],"title":"ConfigFieldOptionSchema","description":"One friendly option for an ``enum`` config field: the stored ``value`` + its human ``label``."},"ConfigFieldSchema":{"properties":{"key":{"type":"string","title":"Key"},"type":{"type":"string","title":"Type"},"label":{"type":"string","title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"group":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Group"},"required":{"type":"boolean","title":"Required","default":false},"default":{"title":"Default"},"options":{"items":{"$ref":"#/components/schemas/ConfigFieldOptionSchema"},"type":"array","title":"Options"},"minimum":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Minimum"},"maximum":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Maximum"},"unit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unit"},"placeholder":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Placeholder"}},"type":"object","required":["key","type","label"],"title":"ConfigFieldSchema","description":"One settings-form field, projected from the pinned manifest's ``config_fields`` (no per-skill UI).\n\nThe dashboard renders a friendly non-technical control keyed by ``type`` (a channel picker, a\ntimezone picker, a time picker, a toggle, an enum dropdown, a number, or text), labelled by\n``label`` + ``description`` and placed in the ``group`` section card. ``options`` carry the friendly\nlabels for an enum; ``minimum``/``maximum``/``unit`` shape a number input."},"ConfirmFieldsRequest":{"properties":{"paths":{"items":{"type":"string"},"type":"array","maxItems":50,"minItems":1,"title":"Paths"}},"additionalProperties":false,"type":"object","required":["paths"],"title":"ConfirmFieldsRequest","description":"One-click confirmation of up to 50 inferred Brand Kit fields."},"ConnectAttemptStatusResponse":{"properties":{"attempt_id":{"type":"string","format":"uuid","title":"Attempt Id"},"app_slug":{"type":"string","title":"App Slug"},"state":{"type":"string","title":"State"},"account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Account Id"},"awaiting_site_choice":{"type":"boolean","title":"Awaiting Site Choice","default":false}},"type":"object","required":["attempt_id","app_slug","state"],"title":"ConnectAttemptStatusResponse","description":"What became of one connect attempt, for the browser that started it."},"ConnectFieldSchema":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"required":{"type":"boolean","title":"Required"},"secret":{"type":"boolean","title":"Secret"},"description":{"type":"string","title":"Description","default":""},"default":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Default"}},"type":"object","required":["name","label","required","secret"],"title":"ConnectFieldSchema","description":"One credential input a non-OAuth toolkit needs at connect time (drives the dynamic form)."},"ConnectFieldsResponse":{"properties":{"app_slug":{"type":"string","title":"App Slug"},"is_oauth":{"type":"boolean","title":"Is Oauth"},"auth_scheme":{"type":"string","title":"Auth Scheme"},"fields":{"items":{"$ref":"#/components/schemas/ConnectFieldSchema"},"type":"array","title":"Fields","default":[]},"connectable":{"type":"boolean","title":"Connectable","default":true},"unsupported_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unsupported Reason"},"flow":{"type":"string","title":"Flow","default":"poll"},"team_only_connect":{"type":"boolean","title":"Team Only Connect"},"default_personal":{"type":"boolean","title":"Default Personal"},"preinstall":{"anyOf":[{"$ref":"#/components/schemas/AppPreinstall"},{"type":"null"}]},"environments":{"items":{"type":"string"},"type":"array","title":"Environments","default":[]}},"type":"object","required":["app_slug","is_oauth","auth_scheme","team_only_connect","default_personal","preinstall"],"title":"ConnectFieldsResponse","description":"How an app connects: the OAuth redirect flow, or the fields to collect for a key-entry form."},"ConnectFirstDialog":{"properties":{"title":{"type":"string","title":"Title"},"text":{"type":"string","title":"Text"},"button":{"type":"string","title":"Button"}},"type":"object","required":["title","text","button"],"title":"ConnectFirstDialog"},"ConnectKeyBody":{"properties":{"app_slug":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","title":"App Slug"},"credentials":{"additionalProperties":{"type":"string"},"type":"object","title":"Credentials"},"visibility":{"$ref":"#/components/schemas/IntegrationVisibility","default":"team"},"reconnect_account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reconnect Account Id"},"attempt_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Attempt Id"}},"additionalProperties":false,"type":"object","required":["app_slug","credentials"],"title":"ConnectKeyBody","description":"Submit a non-OAuth toolkit's user-supplied credentials to connect it.\n\n``credentials`` is the toolkit's field map, which can contain secrets. A brokered provider\nreceives its values, while a native adapter can return a validated bundle for Patricia to seal.\nThe route does not log them. ``extra=\"forbid\"`` rejects unexpected top-level keys."},"ConnectSessionBody":{"properties":{"app_slug":{"type":"string","maxLength":64,"minLength":1,"pattern":"^[A-Za-z0-9][A-Za-z0-9_.-]*$","title":"App Slug"},"visibility":{"$ref":"#/components/schemas/IntegrationVisibility","default":"personal"},"environment":{"anyOf":[{"type":"string","enum":["sandbox","production"]},{"type":"null"}],"title":"Environment"}},"type":"object","required":["app_slug"],"title":"ConnectSessionBody"},"ConnectSessionResponse":{"properties":{"provider":{"type":"string","title":"Provider"},"app_slug":{"type":"string","title":"App Slug"},"connect_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connect Url"},"connect_token":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connect Token"},"flow":{"type":"string","title":"Flow","default":"poll"},"attempt_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Attempt Id"}},"type":"object","required":["provider","app_slug"],"title":"ConnectSessionResponse"},"ConnectedAccountCounts":{"properties":{"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"Set when scoped to one tenant; null for the overview."},"by_provider":{"additionalProperties":{"type":"integer"},"type":"object","title":"By Provider","description":"Provider → active account count (populated only for a single-tenant query)."},"rows":{"items":{"$ref":"#/components/schemas/ProviderCount"},"type":"array","title":"Rows","description":"Cross-tenant (tenant, provider, count) rows for the overview."},"total_active_accounts":{"type":"integer","title":"Total Active Accounts","description":"Sum of all active connected accounts in scope."}},"type":"object","required":["total_active_accounts"],"title":"ConnectedAccountCounts","description":"Connected-account COGS view. Either one tenant's counts, or the platform-wide overview."},"ConnectedAccountResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"type":"string","title":"Provider"},"app_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Slug"},"status_code":{"type":"string","title":"Status Code"},"visibility_code":{"$ref":"#/components/schemas/IntegrationVisibility","default":"team"},"sync_enqueued":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Sync Enqueued"}},"type":"object","required":["id","provider","status_code"],"title":"ConnectedAccountResponse"},"ConnectedAccountSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"type":"string","title":"Provider"},"app_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Slug"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"app_logo":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Logo"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"managed":{"type":"boolean","title":"Managed","default":false},"external_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Account Id"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"status_code":{"type":"string","title":"Status Code"},"visibility_code":{"$ref":"#/components/schemas/IntegrationVisibility"},"team_only_connect":{"type":"boolean","title":"Team Only Connect","default":false},"connected_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected By"},"connected_by_email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected By Email"},"account_identity":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Identity"},"enabled_tool_count":{"type":"integer","title":"Enabled Tool Count","default":0},"needs_reconnect":{"type":"boolean","title":"Needs Reconnect","default":false},"awaiting_site_choice":{"type":"boolean","title":"Awaiting Site Choice","default":false},"reconnect_reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reconnect Reason Code"},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"is_mine":{"type":"boolean","title":"Is Mine","default":false},"can_manage":{"type":"boolean","title":"Can Manage","default":false},"can_disconnect":{"type":"boolean","title":"Can Disconnect","default":false},"can_reconsent":{"type":"boolean","title":"Can Reconsent","default":false},"can_reconnect_key":{"type":"boolean","title":"Can Reconnect Key","default":false},"can_share_to_team":{"type":"boolean","title":"Can Share To Team","default":false},"can_make_private":{"type":"boolean","title":"Can Make Private","default":false},"share_to_team_unavailable_reason":{"anyOf":[{"$ref":"#/components/schemas/ShareToTeamUnavailableReason"},{"type":"null"}]},"make_private_unavailable_reason":{"anyOf":[{"$ref":"#/components/schemas/MakePrivateUnavailableReason"},{"type":"null"}]}},"type":"object","required":["id","provider","status_code","visibility_code","created_at"],"title":"ConnectedAccountSummary","description":"One connected account for the management list with identity, status, sharing scope, and connector."},"ConnectedAccountsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ConnectedAccountSummary"},"type":"array","title":"Items"},"pending":{"items":{"$ref":"#/components/schemas/PendingConnectionSummary"},"type":"array","title":"Pending","default":[]}},"type":"object","required":["items"],"title":"ConnectedAccountsResponse"},"ConnectionStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"active":{"type":"boolean","title":"Active"}},"type":"object","required":["status","active"],"title":"ConnectionStatusResponse"},"ConnectorRepairIn":{"properties":{"row_id":{"type":"string","format":"uuid","title":"Row Id"},"candidate_user_id":{"type":"string","format":"uuid","title":"Candidate User Id"},"proof_kind":{"type":"string","maxLength":80,"minLength":1,"title":"Proof Kind"},"proof_reference":{"type":"string","maxLength":500,"minLength":1,"title":"Proof Reference"},"expected_connected_by_actor_id":{"type":"null","title":"Expected Connected By Actor Id"},"expected_connected_by_user_id":{"type":"null","title":"Expected Connected By User Id"},"expected_connected_by_email":{"type":"string","maxLength":320,"minLength":1,"title":"Expected Connected By Email"},"expected_owner_origin_code":{"type":"string","const":"legacy_unknown","title":"Expected Owner Origin Code"},"expected_owner_link_state_code":{"type":"string","const":"unresolved","title":"Expected Owner Link State Code"},"expected_provider_partition_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Expected Provider Partition User Id"}},"additionalProperties":false,"type":"object","required":["row_id","candidate_user_id","proof_kind","proof_reference","expected_connected_by_actor_id","expected_connected_by_user_id","expected_connected_by_email","expected_owner_origin_code","expected_owner_link_state_code","expected_provider_partition_user_id"],"title":"ConnectorRepairIn","description":"The approved proof and expected coordinate for one shared connector."},"ConsoleConversationListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ConsoleConversationResponse"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"ConsoleConversationListResponse","description":"The recency-capped switcher page with reserved cursor fields."},"ConsoleConversationRenameRequest":{"properties":{"title":{"type":"string","maxLength":80,"minLength":1,"title":"Title"}},"additionalProperties":false,"type":"object","required":["title"],"title":"ConsoleConversationRenameRequest","description":"A user-supplied title that the service sanitizes before storage."},"ConsoleConversationResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"streaming_turn_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Streaming Turn Id"}},"type":"object","required":["id","title","last_message_at","created_at","streaming_turn_id"],"title":"ConsoleConversationResponse","description":"A conversation row exposed to the dashboard switcher."},"ConsoleMessageRequest":{"properties":{"text":{"type":"string","maxLength":11000,"minLength":1,"title":"Text"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"}},"additionalProperties":false,"type":"object","required":["text"],"title":"ConsoleMessageRequest","description":"A new console turn with no client-controlled thread coordinate."},"ConsoleMessageResponse":{"properties":{"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"accepted":{"type":"boolean","const":true,"title":"Accepted","default":true},"tracking_expires_at":{"type":"string","format":"date-time","title":"Tracking Expires At"}},"type":"object","required":["conversation_id","tracking_expires_at"],"title":"ConsoleMessageResponse","description":"The private conversation that accepted the queued turn."},"ConsoleThreadResponse":{"properties":{"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"streaming_turn_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Streaming Turn Id"},"live":{"anyOf":[{"$ref":"#/components/schemas/LiveProgress"},{"type":"null"}]},"poll_retry_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Poll Retry Until"}},"type":"object","required":["conversation_id","title","streaming_turn_id","live","poll_retry_until"],"title":"ConsoleThreadResponse","description":"The authenticated member's console thread and current run state."},"ConversationDirectoryRow":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"platform_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Code"},"kind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind Code"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"ConversationDirectoryRow","description":"Row shape returned by the directory query.\n\nAll fields optional so ``fields=`` projection validates (runflow pattern)."},"ConversationKind":{"type":"string","enum":["channel","group","dm","thread"],"title":"ConversationKind"},"ConversationKindRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ConversationKindRefReferenceFullValidator"},"ConversationProactiveModeResponse":{"properties":{"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"},"mode":{"$ref":"#/components/schemas/ProactiveReplyMode"},"source":{"$ref":"#/components/schemas/ProactiveModeSource"},"label":{"type":"string","title":"Label"},"summary":{"type":"string","title":"Summary"},"source_summary":{"type":"string","title":"Source Summary"}},"type":"object","required":["conversation_id","mode","source","label","summary","source_summary"],"title":"ConversationProactiveModeResponse","description":"How freely Patricia replies in one conversation, and where that came from."},"ConversationSource":{"type":"string","enum":["console_chat","platform"],"title":"ConversationSource"},"CreateAuthoredSkillFilesRequest":{"properties":{"manifest_yaml":{"type":"string","title":"Manifest Yaml"},"files":{"items":{"$ref":"#/components/schemas/AuthoredBundleFilePayload"},"type":"array","title":"Files"}},"type":"object","required":["manifest_yaml"],"title":"CreateAuthoredSkillFilesRequest","description":"A complete manifest and text file set for a new authored skill."},"CreateDraftRequest":{"properties":{"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id","description":"Edit an EXISTING skill: its active version's manifest and files are copied in and the version number is patch-bumped. Omit to start a new skill."},"manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Manifest","description":"A starting manifest (for example a GitHub candidate). Ignored when skill_id is set."},"skill_md":{"anyOf":[{"type":"string","maxLength":400000},{"type":"null"}],"title":"Skill Md","description":"The starting SKILL.md, stored as an editable draft file. The GitHub autodetect route returns one alongside each candidate's manifest; without this the import would arrive with its prose silently dropped. Ignored when skill_id is set (an existing skill's files are copied instead)."},"title":{"type":"string","maxLength":255,"title":"Title","description":"A working name for the draft.","default":""},"source_kind":{"type":"string","enum":["manual","github"],"title":"Source Kind","description":"Which door this draft came through — 'manual' (typed) or 'github' (a candidate picked from /authored-skills/from-github). Stated rather than guessed from the other fields, and carried onto the published version. 'zip' is not accepted here: it belongs to /skill-drafts/upload, which is the only route that actually read an archive.","default":"manual"},"source_ref":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Source Ref","description":"Where this came from — a repo URL or a filename. Inert metadata."}},"type":"object","title":"CreateDraftRequest","description":"Open a draft: empty, from a manifest, or seeded from an existing skill."},"CreateWorkspaceRequest":{"properties":{"name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Name","description":"Workspace name (a friendly default is used if omitted)."}},"additionalProperties":false,"type":"object","title":"CreateWorkspaceRequest","description":"Payload for the explicit \"create a new / separate workspace\" action.\n\nAn ``Idempotency-Key`` header (required by the route) makes a retry safe. The response is a fresh\ntoken pair scoped to the new workspace, which the caller adopts to enter the workspace it just created."},"CreationApprovedPermission":{"properties":{"grant_id":{"type":"string","format":"uuid","title":"Grant Id"},"tier":{"type":"string","enum":["A","B"],"title":"Tier"},"candidate_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Candidate Id"},"instruction":{"type":"string","title":"Instruction"},"tool_names":{"items":{"type":"string"},"type":"array","title":"Tool Names"},"external_account_id":{"type":"string","title":"External Account Id"},"verified_principal":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Verified Principal"},"fields":{"items":{"$ref":"#/components/schemas/CreationCandidateField"},"type":"array","title":"Fields"},"reads":{"items":{"$ref":"#/components/schemas/CreationApprovedRead"},"type":"array","title":"Reads"},"max_occurrences":{"type":"integer","title":"Max Occurrences"},"max_actions":{"type":"integer","title":"Max Actions"},"max_writes_per_run":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Writes Per Run"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["grant_id","tier","candidate_id","instruction","tool_names","external_account_id","verified_principal","fields","reads","max_occurrences","max_actions","max_writes_per_run","expires_at"],"title":"CreationApprovedPermission","description":"The creator's live standing permission, separate from prepared details."},"CreationApprovedRead":{"properties":{"provider":{"type":"string","title":"Provider"},"external_account_id":{"type":"string","title":"External Account Id"},"principal_key":{"type":"string","title":"Principal Key"},"source":{"type":"string","title":"Source"}},"type":"object","required":["provider","external_account_id","principal_key","source"],"title":"CreationApprovedRead"},"CreationAttemptStatus":{"properties":{"attempt_id":{"type":"string","format":"uuid","title":"Attempt Id"},"source_kind":{"type":"string","enum":["task_cron","event_trigger"],"title":"Source Kind"},"source_id":{"type":"string","format":"uuid","title":"Source Id"},"state":{"type":"string","enum":["unclaimed","claimed","completed","failed","superseded"],"title":"State"},"outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Outcome"},"candidate_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Candidate Id"},"permission_active":{"type":"boolean","title":"Permission Active","default":false},"approved_permission":{"anyOf":[{"$ref":"#/components/schemas/CreationApprovedPermission"},{"type":"null"}]},"review":{"anyOf":[{"type":"string","enum":["available","unavailable","expired"]},{"type":"null"}],"title":"Review"}},"type":"object","required":["attempt_id","source_kind","source_id","state","outcome","candidate_id"],"title":"CreationAttemptStatus","description":"One permission-setup attempt for a saved task."},"CreationCandidateAccount":{"properties":{"provider":{"type":"string","title":"Provider"},"external_account_id":{"type":"string","title":"External Account Id"},"verified_principal":{"type":"string","title":"Verified Principal"},"connection_generation":{"type":"integer","title":"Connection Generation"}},"type":"object","required":["provider","external_account_id","verified_principal","connection_generation"],"title":"CreationCandidateAccount"},"CreationCandidateField":{"properties":{"name":{"type":"string","title":"Name"},"mode":{"type":"string","title":"Mode"},"role":{"type":"string","title":"Role"},"cardinality":{"type":"string","title":"Cardinality"},"element_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Element Type"},"fixed":{"type":"boolean","title":"Fixed"},"value":{"$ref":"#/components/schemas/JsonValue"},"pin_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Pin Reason"},"max_items":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Items"}},"type":"object","required":["name","mode","role","cardinality","element_type","fixed","pin_reason","max_items"],"title":"CreationCandidateField"},"CreationCandidateRead":{"properties":{"account":{"$ref":"#/components/schemas/CreationCandidateAccount"},"principal_key":{"type":"string","title":"Principal Key"},"source":{"type":"string","title":"Source"}},"type":"object","required":["account","principal_key","source"],"title":"CreationCandidateRead"},"CreationCandidateRequest":{"properties":{"source_kind":{"type":"string","enum":["task_cron","event_trigger"],"title":"Source Kind"},"source_id":{"type":"string","format":"uuid","title":"Source Id"},"declaration":{"anyOf":[{"$ref":"#/components/schemas/CreationDeclaration"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["source_kind","source_id"],"title":"CreationCandidateRequest","description":"Ask for the permission setup of a task that is already saved.\n\nWithout a declaration, or with the declaration the latest attempt already holds, the answer is\nthat latest attempt. Different explicit choices get a new attempt id."},"CreationCandidateView":{"properties":{"candidate_id":{"type":"string","format":"uuid","title":"Candidate Id"},"attempt_id":{"type":"string","format":"uuid","title":"Attempt Id"},"source_kind":{"type":"string","enum":["task_cron","event_trigger"],"title":"Source Kind"},"source_id":{"type":"string","format":"uuid","title":"Source Id"},"instruction":{"type":"string","title":"Instruction"},"tool_name":{"type":"string","title":"Tool Name"},"account":{"$ref":"#/components/schemas/CreationCandidateAccount"},"fields":{"items":{"$ref":"#/components/schemas/CreationCandidateField"},"type":"array","title":"Fields"},"reads":{"items":{"$ref":"#/components/schemas/CreationCandidateRead"},"type":"array","title":"Reads"},"normalization_changes":{"items":{"type":"string"},"type":"array","title":"Normalization Changes"},"required_confirmations":{"items":{"type":"string"},"type":"array","title":"Required Confirmations"},"max_occurrences":{"type":"integer","title":"Max Occurrences"},"max_writes_per_run":{"type":"integer","title":"Max Writes Per Run"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["candidate_id","attempt_id","source_kind","source_id","instruction","tool_name","account","fields","reads","normalization_changes","required_confirmations","max_occurrences","max_writes_per_run","expires_at"],"title":"CreationCandidateView","description":"The prepared permission details, shown only to the person who created the task."},"CreationDeclaration":{"properties":{"task":{"$ref":"#/components/schemas/TaskDeclaration"},"arguments":{"additionalProperties":{"$ref":"#/components/schemas/CreationField"},"type":"object","title":"Arguments"},"reads":{"items":{"$ref":"#/components/schemas/CreationReadScope"},"type":"array","maxItems":20,"title":"Reads"}},"additionalProperties":false,"type":"object","required":["task","arguments"],"title":"CreationDeclaration"},"CreationField":{"properties":{"mode":{"$ref":"#/components/schemas/BDeclarationMode"},"value":{"$ref":"#/components/schemas/JsonValue"},"max_items":{"type":"integer","maximum":20.0,"minimum":1.0,"title":"Max Items","default":5}},"additionalProperties":false,"type":"object","required":["mode"],"title":"CreationField"},"CreationOptionsResponse":{"properties":{"actions":{"items":{"$ref":"#/components/schemas/CreationPickerAction"},"type":"array","title":"Actions"},"reads":{"items":{"$ref":"#/components/schemas/CreationPickerRead"},"type":"array","title":"Reads"}},"type":"object","title":"CreationOptionsResponse"},"CreationPickerAction":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"account_id":{"type":"string","format":"uuid","title":"Account Id"},"account_label":{"type":"string","title":"Account Label"},"principal_key":{"type":"string","title":"Principal Key"},"argument_schema":{"additionalProperties":true,"type":"object","title":"Argument Schema"}},"type":"object","required":["name","label","account_id","account_label","principal_key","argument_schema"],"title":"CreationPickerAction","description":"A write action the person may pick, with the connected account it runs on."},"CreationPickerRead":{"properties":{"tool_name":{"type":"string","title":"Tool Name"},"account_id":{"type":"string","format":"uuid","title":"Account Id"},"account_label":{"type":"string","title":"Account Label"},"principal_key":{"type":"string","title":"Principal Key"},"source":{"type":"string","title":"Source"}},"type":"object","required":["tool_name","account_id","account_label","principal_key","source"],"title":"CreationPickerRead","description":"A connected account the person may let the task read."},"CreationReadScope":{"properties":{"tool_name":{"type":"string","maxLength":200,"minLength":1,"title":"Tool Name"},"principal_key":{"type":"string","maxLength":128,"minLength":1,"title":"Principal Key"},"source":{"type":"string","maxLength":128,"minLength":1,"title":"Source"}},"additionalProperties":false,"type":"object","required":["tool_name","principal_key","source"],"title":"CreationReadScope"},"CreationReviewDecisionRequest":{"properties":{"decision":{"type":"string","enum":["allow","decline"],"title":"Decision"},"confirmations":{"items":{"type":"string"},"type":"array","maxItems":10,"title":"Confirmations"}},"additionalProperties":false,"type":"object","required":["decision"],"title":"CreationReviewDecisionRequest","description":"Allow or decline a review. ``confirmations`` names the disclosures the person checked."},"CreationReviewDecisionResult":{"properties":{"outcome":{"type":"string","enum":["minted","refused","unconfirmed","declined"],"title":"Outcome"}},"type":"object","required":["outcome"],"title":"CreationReviewDecisionResult","description":"What a decision did. ``unconfirmed`` means the outcome could not be read back."},"CreationReviewRequest":{"properties":{"max_occurrences":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Max Occurrences"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"max_items":{"anyOf":[{"type":"integer","maximum":20.0,"minimum":1.0},{"type":"null"}],"title":"Max Items"}},"additionalProperties":false,"type":"object","title":"CreationReviewRequest","description":"Open the private review of prepared permission details.\n\nEach limit is optional and may only lower the prepared value. A lowered limit gets its own\nprepared revision, which the review then shows."},"CreationReviewView":{"properties":{"intent_id":{"type":"string","format":"uuid","title":"Intent Id"},"intent_expires_at":{"type":"string","format":"date-time","title":"Intent Expires At"},"candidate":{"$ref":"#/components/schemas/CreationCandidateView"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run At"},"trigger":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger"},"platform_code":{"type":"string","title":"Platform Code"}},"type":"object","required":["intent_id","intent_expires_at","candidate","schedule","run_at","trigger","platform_code"],"title":"CreationReviewView","description":"A private review issued to the person who created the task.\n\nA scheduled task carries ``schedule`` (repeating) or ``run_at`` (once); a trigger carries\n``trigger``, the checked event, channel and typed conditions. ``platform_code`` names the chat platform of the\ninstallation the permission is tied to."},"CreationSourceStatus":{"properties":{"attempt":{"anyOf":[{"$ref":"#/components/schemas/CreationAttemptStatus"},{"type":"null"}]}},"type":"object","required":["attempt"],"title":"CreationSourceStatus","description":"The latest permission setup for a source, or no registered attempt."},"CredentialRowIn":{"properties":{"row_id":{"type":"string","format":"uuid","title":"Row Id"},"owner":{"$ref":"#/components/schemas/OwnerIn"},"disposition":{"$ref":"#/components/schemas/RowDisposition"}},"additionalProperties":false,"type":"object","required":["row_id","owner","disposition"],"title":"CredentialRowIn","description":"One credential row the decision names, and what happens to it."},"CreditAdjustmentCreate":{"properties":{"direction":{"type":"string","enum":["add","subtract"],"title":"Direction"},"amount":{"anyOf":[{"type":"number","maximum":1000000.0,"exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d{0,2}0*$"}],"title":"Amount","description":"Credits, 2 decimals max."},"reason":{"type":"string","maxLength":500,"minLength":10,"title":"Reason"},"idempotency_key":{"type":"string","maxLength":128,"minLength":8,"title":"Idempotency Key","description":"Client-generated once per submit; resending it replays the stored outcome instead of moving credits again."}},"additionalProperties":false,"type":"object","required":["direction","amount","reason","idempotency_key"],"title":"CreditAdjustmentCreate","description":"A staff credit grant/clawback. Direction + positive magnitude (fat-finger safe)."},"CronJobCreateRequest":{"properties":{"name":{"type":"string","title":"Name"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run At"},"kind_code":{"$ref":"#/components/schemas/CronKind","default":"task"},"prompt":{"type":"string","title":"Prompt"},"condition_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition Script"},"enabled":{"type":"boolean","title":"Enabled","default":true},"model":{"type":"string","title":"Model","default":"gpt-6.1-sol"},"cost_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Tier"},"max_runs":{"anyOf":[{"type":"integer","maximum":2147483647.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Runs"},"delivery_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Id"},"declaration":{"anyOf":[{"$ref":"#/components/schemas/CreationDeclaration"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["name","prompt"],"title":"CronJobCreateRequest","description":"Cron create fields plus an optional server-validated channel selection."},"CronJobCreateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run At"},"kind_code":{"$ref":"#/components/schemas/CronKind"},"delivery_conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Delivery Conversation Id"},"delivery_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Id"},"delivery_destination_kind":{"anyOf":[{"type":"string","enum":["dm","channel","unknown_channel"]},{"type":"null"}],"title":"Delivery Destination Kind"},"billing_skip_reason":{"anyOf":[{"type":"string","enum":["no_credits","subscription_inactive"]},{"type":"null"}],"title":"Billing Skip Reason"},"delivery_channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Name"},"created_by_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Actor Id"},"built_in_template_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Built In Template Key"},"auto_approve":{"type":"boolean","title":"Auto Approve","default":false},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"instructions_author_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Instructions Author Actor Id"},"prompt":{"type":"string","title":"Prompt"},"condition_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition Script"},"enabled":{"type":"boolean","title":"Enabled"},"model":{"type":"string","title":"Model"},"cost_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Tier"},"locked_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locked By"},"lease_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lease Expires At"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"run_count":{"type":"integer","title":"Run Count"},"max_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Runs"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"connection_scope_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connection Scope Note"},"creation_offer":{"anyOf":[{"$ref":"#/components/schemas/CreationAttemptStatus"},{"type":"null"}]}},"type":"object","required":["id","tenant_id","name","kind_code","prompt","enabled","model","run_count","created_at","updated_at"],"title":"CronJobCreateResponse","description":"The create reply: the row, plus how the thing just created resolves its connections.\n\nSeparate from the update reply because the field belongs to CREATION. On the shared model an\nedit receipt would report a task creation that did not happen.\n\n``None`` for a REMINDER. A reminder never enters an agent run, so it uses no connections at all\nand the note would describe behaviour that does not occur. This varies by the KIND of row, never\nby what the caller can see: copy that changed with connection state would disclose that a hidden\nconnection exists, which is the one thing this note must not do."},"CronJobLoop":{"properties":{"cron_job_id":{"type":"string","format":"uuid","title":"Cron Job Id"},"loop_id":{"type":"string","format":"uuid","title":"Loop Id"},"kind":{"type":"string","title":"Kind"},"status":{"type":"string","title":"Status"},"subject":{"type":"string","title":"Subject"},"reason":{"type":"string","title":"Reason"},"checks_used":{"type":"integer","title":"Checks Used"},"max_checks":{"type":"integer","title":"Max Checks"},"ends_at":{"type":"string","format":"date-time","title":"Ends At"}},"type":"object","required":["cron_job_id","loop_id","kind","status","subject","reason","checks_used","max_checks","ends_at"],"title":"CronJobLoop","description":"One follow-up loop behind a scheduled task row: why it runs, how far it got, when it ends."},"CronJobLoopsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CronJobLoop"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CronJobLoopsResponse","description":"The live follow-up loops behind the scheduled tasks the caller can see."},"CronJobUsage":{"properties":{"cron_job_id":{"type":"string","format":"uuid","title":"Cron Job Id"},"credits":{"type":"integer","title":"Credits"}},"type":"object","required":["cron_job_id","credits"],"title":"CronJobUsage","description":"One scheduled job's accumulated credit consumption."},"CronJobUsageResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CronJobUsage"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"CronJobUsageResponse","description":"Accumulated credits for every scheduled job the caller can see."},"CronKind":{"type":"string","enum":["reminder","task"],"title":"CronKind","description":"What a fired ``CronJob`` does (plan 02 §6).\n\n``reminder`` pings the originating conversation with the stored message (no\nagent run); ``task`` runs the stored prompt as a scheduled agent action and\ndelivers the result back to that conversation."},"CronKindRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"CronKindRefReferenceFullValidator"},"CuratorAffected":{"properties":{"pruned_memory":{"items":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"},"type":"array","title":"Pruned Memory"},"archived_docs":{"items":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"},"type":"array","title":"Archived Docs"}},"type":"object","required":["pruned_memory","archived_docs"],"title":"CuratorAffected","description":"Recently pruned memories + archived docs, both restorable."},"CuratorConfigBody":{"properties":{"half_life_days":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"null"}],"title":"Half Life Days"},"salience_floor":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Salience Floor"},"stale_doc_days":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Stale Doc Days"}},"type":"object","title":"CuratorConfigBody","description":"PUT body: only provided fields are overridden (partial). Validated so a bad\noverride can't feed broken math into a sweep (half-life > 0, floor in [0,1])."},"CuratorConfigResponse":{"properties":{"half_life_days":{"type":"number","title":"Half Life Days"},"salience_floor":{"type":"number","title":"Salience Floor"},"stale_doc_days":{"type":"integer","title":"Stale Doc Days"}},"type":"object","required":["half_life_days","salience_floor","stale_doc_days"],"title":"CuratorConfigResponse"},"CuratorSweepResult":{"properties":{"dry_run":{"type":"boolean","title":"Dry Run"},"decayed":{"type":"integer","title":"Decayed"},"consolidated":{"type":"integer","title":"Consolidated"},"expired":{"type":"integer","title":"Expired"},"pruned":{"type":"integer","title":"Pruned"},"archived":{"type":"integer","title":"Archived"}},"type":"object","required":["dry_run","decayed","consolidated","expired","pruned","archived"],"title":"CuratorSweepResult","description":"The counts a sweep changed (or would change, when ``dry_run``)."},"CustomModelUpdate":{"properties":{"model_id":{"type":"string","title":"Model Id"},"effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort"}},"additionalProperties":false,"type":"object","required":["model_id"],"title":"CustomModelUpdate","description":"A workspace's own model + thinking choice for everyday work."},"CustomPlanView":{"properties":{"monthly_price_cents":{"type":"integer","title":"Monthly Price Cents"},"monthly_credit_grant":{"type":"integer","title":"Monthly Credit Grant"},"is_current":{"type":"boolean","title":"Is Current"}},"type":"object","required":["monthly_price_cents","monthly_credit_grant","is_current"],"title":"CustomPlanView","description":"A staff-attached negotiated package, as the customer's own Billing tab reads it."},"CustomSetupView":{"properties":{"tier":{"type":"string","title":"Tier"},"model_id":{"type":"string","title":"Model Id"},"model_label":{"type":"string","title":"Model Label"},"effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort"},"thinking_label":{"type":"string","title":"Thinking Label"},"posture_label":{"type":"string","title":"Posture Label"}},"type":"object","required":["tier","model_id","model_label","effort","thinking_label","posture_label"],"title":"CustomSetupView","description":"The workspace's own model + thinking choice, when it has one."},"DailyAggregate":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"run_count":{"type":"integer","title":"Run Count"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens"},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens"},"tool_calls":{"type":"integer","title":"Tool Calls"},"cost_micro_usd":{"type":"integer","title":"Cost Micro Usd"}},"type":"object","required":["date","run_count","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","tool_calls","cost_micro_usd"],"title":"DailyAggregate","description":"One day's usage TOTALS for a tenant: counters summed across that day's per-run shards.\n\nThe admin daily-usage view reads this, not the raw per-run rows (a raw ``limit 14`` would\nreturn 14 shards, not 14 days). No ``id``/``usage_shard_key``: it is an aggregate, not a row."},"DailyBriefConfig":{"properties":{"email_accounts":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Email Accounts"},"calendar_source":{"anyOf":[{"type":"string","enum":["googlecalendar","outlook"]},{"type":"null"}],"title":"Calendar Source"}},"additionalProperties":false,"type":"object","title":"DailyBriefConfig","description":"The two picks a Daily Brief stores. ``None`` reads every source the person can use."},"DataDeletionCreate":{"properties":{"integration_account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Integration Account Id"},"slack_user_id":{"anyOf":[{"type":"string","pattern":"^[A-Z][A-Z0-9]{1,63}$"},{"type":"null"}],"title":"Slack User Id"}},"type":"object","title":"DataDeletionCreate","description":"Exactly one subject per request, named by the field that identifies it.\n\nTwo subjects, not one field with a kind beside it: each identifier has its own type and its own\nrefusals, and a shared ``subject_id: str`` would let a caller send a Slack id under the account\nkind and reach a resolver built for uuids."},"DataDeletionCreated":{"properties":{"state":{"type":"string","enum":["received","failed"],"title":"State","default":"received"},"confirmation_code":{"type":"string","title":"Confirmation Code"},"status_url":{"type":"string","title":"Status Url"}},"type":"object","required":["confirmation_code","status_url"],"title":"DataDeletionCreated"},"DataDeletionStatus":{"properties":{"state":{"type":"string","enum":["received","in_progress","completed","failed","not_found"],"title":"State"},"message":{"type":"string","title":"Message"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"deleted":{"anyOf":[{"additionalProperties":{"type":"integer"},"type":"object"},{"type":"null"}],"title":"Deleted"},"kept":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Kept"},"known_residuals":{"anyOf":[{"items":{"type":"string"},"type":"array"},{"type":"null"}],"title":"Known Residuals"}},"type":"object","required":["state","message","requested_at"],"title":"DataDeletionStatus","description":"What a person is told about their own request. Plain words, and the whole answer.\n\n``kept`` and ``known_residuals`` are not decoration. A connected account that a standing approval\nstill references is TOMBSTONED rather than deleted, and the surviving row keeps the provider's own\nidentifier for that person. Reporting only the deletion counts would let \"completed\" stand in for\n\"completed, except for the parts we told nobody about\"."},"DataPrivacyResponse":{"properties":{"data_retention_days":{"type":"integer","title":"Data Retention Days"},"data_use_improve_enabled":{"type":"boolean","title":"Data Use Improve Enabled"},"redacted_topics":{"items":{"type":"string"},"type":"array","title":"Redacted Topics","description":"Topics Patricia must never repeat, in plain words (for example 'pricing' or 'legal'). She removes any part of a meeting transcript or summary that touches one and leaves a short note that something was removed. Any workspace that has not set its own list uses a recommended one, so this is always the list actually in force; save an empty list to turn the filter off."},"excluded_channel_ids":{"items":{"type":"string"},"type":"array","title":"Excluded Channel Ids","description":"Channel ids kept out of the Slack message cache, such as an HR or executive channel. Empty means the cache permits every channel Patricia is in, which is the default. This is always the list in force. Patricia's own conversations remain stored separately."}},"type":"object","required":["data_retention_days","data_use_improve_enabled","redacted_topics","excluded_channel_ids"],"title":"DataPrivacyResponse","description":"The caller's workspace data & privacy settings (with defaults applied)."},"DataPrivacyUpdate":{"properties":{"data_retention_days":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Data Retention Days","description":"Keep workspace data for 90 or 365 days. Zero means unlimited retention."},"data_use_improve_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Data Use Improve Enabled","description":"Allow Patricia to learn from workspace data to improve her work."},"redacted_topics":{"anyOf":[{"items":{"type":"string","maxLength":60},"type":"array","maxItems":25},{"type":"null"}],"title":"Redacted Topics","description":"The complete list of topics Patricia must never repeat, in plain words. Send an empty list to turn the filter off. Omit the field to leave the saved list unchanged."},"excluded_channel_ids":{"anyOf":[{"items":{"type":"string"},"type":"array","maxItems":50},{"type":"null"}],"title":"Excluded Channel Ids","description":"The complete list of channel ids kept out of the Slack message cache. Use it for channels such as HR or an executive channel. Send an empty list to permit caching every channel again. Omit the field to leave the saved list unchanged. An entry that is not a channel id is dropped, so the response is always the list in force. Patricia's own conversations remain stored separately."}},"additionalProperties":false,"type":"object","title":"DataPrivacyUpdate","description":"PATCH body: every field optional; only what's provided is written.\n\n``data_retention_days`` must be exactly one of the three allowed windows\n(``90`` / ``365`` / ``0``). Strict types on purpose: lax coercion would turn a JSON\n``false`` into ``0`` (Python ``False == 0``) and silently select UNLIMITED retention.\nStrict typing 422s anything that isn't a real JSON number / boolean.\n\n``redacted_topics`` and ``excluded_channel_ids`` each replace the whole list (each is one\ncontrol, edited as a whole), so an explicit ``[]`` clears it and turns that control off.\nOmitting a field leaves it untouched."},"Day":{"properties":{"date":{"type":"string","format":"date","title":"Date"},"run_count":{"type":"integer","title":"Run Count"},"credits":{"type":"integer","title":"Credits"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"tool_calls":{"type":"integer","title":"Tool Calls"}},"type":"object","required":["date","run_count","credits","input_tokens","output_tokens","tool_calls"],"title":"Day"},"DeclaredLine":{"properties":{"tool_name":{"type":"string","maxLength":200,"minLength":1,"title":"Tool Name","description":"Exact."},"pins":{"additionalProperties":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"integer","maximum":9007199254740992.0,"minimum":-9007199254740992.0},{"items":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"integer","maximum":9007199254740992.0,"minimum":-9007199254740992.0}]},"type":"array","maxItems":30,"minItems":1}]},"propertyNames":{"maxLength":64,"minLength":1},"type":"object","maxProperties":10,"title":"Pins","description":"Targets; omit varying args."},"targets":{"items":{"additionalProperties":{"anyOf":[{"type":"string","maxLength":200,"minLength":1},{"type":"integer","maximum":9007199254740992.0,"minimum":-9007199254740992.0}]},"propertyNames":{"maxLength":64,"minLength":1},"type":"object"},"type":"array","maxItems":30,"title":"Targets","description":"Arg map/target instead of pins."},"short_summary":{"anyOf":[{"type":"string","maxLength":200},{"type":"null"}],"title":"Short Summary"},"call_arguments":{"anyOf":[{"additionalProperties":{"$ref":"#/components/schemas/JsonValue"},"type":"object"},{"type":"null"}],"title":"Call Arguments","description":"Exact planned args."}},"additionalProperties":false,"type":"object","required":["tool_name"],"title":"DeclaredLine"},"DeliverableChannel":{"properties":{"external_id":{"type":"string","title":"External Id"},"name":{"type":"string","title":"Name"},"is_private":{"type":"boolean","title":"Is Private"}},"type":"object","required":["external_id","name","is_private"],"title":"DeliverableChannel","description":"One channel the caller may select as a scheduled delivery target."},"DeliverableChannelsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DeliverableChannel"},"type":"array","title":"Items"},"opens_threads":{"type":"boolean","title":"Opens Threads","description":"Whether a post in one of these channels opens a thread on this chat app. False when the workspace has no chat app to list channels from.","default":false}},"type":"object","required":["items"],"title":"DeliverableChannelsResponse","description":"Best-effort channel choices for the dashboard delivery picker."},"DeliveryAttemptSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"attempt_no":{"type":"integer","title":"Attempt No"},"status_code":{"type":"string","title":"Status Code"},"delivery_mode_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Mode Code"},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id"},"variant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Variant Id"},"provider_receipt_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider Receipt Id"},"error_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Code"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"finished_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Finished At"}},"type":"object","required":["id","attempt_no","status_code","delivery_mode_code","template_id","variant_id","provider_receipt_id","error_code","started_at","finished_at"],"title":"DeliveryAttemptSummary","description":"One append-only delivery attempt (template + receipt ids only, never rendered text, G4)."},"DeliveryChannelUpdateRequest":{"properties":{"delivery_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Id"}},"additionalProperties":false,"type":"object","required":["delivery_channel_id"],"title":"DeliveryChannelUpdateRequest","description":"Replace or clear a cron job's explicit channel delivery target."},"DeliveryPolicySummary":{"properties":{"mode_code":{"type":"string","title":"Mode Code"},"target_resolver":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target Resolver"},"template_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Template Id"},"reversal_policy_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reversal Policy Code"},"send_cap_per_window":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Send Cap Per Window"}},"type":"object","required":["mode_code","target_resolver","template_id","reversal_policy_code","send_cap_per_window"],"title":"DeliveryPolicySummary","description":"The compiled delivery contract for the installed version (mode / template / reversal / caps)."},"DisconnectAccountResponse":{"properties":{"upstream":{"$ref":"#/components/schemas/UpstreamRevokeOutcome"},"upstream_confirmed":{"type":"boolean","title":"Upstream Confirmed"},"grant_shared_with_another_connection":{"type":"boolean","title":"Grant Shared With Another Connection","default":false}},"type":"object","required":["upstream","upstream_confirmed"],"title":"DisconnectAccountResponse","description":"What the disconnect actually achieved, locally and at the provider.\n\nThe local half always succeeds (the account is deactivated and its tools disabled), so a 200 alone\nwould say nothing about whether the provider-side credential is still valid. These fields carry that\ntruth to the caller, because \"disconnected\" is a claim about access, and telling someone their access\nwas removed while their token still works is the one failure mode this endpoint must not have."},"DocScopeStatusCount":{"properties":{"scope_code":{"type":"string","title":"Scope Code"},"status_code":{"type":"string","title":"Status Code"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["scope_code","status_code","count"],"title":"DocScopeStatusCount"},"DocStatus":{"type":"string","enum":["active","archived"],"title":"DocStatus"},"DocStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"DocStatusRefReferenceFullValidator"},"DraftFileContent":{"properties":{"path":{"type":"string","title":"Path"},"kind":{"type":"string","title":"Kind"},"content":{"type":"string","title":"Content"}},"type":"object","required":["path","kind","content"],"title":"DraftFileContent","description":"One file's text, returned to the draft's author only."},"DraftFileSummary":{"properties":{"path":{"type":"string","title":"Path"},"kind":{"type":"string","title":"Kind"},"size_bytes":{"type":"integer","title":"Size Bytes"},"sha256":{"type":"string","title":"Sha256"}},"type":"object","required":["path","kind","size_bytes","sha256"],"title":"DraftFileSummary","description":"One file in a draft — metadata only, never the bytes."},"DraftValidationResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"warnings":{"items":{"type":"string"},"type":"array","title":"Warnings","description":"Worth telling the author, but not blocking: a warning never makes `valid` false."},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"missing_files":{"items":{"type":"string"},"type":"array","title":"Missing Files","description":"Paths the manifest declares that this draft does not carry — an editor points at the file list."},"dropped_files":{"items":{"type":"string"},"type":"array","title":"Dropped Files","description":"Paths this draft carries that the manifest does not declare. Publishing stores only what the manifest names, so these would be lost without being mentioned anywhere."}},"type":"object","required":["valid"],"title":"DraftValidationResponse","description":"The result of validating a draft — friendly errors for the editor. Always 200."},"DraftedCause":{"type":"string","enum":["no_bugs_channel","autoship_off","linear_not_configured","linear_connection_down"]},"DuplicateState":{"type":"string","enum":["any","only_duplicates","only_originals"]},"EmailCatalogEntry":{"properties":{"id":{"type":"string","title":"Id"},"stage":{"type":"string","title":"Stage"},"category":{"type":"string","title":"Category"},"priority":{"type":"string","title":"Priority"},"audience":{"type":"string","title":"Audience"},"timing":{"type":"string","title":"Timing"},"trigger":{"type":"string","title":"Trigger"},"subject":{"type":"string","title":"Subject"},"variables":{"items":{"type":"string"},"type":"array","title":"Variables"},"has_rule":{"type":"boolean","title":"Has Rule","description":"Whether a trigger rule owns this email (drives entry/send conditions)."}},"type":"object","required":["id","stage","category","priority","audience","timing","trigger","subject","variables","has_rule"],"title":"EmailCatalogEntry","description":"One lifecycle email, as the admin console needs to pick and explain it."},"EmailCatalogList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EmailCatalogEntry"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"},"test_send_enabled":{"type":"boolean","title":"Test Send Enabled","description":"False when API_EMAIL_TEST_SEND_ENABLED is off, so the console can say so instead of 404ing."}},"type":"object","required":["items","count","test_send_enabled"],"title":"EmailCatalogList","description":"The whole lifecycle catalog plus whether test sending is armed in this environment."},"EmailDisableBody":{"properties":{"disabled":{"type":"boolean","title":"Disabled"}},"additionalProperties":false,"type":"object","required":["disabled"],"title":"EmailDisableBody","description":"PATCH /members/{id}/email request body: the per-member email kill switch."},"EmailSimulateRequest":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"email_id":{"type":"string","maxLength":100,"minLength":1,"title":"Email Id"},"recipient_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Recipient Actor Id"},"recipient_email":{"anyOf":[{"type":"string","format":"email"},{"type":"null"}],"title":"Recipient Email"}},"additionalProperties":false,"type":"object","required":["tenant_id","email_id"],"title":"EmailSimulateRequest","description":"A hypothetical to explain: would ``email_id`` send to this recipient right now?"},"EmailSimulateResult":{"properties":{"email_id":{"type":"string","title":"Email Id"},"has_rule":{"type":"boolean","title":"Has Rule"},"would_send":{"type":"boolean","title":"Would Send"},"blockers":{"items":{"type":"string"},"type":"array","title":"Blockers"},"entry_evaluated":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Entry Evaluated"},"send_evaluated":{"additionalProperties":{"type":"boolean"},"type":"object","title":"Send Evaluated"},"frequency_snapshot":{"additionalProperties":{"type":"string"},"type":"object","title":"Frequency Snapshot"},"quiet_hours_deferred_until":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Quiet Hours Deferred Until"},"email_provenance":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email Provenance"}},"type":"object","required":["email_id","has_rule","would_send","blockers","entry_evaluated","send_evaluated","frequency_snapshot","quiet_hours_deferred_until"],"title":"EmailSimulateResult","description":"The same decision trace the engine would produce, without sending or persisting anything."},"EmailSweepConfig":{"properties":{"email_accounts":{"anyOf":[{"items":{"type":"string","format":"uuid"},"type":"array"},{"type":"null"}],"title":"Email Accounts"}},"additionalProperties":false,"type":"object","title":"EmailSweepConfig","description":"The one pick an Email Sweep stores. ``None`` reads every mailbox the person owns."},"EmailTestSendRequest":{"properties":{"email_id":{"type":"string","maxLength":100,"minLength":1,"title":"Email Id"},"to":{"type":"string","format":"email","title":"To"},"from_address":{"anyOf":[{"type":"string","maxLength":320},{"type":"null"}],"title":"From Address"}},"additionalProperties":false,"type":"object","required":["email_id","to"],"title":"EmailTestSendRequest"},"EmailTestSendResult":{"properties":{"email_id":{"type":"string","title":"Email Id"},"to":{"type":"string","title":"To"},"subject":{"type":"string","title":"Subject"},"provider_message_id":{"type":"string","title":"Provider Message Id"}},"type":"object","required":["email_id","to","subject","provider_message_id"],"title":"EmailTestSendResult"},"EmailVerificationRequest":{"properties":{"token":{"type":"string","maxLength":512,"minLength":1,"title":"Token","description":"The opaque token from the emailed link."},"password":{"type":"string","maxLength":128,"minLength":8,"format":"password","title":"Password","writeOnly":true},"first_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string","maxLength":100},{"type":"null"}],"title":"Last Name"},"org_name":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Org Name","description":"Workspace name (defaults if omitted)."},"gclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Gclid"},"fbclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fbclid"},"ttclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ttclid"},"li_fat_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Li Fat Id"},"msclkid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Msclkid"},"epik":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Epik"},"twclid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Twclid"},"sccid":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sccid"}},"additionalProperties":false,"type":"object","required":["token","password"],"title":"EmailVerificationRequest","description":"Sign-up STEP TWO: redeem the emailed link and choose a password.\n\nEverything that describes the account arrives here rather than at step one, because this is\nthe first request whose sender has demonstrated they hold the mailbox."},"EmailVerificationResponse":{"properties":{"status":{"type":"string","const":"accepted","title":"Status","default":"accepted"},"email":{"type":"string","format":"email","title":"Email"}},"additionalProperties":false,"type":"object","required":["email"],"title":"EmailVerificationResponse","description":"The address the caller just proved they hold, so signing in needs no retyping.\n\nSafe to return here and nowhere else: presenting the emailed token IS the proof, so this\nreveals nothing the caller did not already know."},"EnableBuiltInTemplateRequest":{"properties":{"local_time":{"anyOf":[{"type":"string"},{"type":"null"}],"pattern":"^([01][0-9]|2[0-3]):[0-5][0-9]$","title":"Local Time","description":"Local start time as exactly HH:MM on a 24-hour clock, in the caller's own timezone. Accepted on the first enable only, and refused for a template with a fixed schedule.","examples":["08:00"]},"delivery_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Id","description":"Channel a per-meeting template delivers to, chosen on the first enable only. Omit it to deliver by direct message. Refused for a scheduled template.","examples":["C0123456789"]},"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"The person's picks for a template that has config, chosen on the first enable only. Omit it to use every source the person can use. Refused for a template with no config. The Ad Anomaly Watch needs a settings object on its first enable, and {} means the defaults.","examples":[{"calendar_source":"googlecalendar","email_accounts":["0b6c1a52-8d3e-4f7a-9c21-5e4d7a8b9c10"]}]}},"additionalProperties":false,"type":"object","title":"EnableBuiltInTemplateRequest"},"EnableBuiltInTemplateResponse":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"enabled":{"type":"boolean","title":"Enabled"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"cron_job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cron Job Id"},"trigger_kind":{"type":"string","enum":["cron","per_meeting","before_each_meeting"],"title":"Trigger Kind"},"instructions_status":{"type":"string","enum":["available","unavailable","unknown"],"title":"Instructions Status"},"teammate_watch_on":{"type":"boolean","title":"Teammate Watch On","default":false},"created_by_teammate":{"type":"boolean","title":"Created By Teammate","default":false},"created":{"type":"boolean","title":"Created","default":false},"config":{"anyOf":[{"$ref":"#/components/schemas/EmailSweepConfig"},{"$ref":"#/components/schemas/DailyBriefConfig"},{"$ref":"#/components/schemas/AdAnomalyWatchConfig"},{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config"},"config_options":{"additionalProperties":{"items":{"$ref":"#/components/schemas/BuiltInTemplateConfigOption"},"type":"array"},"type":"object","title":"Config Options"},"email_account_options":{"items":{"$ref":"#/components/schemas/MailboxOption"},"type":"array","title":"Email Account Options"},"needs":{"anyOf":[{"$ref":"#/components/schemas/BuiltInTemplateNeeds"},{"type":"null"}],"description":"What the template needs before it can run. Null when it needs nothing."},"reads_mail":{"type":"boolean","title":"Reads Mail","description":"True when the template reads the person's mailboxes and offers a choice of which.","default":false},"settings":{"items":{"$ref":"#/components/schemas/ConfigFieldSchema"},"type":"array","title":"Settings","description":"The fields the automation's folder declares for the person to fill in. Empty for none."},"fixed_local_time":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fixed Local Time","description":"The local HH:MM a fixed-schedule template always runs at, Monday to Friday, in the person's own timezone and direct messages. Null when the person chooses the schedule.","examples":["12:00"]},"connection_scope_note":{"type":"string","title":"Connection Scope Note"}},"type":"object","required":["key","title","description","enabled","schedule","local_schedule","timezone","cron_job_id","trigger_kind","instructions_status","connection_scope_note"],"title":"EnableBuiltInTemplateResponse"},"EntraAssuranceResumeRequest":{"properties":{"resume_token":{"type":"string","maxLength":512,"minLength":1,"title":"Resume Token"},"first_time":{"type":"boolean","title":"First Time","default":false}},"additionalProperties":false,"type":"object","required":["resume_token"],"title":"EntraAssuranceResumeRequest","description":"The ceremony secret; resume also reads the optional first-time answer."},"EntraAssuranceStatusResponse":{"properties":{"status":{"type":"string","title":"Status"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"support_ref":{"type":"string","title":"Support Ref"},"resend_available":{"type":"boolean","title":"Resend Available"}},"additionalProperties":false,"type":"object","required":["status","expires_at","support_ref","resend_available"],"title":"EntraAssuranceStatusResponse","description":"What the waiting page renders. Carries no secret and nothing about any account."},"EntraAssuranceVerifyRequest":{"properties":{"resume_token":{"type":"string","maxLength":512,"minLength":1,"title":"Resume Token"},"mailed_token":{"type":"string","maxLength":512,"minLength":1,"title":"Mailed Token"}},"additionalProperties":false,"type":"object","required":["resume_token","mailed_token"],"title":"EntraAssuranceVerifyRequest","description":"Both secrets together, which is the only shape that proves the mailbox."},"ErrorResponse":{"properties":{"code":{"type":"string","title":"Code"},"message":{"type":"string","title":"Message"},"errors":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Errors"}},"type":"object","required":["code","message"],"title":"ErrorResponse","description":"Standard error envelope, matching exception handler output."},"EventDrop":{"properties":{"event_id":{"type":"string","title":"Event Id"},"reason":{"type":"string","title":"Reason"}},"type":"object","required":["event_id","reason"],"title":"EventDrop","description":"Why one event in the batch was not stored (coarse, non-PII code)."},"EventSourceCreated":{"properties":{"source":{"$ref":"#/components/schemas/EventSourceView"},"endpoint_url":{"type":"string","title":"Endpoint Url"}},"type":"object","required":["source","endpoint_url"],"title":"EventSourceCreated","description":"A freshly minted endpoint. The ONLY response that ever carries the URL."},"EventSourceListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/EventSourceView"},"type":"array","title":"Items"},"connectable":{"items":{"type":"string"},"type":"array","title":"Connectable"}},"type":"object","required":["items","connectable"],"title":"EventSourceListResponse","description":"Every system this workspace has connected, plus the ones it could."},"EventSourceSecretUpdate":{"properties":{"signing_secret":{"type":"string","maxLength":512,"minLength":1,"title":"Signing Secret"}},"additionalProperties":false,"type":"object","required":["signing_secret"],"title":"EventSourceSecretUpdate","description":"The signing secret from the vendor's dashboard. Write-only."},"EventSourceView":{"properties":{"source":{"type":"string","title":"Source"},"label":{"type":"string","title":"Label"},"status":{"type":"string","title":"Status"},"secret_configured":{"type":"boolean","title":"Secret Configured"},"last_event_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Event At"}},"type":"object","required":["source","label","status","secret_configured","last_event_at"],"title":"EventSourceView","description":"One connected system, as the dashboard sees it."},"FactCellSummary":{"properties":{"domain_key":{"type":"string","title":"Domain Key"},"label":{"type":"string","title":"Label"},"status_code":{"type":"string","title":"Status Code"},"display":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display"},"value_type_code":{"$ref":"#/components/schemas/AttributeValueType"}},"type":"object","required":["domain_key","label","status_code","display","value_type_code"],"title":"FactCellSummary","description":"One fact column's value for a people-table row: a month/day label + status (never a year, G4)."},"FailureLabelCount":{"properties":{"failure_code":{"type":"string","title":"Failure Code"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["failure_code","count"],"title":"FailureLabelCount","description":"How often reviewers have blamed one cause."},"FeatureActionSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"surface_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Surface Id"},"action_kind_code":{"type":"string","title":"Action Kind Code"},"endpoint":{"type":"string","title":"Endpoint"},"rbac_permission":{"type":"string","title":"Rbac Permission"},"state_transition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State Transition"}},"type":"object","required":["id","surface_id","action_kind_code","endpoint","rbac_permission","state_transition"],"title":"FeatureActionSummary","description":"A compiled user action bound to a surface: a platform endpoint + RBAC permission (no manifest ids)."},"FeatureFlagRow":{"properties":{"env_var":{"type":"string","title":"Env Var","description":"The API_* environment variable name. A capability armed by a SET of credentials rather than by one boolean reports a glob over those names (e.g. API_GOOGLE_ADS_*), which is not itself a settable key."},"intended_home":{"type":"string","title":"Intended Home","description":"Intended home: blueprint | code-default | dashboard-only | dashboard-infra (not a provenance)."},"control_class":{"type":"string","title":"Control Class","description":"standard | billing | kill_switch | operational."},"loaded_value":{"type":"boolean","title":"Loaded Value","description":"The boolean this process actually booted with. For a credential-armed capability: whether the process carries any of that capability's credentials."},"effective":{"type":"boolean","title":"Effective","description":"Feature gate: whether the feature is actually active once compound prerequisites apply. Kill switch (control_class=kill_switch): whether containment is ENGAGED (feature halted)."},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason","description":"Allowlisted code explaining why effective != loaded (e.g. managed_integrations_disabled), or null."},"removal_condition":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Removal Condition","description":"Flag-hygiene: what must be true before this flag is deleted, or null."}},"type":"object","required":["env_var","intended_home","control_class","loaded_value","effective"],"title":"FeatureFlagRow","description":"One row's effective state — a governed feature gate, or a credential-armed capability that\ngoverns nothing (values only, never a secret)."},"FeatureFlagState":{"properties":{"service":{"type":"string","title":"Service","description":"The observing process: 'api' (this endpoint). Worker state lives in the worker startup log."},"commit":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Commit","description":"Deploy commit (RENDER_GIT_COMMIT) when present, else null."},"flag_count":{"type":"integer","title":"Flag Count","description":"Number of rows reported: every governed gate, plus every credential-armed capability."},"engaged_kill_switches":{"items":{"type":"string"},"type":"array","title":"Engaged Kill Switches","description":"Env vars of any ENGAGED break-glass kill switch (empty is the healthy state)."},"flags":{"items":{"$ref":"#/components/schemas/FeatureFlagRow"},"type":"array","title":"Flags","description":"Effective state per row: one per governed gate, one per credential-armed capability."}},"type":"object","required":["service","flag_count","engaged_kill_switches","flags"],"title":"FeatureFlagState","description":"Service-aware snapshot for the observing process: every governed feature gate, plus every\ncapability armed by credentials rather than by a gate."},"FeatureReadModelSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"repository_binding":{"type":"string","title":"Repository Binding"},"columns":{"items":{},"type":"array","title":"Columns"},"filters":{"additionalProperties":true,"type":"object","title":"Filters"},"sort":{"items":{},"type":"array","title":"Sort"},"pagination_envelope":{"additionalProperties":true,"type":"object","title":"Pagination Envelope"}},"type":"object","required":["id","name","repository_binding","columns","filters","sort","pagination_envelope"],"title":"FeatureReadModelSummary","description":"A compiled read-model descriptor a surface reads (columns/filters/sort + pagination envelope)."},"FeatureSurfaceSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"surface_kind_code":{"type":"string","title":"Surface Kind Code"},"placement":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Placement"},"feature_read_model_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Feature Read Model Id"},"sort_order":{"type":"integer","title":"Sort Order"}},"type":"object","required":["id","surface_kind_code","placement","feature_read_model_id","sort_order"],"title":"FeatureSurfaceSummary","description":"A compiled UI surface the dashboard renders generically by ``surface_kind_code``."},"ForgetResult":{"properties":{"id":{"type":"string","title":"Id"},"forgotten":{"type":"boolean","title":"Forgotten","default":true},"retired_from_recall":{"type":"boolean","title":"Retired From Recall","default":false}},"type":"object","required":["id"],"title":"ForgetResult","description":"Outcome of a FORGET action (soft-delete a memory, or retire a lesson from recall)."},"GithubAutodetectResponse":{"properties":{"owner":{"type":"string","title":"Owner"},"repo":{"type":"string","title":"Repo"},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref"},"candidates":{"items":{"$ref":"#/components/schemas/GithubSkillCandidate"},"type":"array","title":"Candidates"}},"type":"object","required":["owner","repo"],"title":"GithubAutodetectResponse","description":"The skills found in a public GitHub repo."},"GithubImportRequest":{"properties":{"repo_url":{"type":"string","title":"Repo Url","description":"A public github.com repository URL, e.g. https://github.com/acme/skills."},"ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Ref","description":"Optional branch/tag/commit; defaults to the repo HEAD."}},"type":"object","required":["repo_url"],"title":"GithubImportRequest","description":"Point the autodetect at a public GitHub repo. Patricia SSRF-hardened-fetches its tarball."},"GithubSkillCandidate":{"properties":{"path":{"type":"string","title":"Path","description":"The repo directory the manifest lived in ('(root)' at the top level)."},"valid":{"type":"boolean","title":"Valid"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Mode"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Manifest"},"skill_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Md"},"semver_is_derived":{"type":"boolean","title":"Semver Is Derived","description":"A hint that the source omitted manifest.yaml, so Patricia derived the version. A wrong value can only change the version for a new import. It cannot bypass a gate. The author route still validates and compiles the manifest."},"import_outcome":{"anyOf":[{"$ref":"#/components/schemas/ImportOutcome"},{"type":"null"}],"description":"The caller's result for this candidate. An invalid candidate has no outcome because it has no archetype."}},"type":"object","required":["path","valid","semver_is_derived"],"title":"GithubSkillCandidate","description":"One ``manifest.yaml`` autodetected in a GitHub repo: validated but NOT saved (a preview row).\n\n``manifest`` (and inert ``skill_md``) are echoed back ONLY for a valid candidate so the admin can\nauthor the pick without a re-fetch; an invalid one carries just its friendly ``errors``. The author\nstep re-validates + re-compiles from scratch, so nothing here is trusted."},"GoogleAdsCustomerBody":{"properties":{"customer_id":{"type":"string","maxLength":32,"minLength":1,"title":"Customer Id"}},"additionalProperties":false,"type":"object","required":["customer_id"],"title":"GoogleAdsCustomerBody","description":"Pin a Google Ads connection to one discovered advertising customer."},"GoogleAdsCustomerSummary":{"properties":{"customer_id":{"type":"string","title":"Customer Id"},"customer_id_display":{"type":"string","title":"Customer Id Display"},"descriptive_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Descriptive Name"},"manager":{"type":"boolean","title":"Manager"},"level":{"type":"integer","title":"Level"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"},"login_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Login Customer Id"},"selectable":{"type":"boolean","title":"Selectable"},"status_label":{"type":"string","title":"Status Label"}},"type":"object","required":["customer_id","customer_id_display","descriptive_name","manager","level","currency_code","login_customer_id","selectable","status_label"],"title":"GoogleAdsCustomerSummary","description":"One Google Ads customer this connection can reach, as the picker shows it.\n\nThe name, display id, and currency identify the customer. The manager fields explain why a\nmanager account appears in the list but cannot be selected for campaign reports."},"GoogleAdsCustomersResponse":{"properties":{"customers":{"items":{"$ref":"#/components/schemas/GoogleAdsCustomerSummary"},"type":"array","title":"Customers"},"selected_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Customer Id"},"default_customer_id_was_selected":{"type":"boolean","title":"Default Customer Id Was Selected","default":false},"discovery_truncated":{"type":"boolean","title":"Discovery Truncated"},"enabled_customer_ids":{"items":{"type":"string"},"type":"array","title":"Enabled Customer Ids"}},"type":"object","required":["discovery_truncated"],"title":"GoogleAdsCustomersResponse","description":"The customers a Google Ads connection discovered, which of them are switched on, and its pin."},"GoogleAdsEnabledCustomersBody":{"properties":{"enabled_customer_ids":{"items":{"type":"string","maxLength":32},"type":"array","maxItems":500,"title":"Enabled Customer Ids"}},"additionalProperties":false,"type":"object","title":"GoogleAdsEnabledCustomersBody","description":"Choose which of a Google Ads connection's discovered customers Patricia may report on.\n\nThe whole set travels on every write rather than one id at a time, so the request states the\nintended end state instead of a delta whose meaning depends on what the server already held."},"GroupBreakdown":{"properties":{"group_id":{"type":"string","format":"uuid","title":"Group Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"memory_count":{"type":"integer","title":"Memory Count"},"channel_count":{"type":"integer","title":"Channel Count"}},"type":"object","required":["group_id","name","slug","memory_count","channel_count"],"title":"GroupBreakdown"},"GroupLimitView":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"dollars":{"type":"number","title":"Dollars"},"source":{"type":"string","title":"Source"},"min_dollars":{"type":"number","title":"Min Dollars"},"max_dollars":{"type":"number","title":"Max Dollars"},"triggers":{"items":{"$ref":"#/components/schemas/TriggerLimitView"},"type":"array","title":"Triggers"}},"type":"object","required":["key","label","description","dollars","source","min_dollars","max_dollars","triggers"],"title":"GroupLimitView","description":"A friendly group of per-run budgets (e.g. \"Conversations\"), shown as one input.\n\n``dollars`` is the representative ceiling for the group (the highest of its\ntriggers' effective budgets); editing it fans the one value out to every\ntrigger in the group on PATCH. ``triggers`` is the per-trigger breakdown for\nthe \"advanced\" reveal.\n\nDollar amounts are usage cost.\nUsage cost is Patricia's measure of what your work costs to run, not what you paid for your credits."},"GroupStatus":{"type":"string","enum":["active","archived"],"title":"GroupStatus","description":"Channel-group lifecycle (see plan 02-architecture/12)."},"GroupStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"GroupStatusRefReferenceFullValidator"},"GroupSuggestionStatus":{"type":"string","enum":["pending","accepted","dismissed","superseded"],"title":"GroupSuggestionStatus","description":"Lifecycle of a Patricia-proposed grouping (\"suggest, you own\")."},"GroupSuggestionStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"GroupSuggestionStatusRefReferenceFullValidator"},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"IdentityAssertionBody":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id","description":"The chat teammate this member is, as listed by GET /v1/actors."},"provider":{"type":"string","enum":["microsoft","slack"],"title":"Provider","description":"Which chat platform the teammate is on. Defaults to microsoft, so an omitted value keeps the Microsoft assertion. Send slack to connect a Slack teammate.","default":"microsoft"}},"additionalProperties":false,"type":"object","required":["actor_id"],"title":"IdentityAssertionBody","description":"POST /members/{id}/identity-assertion request body.\n\nThe chat teammate, by Patricia's own actor id, never by a directory id typed in by hand: the\nobject id is read off that row rather than taken from a request body. The row alone does not\nestablish that a provider ever saw the teammate, because actors are creatable through the\ngeneric CRUD surface. What each service does about that is its own ``_observation_evidence``\n(:func:`services.identity_binding.microsoft_link._observation_evidence`,\n:func:`services.identity_binding.slack_link._observation_evidence`).\n\n``provider`` selects which assertion service the route calls. It defaults to microsoft, so an\nomitted field keeps the Microsoft rung; ``slack`` reaches the Slack one."},"IdentityAssertionResult":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"identity_id":{"type":"string","format":"uuid","title":"Identity Id"},"directory_id":{"type":"string","title":"Directory Id"},"created":{"type":"boolean","title":"Created"},"awaiting_email_confirmation":{"type":"boolean","title":"Awaiting Email Confirmation","description":"True when this member has not confirmed their own email address. The connection is written and correct either way, and it grants no role in chat until they confirm. Reported on a repeat assertion as well as on a new one, because it describes the member's address rather than this call."}},"additionalProperties":false,"type":"object","required":["membership_id","actor_id","identity_id","directory_id","created","awaiting_email_confirmation"],"title":"IdentityAssertionResult","description":"What the assertion established. Ids only — no addresses and no directory object id."},"IdentityAssertionWithdrawalResult":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"identity_id":{"type":"string","format":"uuid","title":"Identity Id"},"directory_id":{"type":"string","title":"Directory Id"},"left_without_a_confirmed_way_to_sign_in":{"type":"boolean","title":"Left Without A Confirmed Way To Sign In","description":"True when Patricia could not confirm any remaining way for this member to sign in. The count is deliberately cautious and leaves out Microsoft connections, so a member who signs in with Microsoft can still have this reported for them. The withdrawal still happened: taking back a connection an admin made is never blocked by being the last one, because a wrongly made connection has to be removable. Invite the member to set a password or connect an account of their own if they need a way in."}},"additionalProperties":false,"type":"object","required":["membership_id","identity_id","directory_id","left_without_a_confirmed_way_to_sign_in"],"title":"IdentityAssertionWithdrawalResult","description":"What the withdrawal took away. Ids only — no addresses and no directory object id."},"IdentityBindingCaseReason":{"type":"string","enum":["subject_collision","password_origin_collision","invitation_collision","identity_link","revoked_reinstatement","support_recovery","cutover_carry"],"title":"IdentityBindingCaseReason","description":"Why an ``identity_binding_cases`` row exists (``reason_code``)."},"IdentityBindingCaseStatus":{"type":"string","enum":["proof_pending","approval_pending","ready","completed","denied","expired"],"title":"IdentityBindingCaseStatus","description":"Lifecycle of an ``identity_binding_cases`` row (``status_code``).\n\nLegal transitions are pinned by the case repository's CAS transition graph."},"ImportAuthorRequest":{"properties":{"manifest":{"additionalProperties":true,"type":"object","title":"Manifest","description":"The imported manifest, including any caller edits."},"skill_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Md","description":"The imported inert SKILL.md, if it had one."},"semver_is_derived":{"type":"boolean","title":"Semver Is Derived","description":"A hint that Patricia derived the version. Defaults to false so existing clients keep the manifest's own version. New clients set true only for a derived version. A wrong value cannot bypass a gate. The author route still validates and compiles the manifest.","default":false}},"type":"object","required":["manifest"],"title":"ImportAuthorRequest","description":"Author an imported skill from its caller-edited manifest and inert prose."},"ImportOutcome":{"type":"string","enum":["activates","needs_approval","refused"],"title":"ImportOutcome","description":"The result that an imported skill will have for the current caller."},"ImportedSkillPreview":{"properties":{"valid":{"type":"boolean","title":"Valid"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Mode"},"manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Manifest"},"skill_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Md"},"semver_is_derived":{"type":"boolean","title":"Semver Is Derived","description":"Whether Patricia derived the version. False means the source owns the version and the import details must stay unchanged."},"import_outcome":{"$ref":"#/components/schemas/ImportOutcome","description":"The caller's result: 'activates' saves an active version, 'needs_approval' saves a proposed version, and 'refused' saves nothing. This describes the caller, not the file or repository."}},"type":"object","required":["valid","semver_is_derived","import_outcome"],"title":"ImportedSkillPreview","description":"What an import WOULD create, shown before anything is saved.\n\nEvery field here is derived, and the point of returning them is that a person sees what Patricia\nread out of their file before it becomes a skill. The client may edit the ``manifest`` and post\nthat back; the author step re-validates and re-compiles from scratch, so nothing here is trusted.\n\n``import_outcome`` is a fact about the CALLER, not the file or repository. It says whether the\nimport activates, needs approval, or is refused without saving anything."},"IncomingEvent":{"properties":{"event_id":{"type":"string","maxLength":64,"minLength":1,"title":"Event Id"},"name":{"type":"string","maxLength":100,"minLength":1,"title":"Name"},"schema_version":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Schema Version"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At"},"properties":{"additionalProperties":true,"type":"object","title":"Properties"}},"additionalProperties":false,"type":"object","required":["event_id","name"],"title":"IncomingEvent","description":"One client-reported event."},"IngestEventsRequest":{"properties":{"events":{"items":{"$ref":"#/components/schemas/IncomingEvent"},"type":"array","maxItems":50,"minItems":1,"title":"Events"}},"additionalProperties":false,"type":"object","required":["events"],"title":"IngestEventsRequest","description":"A batch of events to ingest."},"IngestEventsResponse":{"properties":{"accepted":{"type":"integer","title":"Accepted"},"dropped":{"type":"integer","title":"Dropped"},"drops":{"items":{"$ref":"#/components/schemas/EventDrop"},"type":"array","title":"Drops"}},"type":"object","required":["accepted","dropped"],"title":"IngestEventsResponse","description":"Per-batch outcome."},"IngressReopenRequest":{"properties":{"platform_code":{"type":"string","maxLength":50,"minLength":1,"pattern":"^[a-z0-9_-]+$","title":"Platform Code"},"event_id":{"type":"string","maxLength":255,"minLength":1,"title":"Event Id"}},"type":"object","required":["platform_code","event_id"],"title":"IngressReopenRequest","description":"Exact ingress identity to reopen."},"IngressReopenResult":{"properties":{"platform_code":{"type":"string","title":"Platform Code"},"event_id":{"type":"string","title":"Event Id"},"reopened":{"type":"boolean","title":"Reopened","default":true},"fallback_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fallback Sent At","description":"Existing terminal notification tombstone, preserved by this operation."}},"type":"object","required":["platform_code","event_id"],"title":"IngressReopenResult","description":"Confirmation that processing state was reset."},"InstallAuthoredSkillRequest":{"properties":{"visibility":{"anyOf":[{"$ref":"#/components/schemas/SkillVisibility"},{"type":"null"}],"description":"team (everyone in the workspace) or personal (just you). Leave it out to take the widest scope you may create: team when you may share with the team, personal otherwise."}},"additionalProperties":false,"type":"object","title":"InstallAuthoredSkillRequest","description":"How widely to enable an authored skill. Optional: stating nothing takes the widest scope you may\ncreate, which is TEAM as it always has been for a caller who may share with the team.\n\n``personal`` enables it for the caller alone: their prompts carry the skill's guidance and nobody\nelse's do. Only an ``instructions`` skill can be born personal today (it is the one authored kind\nwhose runtime read filters by owner), and only a caller their workspace membership links to a chat\nprofile can own one.\n\n``visibility`` is unset rather than TEAM by default so that \"I did not say\" is ONE state: an absent\nbody and an empty one are the same preference gap, and the server fills both the same way. Only a\nstated ``team`` is read as an explicit ask, which is what gets refused without ``skills:install``."},"InstallSkillRequest":{"properties":{"slug":{"type":"string","title":"Slug"}},"type":"object","required":["slug"],"title":"InstallSkillRequest","description":"Install a git-catalog skill-platform skill into the tenant by its catalog ``slug``.\n\nThe install is born ``paused`` and pinned to the skill's active manifest version, with a default\nconfig seeded from the manifest's ``config_fields``. The admin completes the required settings\n(channel/timezone) and runs activation review before anything is delivered."},"InstallationPreviewSummary":{"properties":{"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"activated":{"type":"boolean","title":"Activated"},"killed":{"type":"boolean","title":"Killed"},"channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Id"},"status":{"type":"string","title":"Status"},"rows":{"items":{"$ref":"#/components/schemas/PreviewRowSummary"},"type":"array","title":"Rows"}},"type":"object","required":["installation_id","activated","killed","channel_id","status","rows"],"title":"InstallationPreviewSummary","description":"The full explainable dry-run preview for an installation (\"why will / won't fire\"). Posts nothing."},"InstallationSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"manifest_version_id":{"type":"string","format":"uuid","title":"Manifest Version Id"},"status_code":{"type":"string","title":"Status Code"},"config_version":{"type":"integer","title":"Config Version"},"projection_generation":{"type":"integer","title":"Projection Generation"},"activated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activated At"},"first_live_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Live At"},"killed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Killed At"},"kill_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kill Reason"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"listing_state":{"anyOf":[{"$ref":"#/components/schemas/SkillListingState"},{"type":"null"}]},"is_portable":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Portable"},"archetype_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Archetype Code"},"can_edit_definition":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Can Edit Definition"},"removable":{"type":"boolean","title":"Removable","description":"Whether this installation may be removed from the workspace.","default":true},"visibility_code":{"$ref":"#/components/schemas/SkillVisibility"},"is_mine":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Is Mine"},"can_change_visibility":{"type":"boolean","title":"Can Change Visibility","default":false},"has_settings":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Has Settings"},"is_catalog_default":{"type":"boolean","title":"Is Catalog Default","default":false},"effectively_enabled":{"type":"boolean","title":"Effectively Enabled","default":false},"update_available":{"type":"boolean","title":"Update Available","default":false},"available_version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Available Version Id"},"outdated_config":{"type":"boolean","title":"Outdated Config","default":false},"outdated_config_reasons":{"items":{"type":"string"},"type":"array","title":"Outdated Config Reasons"},"about":{"anyOf":[{"$ref":"#/components/schemas/SkillAboutSummary"},{"type":"null"}]}},"type":"object","required":["id","skill_id","manifest_version_id","status_code","config_version","projection_generation","activated_at","first_live_at","killed_at","kill_reason","visibility_code"],"title":"InstallationSummary","description":"A tenant's skill installation: the Hub card + settings header (no PII).\n\nCarries the installed skill's display metadata (``title``/``slug``/``description``) resolved from\nthe pinned manifest version's ``SkillDefinition`` so the Hub can name the card + page header without\na second lookup. These are display labels, never a personal fact (G4). Every response uses the\nshared installation-summary builder, which also supplies the definition's listing state."},"InstallationVisibilityBody":{"properties":{"expected_current":{"$ref":"#/components/schemas/SkillVisibility"},"target":{"$ref":"#/components/schemas/SkillVisibility"}},"additionalProperties":false,"type":"object","required":["expected_current","target"],"title":"InstallationVisibilityBody","description":"Move one installed skill between TEAM (the whole workspace) and PERSONAL (just its owner).\n\n``expected_current`` is a compare-and-set guard: the write lands only while the install is still\nat that scope, so a change that raced this one surfaces a conflict instead of silently clobbering.\nThe two values must DIFFER: a same-scope request is refused rather than treated as a harmless\nno-op, because the only thing such a write could do is reassign ownership."},"InstructionSkillBody":{"properties":{"title":{"type":"string","maxLength":255,"minLength":1,"title":"Title","description":"The skill's name, e.g. 'Refund policy'."},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description","description":"A one-line summary of what the skill helps with."},"instructions":{"type":"string","maxLength":8000,"minLength":1,"title":"Instructions","description":"Plain-markdown guidance: when someone asks about X, do Y; use our tone; check Z first."},"recommended_integrations":{"items":{"type":"string"},"type":"array","maxItems":12,"title":"Recommended Integrations","description":"App slugs from the integrations catalog to recommend connecting for this skill."},"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id","description":"When editing an existing instruction skill, its id. An edit targets this skill and keeps its identity even if the name changed. Omit when creating a new skill."}},"type":"object","required":["title","instructions"],"title":"InstructionSkillBody","description":"The SIMPLE instruction-skill form: a name, a short description, and plain-markdown instructions.\n\nThe default \"Build a skill\" experience for a non-engineer. No semver, no YAML, no schedules; the\nserver derives the slug + manages the version. ``recommended_integrations`` are app slugs (from the\nintegrations catalog) a teammate enabling the skill is nudged to connect if missing."},"InstructionSkillPriorityBody":{"properties":{"team_first":{"type":"boolean","title":"Team First","description":"Give team instruction skills first claim on the shared prompt budget for this workspace, instead of the platform default of personal instruction skills first."}},"additionalProperties":false,"type":"object","required":["team_first"],"title":"InstructionSkillPriorityBody","description":"Request body for setting a workspace's instruction-skill spend-order preference."},"InstructionSkillPriorityResponse":{"properties":{"team_first":{"type":"boolean","title":"Team First"}},"additionalProperties":false,"type":"object","required":["team_first"],"title":"InstructionSkillPriorityResponse","description":"The effective instruction-skill spend-order preference for a workspace."},"IntegrationAppDetailsResponse":{"properties":{"app_slug":{"type":"string","title":"App Slug"},"has_content":{"type":"boolean","title":"Has Content","default":false},"description":{"type":"string","title":"Description","default":""},"tools":{"items":{"$ref":"#/components/schemas/IntegrationToolBlurb"},"type":"array","title":"Tools"},"data_access":{"items":{"type":"string"},"type":"array","title":"Data Access"},"requirements":{"items":{"type":"string"},"type":"array","title":"Requirements"}},"type":"object","required":["app_slug"],"title":"IntegrationAppDetailsResponse","description":"Public read for the Connect sheet. ``has_content`` is False when no row is authored yet."},"IntegrationContentListItem":{"properties":{"app_slug":{"type":"string","title":"App Slug"},"description":{"type":"string","title":"Description"},"tool_count":{"type":"integer","title":"Tool Count"},"data_access_count":{"type":"integer","title":"Data Access Count"},"requirements_count":{"type":"integer","title":"Requirements Count"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["app_slug","description","tool_count","data_access_count","requirements_count","updated_at"],"title":"IntegrationContentListItem","description":"One row in the admin editor's list view.\n\nThe per-section counts travel with the row so the list can say which apps still need copy\nWITHOUT fetching every row: a sheet with no data-access or no requirements bullets renders\nhalf-empty, and the editor's \"needs work\" filter has to see that, not only a missing\ndescription or an empty tool list."},"IntegrationContentResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"app_slug":{"type":"string","title":"App Slug"},"description":{"type":"string","title":"Description"},"tools":{"items":{"$ref":"#/components/schemas/IntegrationToolBlurb"},"type":"array","title":"Tools"},"data_access":{"items":{"type":"string"},"type":"array","title":"Data Access"},"requirements":{"items":{"type":"string"},"type":"array","title":"Requirements"},"updated_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","app_slug","description","tools","data_access","requirements","updated_at"],"title":"IntegrationContentResponse","description":"Full authored row for the admin editor."},"IntegrationContentUpsertRequest":{"properties":{"description":{"type":"string","maxLength":2000,"title":"Description","default":""},"tools":{"items":{"$ref":"#/components/schemas/IntegrationToolBlurb"},"type":"array","maxItems":100,"title":"Tools"},"data_access":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Data Access"},"requirements":{"items":{"type":"string"},"type":"array","maxItems":50,"title":"Requirements"}},"additionalProperties":false,"type":"object","title":"IntegrationContentUpsertRequest","description":"Full replace of one app's sheet content (staff editor PUT body)."},"IntegrationStatus":{"type":"string","enum":["active","revoked","error","revoking","revoke_failed"],"title":"IntegrationStatus","description":"Lifecycle of a connected account.\n\n``ACTIVE`` is connected and usable. ``REVOKED`` has been disconnected. ``ERROR`` needs\nreconnecting. ``REVOKING`` is being disconnected right now, and ``REVOKE_FAILED`` is a\ndisconnect that did not finish, which an admin has to clear."},"IntegrationStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"IntegrationStatusRefReferenceFullValidator"},"IntegrationToolBlurb":{"properties":{"name":{"type":"string","maxLength":120,"minLength":1,"title":"Name"},"description":{"type":"string","maxLength":300,"title":"Description","default":""},"mode":{"type":"string","enum":["auto","ask_first"],"title":"Mode","default":"auto"}},"additionalProperties":false,"type":"object","required":["name"],"title":"IntegrationToolBlurb","description":"One row in the sheet's \"What Patricia can do\" list."},"IntegrationVisibility":{"type":"string","enum":["team","personal"],"title":"IntegrationVisibility","description":"Who, within a tenant, may use a connected account's tools.\n\n``TEAM``: any actor in the tenant. ``PERSONAL``: only the actor who connected it. Designed to\nextend to a ``GROUP`` scope later (the Groups model is already on main)."},"IntegrationVisibilityRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"IntegrationVisibilityRefReferenceFullValidator"},"IntroductionBlockedReason":{"type":"string","enum":["workspace_not_activated"],"title":"IntroductionBlockedReason","description":"Why the primary action is refused for the whole workspace."},"InvitationStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"InvitationStatusRefReferenceFullValidator"},"InviteBody":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"role_code":{"type":"string","title":"Role Code"}},"additionalProperties":false,"type":"object","required":["email","role_code"],"title":"InviteBody","description":"POST /members/invite request body."},"InviteResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"role_code":{"type":"string","title":"Role Code"},"status_code":{"type":"string","title":"Status Code"},"expires_at":{"type":"string","title":"Expires At"}},"type":"object","required":["id","email","role_code","status_code","expires_at"],"title":"InviteResponse","description":"POST /members/invite response (never exposes the raw token)."},"InvoiceLineView":{"properties":{"description":{"type":"string","title":"Description"},"quantity":{"type":"integer","title":"Quantity"},"unit_amount_cents":{"type":"integer","title":"Unit Amount Cents"},"amount_cents":{"type":"integer","title":"Amount Cents"}},"type":"object","required":["description","quantity","unit_amount_cents","amount_cents"],"title":"InvoiceLineView","description":"One line item on an invoice (money in integer cents)."},"InvoiceList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InvoiceView"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"InvoiceList","description":"GET /v1/billing/invoices: the tenant's invoices, newest first (no line items)."},"InvoiceView":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"invoice_number":{"type":"string","title":"Invoice Number"},"status":{"type":"string","title":"Status"},"issued_at":{"type":"string","title":"Issued At"},"currency_code":{"type":"string","title":"Currency Code"},"subtotal_cents":{"type":"integer","title":"Subtotal Cents"},"tax_cents":{"type":"integer","title":"Tax Cents"},"total_cents":{"type":"integer","title":"Total Cents"},"bill_to_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bill To Name"},"bill_to_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bill To Details"},"lines":{"items":{"$ref":"#/components/schemas/InvoiceLineView"},"type":"array","title":"Lines","default":[]}},"type":"object","required":["id","invoice_number","status","issued_at","currency_code","subtotal_cents","tax_cents","total_cents","bill_to_name"],"title":"InvoiceView","description":"A structured invoice for client-side PDF rendering (Pricing v2 §8b).\n\nAll money is INTEGER CENTS (``subtotal + tax = total``, tax-exclusive). ``lines`` is\npresent on the single-invoice read and omitted (empty) on the list, matching the\n``embed_config`` projection."},"JoinableChannel":{"properties":{"id":{"type":"string","title":"Id","description":"Slack channel id."},"name":{"type":"string","title":"Name","description":"Channel name, without the leading '#'."},"member_count":{"type":"integer","title":"Member Count","description":"How many people are in the channel, as Slack reports it."}},"type":"object","required":["id","name","member_count"],"title":"JoinableChannel","description":"One public Slack channel Patricia has not joined yet."},"JsonValue":{},"KeyFormContextResponse":{"properties":{"attempt_id":{"type":"string","format":"uuid","title":"Attempt Id"},"app_slug":{"type":"string","title":"App Slug"},"visibility":{"$ref":"#/components/schemas/IntegrationVisibility"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"reconnect_account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reconnect Account Id"}},"type":"object","required":["attempt_id","app_slug","visibility","expires_at"],"title":"KeyFormContextResponse","description":"The fixed context of a chat-started key form, for the person who started it."},"KillRequest":{"properties":{"killed":{"type":"boolean","title":"Killed"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["killed"],"title":"KillRequest","description":"Kill-switch toggle for an installation (G7)."},"LabelBody":{"properties":{"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"}},"additionalProperties":false,"type":"object","title":"LabelBody","description":"Set/clear a connected account's user NICKNAME. ``null`` or blank clears it."},"LandingHint":{"type":"string","enum":["pending_invitation","diverted_unknown_workspace"],"title":"LandingHint","description":"A non-authorization hint explaining WHY a session landed where it did.\n\nThe dashboard reads it to show the right next step instead of a bare landing. It never grants\naccess: the token's tenant claim (or its absence) is the sole authority. Two values, and they\ndiffer in whether the session has a workspace at all:\n\n``PENDING_INVITATION`` lands TENANT-LESS — a returning user with at least one pending invitation\nand no active available home. It is NOT \"only pending memberships\": the branch is chosen on\n``has_pending`` before the deactivated/unavailable fallback, so a user holding a pending invite\nalongside deactivated or unavailable ones lands here too. The SSO guard declines to mint an empty\nduplicate tenant, and the hint points them at accepting the invite / signing in from the\nconnected workspace.\n\n``DIVERTED_UNKNOWN_WORKSPACE`` lands WITH an active workspace — a returning user who signed in\nfrom a chat workspace Patricia does not know. The guard diverts them to their existing primary\nworkspace rather than minting a second one, and the hint is what lets the dashboard say so and\noffer a deliberate way to create a separate workspace instead of failing silently."},"LessonStatus":{"type":"string","enum":["proposed","active","retired"],"title":"LessonStatus"},"LessonStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"LessonStatusRefReferenceFullValidator"},"LinearStateType":{"type":"string","enum":["backlog","unstarted","started","completed","canceled"]},"LinkChannelBody":{"properties":{"conversation_id":{"type":"string","format":"uuid","title":"Conversation Id"}},"type":"object","required":["conversation_id"],"title":"LinkChannelBody","description":"Body for linking a channel (conversation) to a group."},"LinkedIdentityListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LinkedIdentityResponse"},"type":"array","title":"Items","description":"The person's own credentials, revoked ones included."}},"type":"object","required":["items"],"title":"LinkedIdentityListResponse","description":"Every federated credential the signed-in person holds, newest first."},"LinkedIdentityResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","description":"Identifier of this linked credential, for the unlink call."},"provider_code":{"type":"string","title":"Provider Code","description":"Which identity provider vouches for it, for example 'entra'."},"directory_id":{"type":"string","title":"Directory Id","description":"The provider directory or workspace the credential belongs to."},"linked_at":{"type":"string","format":"date-time","title":"Linked At","description":"When Patricia first recorded this credential."},"last_authenticated_at":{"type":"string","format":"date-time","title":"Last Authenticated At","description":"When this credential was last seen. Set when Patricia records the credential and moved forward on each successful sign-in with it, so it equals the connected time until the first sign-in rather than being absent. Never null: the column is NOT NULL with a server default."},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At","description":"When the link was removed, or null while it is live. A removed link is still listed so an unlink reads as a state change rather than as a row disappearing."}},"type":"object","required":["id","provider_code","directory_id","linked_at","last_authenticated_at"],"title":"LinkedIdentityResponse","description":"One federated credential the signed-in person holds.\n\nThe provider SUBJECT is deliberately absent. It is the directory object id of a real human and\nthe value somebody would need to forge a binding, and nobody needs to read it to know whether\ntheir account is linked. The directory id IS present: it is workspace-level rather than\nperson-level, an admin can already read it on the Teams settings page, and without it a person\nholding two Microsoft accounts cannot tell their rows apart."},"LinkedInAdAccountBody":{"properties":{"ad_account_id":{"type":"string","maxLength":64,"minLength":1,"title":"Ad Account Id"}},"additionalProperties":false,"type":"object","required":["ad_account_id"],"title":"LinkedInAdAccountBody","description":"Make one of a LinkedIn connection's discovered ad accounts its default."},"LinkedInAdAccountSummary":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"currency":{"type":"string","title":"Currency"},"status":{"type":"string","title":"Status"},"serving_statuses":{"items":{"type":"string"},"type":"array","title":"Serving Statuses"},"serving_holds":{"items":{"type":"string"},"type":"array","title":"Serving Holds"},"reference":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reference"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"test":{"type":"boolean","title":"Test","default":false},"is_active":{"type":"boolean","title":"Is Active","default":false},"can_write":{"type":"boolean","title":"Can Write","default":false},"edits_approved":{"type":"boolean","title":"Edits Approved","default":false},"enabled":{"type":"boolean","title":"Enabled","default":false}},"type":"object","required":["id","name","currency","status"],"title":"LinkedInAdAccountSummary","description":"One LinkedIn ad account this connection can reach, as the picker shows it."},"LinkedInAdAccountsResponse":{"properties":{"ad_accounts":{"items":{"$ref":"#/components/schemas/LinkedInAdAccountSummary"},"type":"array","title":"Ad Accounts"},"selected_ad_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Ad Account Id"},"enabled_ad_account_ids":{"items":{"type":"string"},"type":"array","title":"Enabled Ad Account Ids"}},"type":"object","title":"LinkedInAdAccountsResponse","description":"Every ad account a LinkedIn connection discovered, which are switched on, and the default."},"LinkedInEnabledAdAccountsBody":{"properties":{"enabled_ad_account_ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Enabled Ad Account Ids"}},"additionalProperties":false,"type":"object","title":"LinkedInEnabledAdAccountsBody","description":"Choose which of a LinkedIn connection's discovered ad accounts Patricia may use. An empty list is refused."},"LinkedInEnabledPagesBody":{"properties":{"enabled_page_ids":{"items":{"type":"string"},"type":"array","maxItems":1000,"title":"Enabled Page Ids"}},"additionalProperties":false,"type":"object","title":"LinkedInEnabledPagesBody","description":"Choose which of a LinkedIn connection's discovered pages Patricia may use. Empty parks them."},"LinkedInMemberSummary":{"properties":{"urn":{"type":"string","title":"Urn","default":""},"name":{"type":"string","title":"Name","default":""}},"type":"object","title":"LinkedInMemberSummary","description":"The member who connected LinkedIn. Only they can post as themselves."},"LinkedInPageBody":{"properties":{"page_id":{"type":"string","maxLength":64,"minLength":1,"title":"Page Id"}},"additionalProperties":false,"type":"object","required":["page_id"],"title":"LinkedInPageBody","description":"Make one of a LinkedIn connection's discovered pages its default."},"LinkedInPageSummary":{"properties":{"id":{"type":"string","title":"Id"},"urn":{"type":"string","title":"Urn"},"name":{"type":"string","title":"Name"},"vanity_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vanity Name"},"roles":{"items":{"type":"string"},"type":"array","title":"Roles"},"can_post":{"type":"boolean","title":"Can Post","default":false},"enabled":{"type":"boolean","title":"Enabled","default":false}},"type":"object","required":["id","urn","name"],"title":"LinkedInPageSummary","description":"One LinkedIn company page this connection can reach, as the picker shows it."},"LinkedInPagesResponse":{"properties":{"pages":{"items":{"$ref":"#/components/schemas/LinkedInPageSummary"},"type":"array","title":"Pages"},"selected_page_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Page Id"},"enabled_page_ids":{"items":{"type":"string"},"type":"array","title":"Enabled Page Ids"},"member":{"$ref":"#/components/schemas/LinkedInMemberSummary"}},"type":"object","title":"LinkedInPagesResponse","description":"Every page a LinkedIn connection discovered, which are switched on, the default, and the member."},"ListValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__mcp_personal_token__McpPersonalToken__FullValidator"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ListValidator","description":"The complete self-scoped token list."},"LiveProgress":{"properties":{"status":{"type":"string","title":"Status"},"task_excerpt":{"type":"string","title":"Task Excerpt"},"steps":{"items":{"type":"string"},"type":"array","title":"Steps"},"waiting_on":{"type":"string","title":"Waiting On"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","required":["status","task_excerpt","steps","waiting_on","updated_at"],"title":"LiveProgress","description":"A safe projection of the existing Redis run marker."},"LoginRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"password":{"type":"string","maxLength":128,"minLength":1,"format":"password","title":"Password","writeOnly":true},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id","description":"Select which membership tenant to scope the session to. Defaults to the primary tenant."},"captcha_token":{"type":"string","maxLength":2048,"title":"Captcha Token","default":""}},"additionalProperties":false,"type":"object","required":["email","password"],"title":"LoginRequest","description":"Login payload. ``tenant_id`` optionally selects among the user's tenants."},"LogoutRequest":{"properties":{"refresh_token":{"type":"string","maxLength":512,"minLength":1,"format":"password","title":"Refresh Token","writeOnly":true}},"additionalProperties":false,"type":"object","required":["refresh_token"],"title":"LogoutRequest","description":"Logout payload: revokes the refresh session."},"LowScoreCause":{"properties":{"reply_type_code":{"type":"string","title":"Reply Type Code"},"outcome_code":{"type":"string","title":"Outcome Code"},"below_passing":{"type":"integer","title":"Below Passing","description":"How many replies in this group fell below the passing band, never the group's total."},"mean_overall":{"type":"number","title":"Mean Overall","description":"The group's mean overall score. It shows the shape of the loss and does not set the rank."},"score_lost":{"type":"number","title":"Score Lost","description":"The group's total distance below the passing band. This is the ranking key."}},"type":"object","required":["reply_type_code","outcome_code","below_passing","mean_overall","score_lost"],"title":"LowScoreCause","description":"One sub-passing group from the judge reply taxonomy."},"MailboxOption":{"properties":{"value":{"type":"string","format":"uuid","title":"Value"},"label":{"type":"string","title":"Label"},"app_slug":{"type":"string","enum":["gmail","outlook"],"title":"App Slug"}},"type":"object","required":["value","label","app_slug"],"title":"MailboxOption","description":"One connected mailbox account a template can read: its id, its connection name and its provider."},"MailboxProofRedemptionResponse":{"properties":{"status":{"type":"string","const":"accepted","title":"Status","default":"accepted"},"mailbox_proof_id":{"type":"string","format":"uuid","title":"Mailbox Proof Id"}},"additionalProperties":false,"type":"object","required":["mailbox_proof_id"],"title":"MailboxProofRedemptionResponse","description":"The consumed proof id that a later member-merge request can cite."},"MakePrivateUnavailableReason":{"type":"string","enum":["already_private","managed_account","scope_sealed_at_connect","missing_edit_permission","owner_unknown","oauth_owner_mismatch"],"title":"MakePrivateUnavailableReason","description":"Why ``can_make_private`` is False for this caller. Null when it is True.\n\nThe value names the first term of that answer that fails, in the order ``account_capabilities``\nstates:\n\n- ``already_private``: the connection is private already.\n- ``managed_account``: Patricia manages the connection. The visibility write refuses a managed\n  connection for every caller.\n- ``scope_sealed_at_connect``: the connection's credential is sealed to the sharing it was\n  connected with (``core.scope_sealed_credentials``), and both visibility writes refuse to move\n  it in either direction. Disconnecting it and connecting it again with the sharing wanted is the\n  remedy.\n- ``missing_edit_permission``: the caller does not hold ``integrations:edit``.\n- ``owner_unknown``: the connection records nobody it could become private to. An MCP server\n  needs a ``connected_by_user_id``; any other connection needs a ``connected_by_email`` or a\n  ``connected_by_actor_id``.\n- ``oauth_owner_mismatch``: the MCP server signs in with OAuth, and its saved sign-in is not the\n  recorded connector's: there is none, it names another user or no membership, or its membership\n  is not the one the connector's owner contract resolves. The narrowing's grant check refuses it\n  with the ``MCP_OAUTH_OWNER_MISMATCH`` error code. Disconnecting the server and having that\n  person connect it again as private is the remedy."},"ManifestBody":{"properties":{"manifest":{"additionalProperties":true,"type":"object","title":"Manifest","description":"The skill manifest as a JSON object (the editor's fields)."}},"type":"object","required":["manifest"],"title":"ManifestBody","description":"A manifest object submitted by the editor (validate) or the manual author path."},"ManifestIn":{"properties":{"survivor_user_id":{"type":"string","format":"uuid","title":"Survivor User Id"},"survivor_email":{"type":"string","title":"Survivor Email","description":"The surviving human's address, as the legacy readers know it."},"participants":{"items":{"$ref":"#/components/schemas/ParticipantIn"},"type":"array","maxItems":50,"minItems":1,"title":"Participants"},"memberships":{"items":{"$ref":"#/components/schemas/MembershipRowIn"},"type":"array","maxItems":500,"title":"Memberships","description":"NOT YET SUPPORTED — must be empty. The recovery ceremony moves credential rows and never memberships, so a non-empty value is refused at approve with `manifest_memberships_unsupported`. The field is published because the document is the whole decision and its digest binds all of it; converging memberships is a later manifest-bound transition.","default":[]},"integration_accounts":{"items":{"$ref":"#/components/schemas/CredentialRowIn"},"type":"array","maxItems":500,"title":"Integration Accounts","default":[]},"pending_connections":{"items":{"$ref":"#/components/schemas/CredentialRowIn"},"type":"array","maxItems":500,"title":"Pending Connections","default":[]},"connector_repairs":{"items":{"$ref":"#/components/schemas/ConnectorRepairIn"},"type":"array","maxItems":500,"title":"Connector Repairs","default":[]}},"additionalProperties":false,"type":"object","required":["survivor_user_id","survivor_email","participants"],"title":"ManifestIn","description":"The decision, as the approver writes it down.\n\nEvery collection is BOUNDED, and the reason is the commit rather than the request. The ceremony\nis one transaction that locks each participant at stage 70 and then every named row in turn,\nand it holds all of them until it returns — so the length of these lists is the length of time\na recovery blocks every other writer that needs one of those users. Unbounded, a generated\ndocument naming a whole tenant's rows is a lock storm nobody typed on purpose. The bounds are\norders of magnitude above a real recovery, which reconciles two humans and names a handful of\nrows; hitting one is a 422 an operator can read, not a database that has gone quiet."},"MarkdownImportRequest":{"properties":{"name":{"type":"string","title":"Name","description":"What to call the skill. Its slug is derived from this."},"skill_md":{"type":"string","title":"Skill Md","description":"The pasted SKILL.md, frontmatter and all."}},"type":"object","required":["name","skill_md"],"title":"MarkdownImportRequest","description":"Preview the skill a pasted ``SKILL.md`` describes. Saves nothing.\n\n``name`` is asked for rather than guessed. A paste is the one source with no container, and the\nfolder path is where every other path takes the slug from — guessing it from the body's first\nheading would file the skill under whatever the author called their document, and the slug is the\none derived field a person cannot correct afterwards without re-importing."},"MarkdownInstructionSkillBody":{"properties":{"markdown":{"type":"string","maxLength":8000,"minLength":1,"title":"Markdown","description":"The skill's SKILL.md: optional `---` front matter (name, description) then markdown instructions."},"recommended_integrations":{"items":{"type":"string"},"type":"array","maxItems":12,"title":"Recommended Integrations","description":"App slugs from the integrations catalog to recommend connecting for this skill."},"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id","description":"When editing an existing instruction skill, its id. An edit targets this skill and keeps its identity even if the name changed. Omit when creating a new skill."}},"type":"object","required":["markdown"],"title":"MarkdownInstructionSkillBody","description":"The DEFAULT \"Build a skill\" form: a single pasted (or imported) SKILL.md document.\n\nThe teammate pastes standard SKILL.md markdown: an optional YAML front-matter block (``name`` +\n``description``) then plain-markdown instructions. The server parses it (front matter → name/description,\na leading ``# H1`` as the name fallback, the rest as the instruction body) and authors the SAME\n``instructions`` archetype as the typed path, with no separate name/instructions fields. The raw markdown is\npreserved verbatim so re-editing shows the author their own document. ``recommended_integrations`` are\noptional app slugs a teammate enabling the skill is nudged to connect if missing.\n\nThe parsed name is bounded to the same ``MAX_INSTRUCTIONS_TITLE_CHARS`` characters the typed form's\n``title`` field allows (mirrors the ``skill_catalog.title`` column). A longer one is refused with a\nfriendly validation error, the same way a missing name already is, so it never reaches the database."},"McpAuthDiscoveryBody":{"properties":{"base_url":{"type":"string","maxLength":2048,"title":"Base Url"}},"additionalProperties":false,"type":"object","required":["base_url"],"title":"McpAuthDiscoveryBody","description":"The address a member typed on the connect form, checked before they choose how to sign in.\n\nNo ``min_length``: ``validate_connect_url`` refuses a blank address with its own input sentence."},"McpAuthDiscoveryResponse":{"properties":{"mode":{"$ref":"#/components/schemas/McpDiscoveredAuthMode"}},"type":"object","required":["mode"],"title":"McpAuthDiscoveryResponse","description":"How the server at that address signs in. The address is not echoed back."},"McpCatalogOutcomeResponse":{"properties":{"complete":{"type":"boolean","title":"Complete"},"accepted_unique":{"type":"integer","title":"Accepted Unique"},"offered_unique":{"type":"integer","title":"Offered Unique"},"rejected":{"type":"integer","title":"Rejected"},"dropped_pre_schema":{"type":"integer","title":"Dropped Pre Schema"},"reasons":{"items":{"additionalProperties":{"type":"string"},"type":"object"},"type":"array","title":"Reasons"},"observed_at":{"type":"string","format":"date-time","title":"Observed At"}},"type":"object","required":["complete","accepted_unique","offered_unique","rejected","dropped_pre_schema","reasons","observed_at"],"title":"McpCatalogOutcomeResponse","description":"The last catalog reading recorded for a server — what it offered and how much Patricia took.\n\nThis exists because a refusal was previously invisible: a tool whose schema Patricia declines\nyields no spec, so it is simply ABSENT from the listing, indistinguishable from one the server\nwithdrew. The card could show a server as connected and healthy while half its catalog had been\nrefused, and no surface said so.\n\nEvery field describes THE READING, never the account's current rows. On a refused reduction the\nenabled rows are the PREVIOUS catalog, so the two answer different questions and must not be\nmixed in one sentence."},"McpConsentDecision":{"properties":{"status":{"$ref":"#/components/schemas/McpConsentOutcome"},"redirect_to":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect To"}},"type":"object","required":["status"],"title":"McpConsentDecision","description":"Where the dashboard must send the browser next."},"McpConsentDecisionBody":{"properties":{"request":{"type":"string","maxLength":512,"minLength":1,"title":"Request"}},"additionalProperties":false,"type":"object","required":["request"],"title":"McpConsentDecisionBody","description":"The parked-request handle, posted by the consent screen."},"McpConsentOutcome":{"type":"string","enum":["approved","denied","gone"],"title":"McpConsentOutcome","description":"What a decision call did."},"McpConsentRequest":{"properties":{"status":{"$ref":"#/components/schemas/McpConsentStatus"},"client_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Name"},"client_uri":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Client Uri"},"redirect_host":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Redirect Host"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"resource":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource"},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["status"],"title":"McpConsentRequest","description":"What the consent screen renders. Every field below ``status`` is absent when it is ``gone``."},"McpConsentStatus":{"type":"string","enum":["pending","gone"],"title":"McpConsentStatus","description":"Whether a parked authorization request is still answerable."},"McpDiscoveredAuthMode":{"type":"string","enum":["oauth","open","token_required","unknown"],"title":"McpDiscoveredAuthMode","description":"The authentication mode found before an MCP setup intent advances."},"McpServerResponse":{"properties":{"integration_account_id":{"type":"string","title":"Integration Account Id"},"external_account_id":{"type":"string","title":"External Account Id"},"base_url":{"type":"string","title":"Base Url"},"auth_mode":{"type":"string","title":"Auth Mode"},"header_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Header Name"},"negotiated_protocol_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Negotiated Protocol Version"},"connection_generation":{"type":"integer","title":"Connection Generation"},"refreshing":{"type":"boolean","title":"Refreshing"},"last_error_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Error Class"},"needs_reauth":{"type":"boolean","title":"Needs Reauth","default":false},"connected_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Connected By"},"catalog":{"anyOf":[{"$ref":"#/components/schemas/McpCatalogOutcomeResponse"},{"type":"null"}]},"visibility":{"type":"string","title":"Visibility"},"is_mine":{"type":"boolean","title":"Is Mine","default":false},"can_manage":{"type":"boolean","title":"Can Manage","default":false},"can_disconnect":{"type":"boolean","title":"Can Disconnect","default":false},"can_reconsent":{"type":"boolean","title":"Can Reconsent","default":false},"can_share_to_team":{"type":"boolean","title":"Can Share To Team","default":false},"can_make_private":{"type":"boolean","title":"Can Make Private","default":false},"share_to_team_unavailable_reason":{"anyOf":[{"$ref":"#/components/schemas/ShareToTeamUnavailableReason"},{"type":"null"}]},"make_private_unavailable_reason":{"anyOf":[{"$ref":"#/components/schemas/MakePrivateUnavailableReason"},{"type":"null"}]}},"type":"object","required":["integration_account_id","external_account_id","base_url","auth_mode","connection_generation","refreshing","visibility"],"title":"McpServerResponse","description":"What the dashboard renders on the card."},"McpSetupBeginBody":{"properties":{"setup_token":{"type":"string","minLength":1,"format":"password","title":"Setup Token","writeOnly":true}},"additionalProperties":false,"type":"object","required":["setup_token"],"title":"McpSetupBeginBody","description":"The one-time token read from the dashboard URL fragment."},"McpSetupBeginResponse":{"properties":{"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"server_url":{"type":"string","title":"Server Url"},"scope":{"type":"string","enum":["team","personal"],"title":"Scope"},"discovered_auth_mode":{"anyOf":[{"$ref":"#/components/schemas/McpDiscoveredAuthMode"},{"type":"null"}]}},"type":"object","required":["label","server_url","scope"],"title":"McpSetupBeginResponse","description":"The stored server details shown before the person submits the separate token."},"McpSetupCompleteBody":{"properties":{"setup_token":{"type":"string","minLength":1,"format":"password","title":"Setup Token","writeOnly":true},"auth_mode":{"type":"string","enum":["none","token"],"title":"Auth Mode","default":"token"},"token":{"anyOf":[{"type":"string","maxLength":8192,"format":"password","writeOnly":true},{"type":"null"}],"title":"Token","writeOnly":true},"header_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Header Name"}},"additionalProperties":false,"type":"object","required":["setup_token"],"title":"McpSetupCompleteBody","description":"The one-time setup token and the sign-in choice the person made in the browser.\n\n``auth_mode`` is the console dialog's own vocabulary, minus the option this route cannot serve:\nsigning in AT the server is a redirect ceremony and lives on ``/mcp-setup/oauth/start``. What is\nleft is the pair a single request can settle, and stating which one was chosen is what makes the\nno-credential answer an ANSWER rather than an empty field.\n\nA blank token used to be that answer by accident. ``min_length=1`` admitted a single space, which\n``_resolve_auth`` then stripped to nothing and recorded as a server needing no credential — so a\nmistyped paste and a deliberate choice produced the same connection, and neither the person nor\nthe row could tell them apart. A whitespace-only token is now a 422 and the choice has its own\nfield."},"McpSetupCompleteResponse":{"properties":{"account_id":{"type":"string","title":"Account Id"}},"type":"object","required":["account_id"],"title":"McpSetupCompleteResponse","description":"The connected account created by a completed setup."},"McpSetupOAuthStartBody":{"properties":{"client_id":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Client Secret"},"setup_token":{"type":"string","minLength":1,"format":"password","title":"Setup Token","writeOnly":true}},"additionalProperties":false,"type":"object","required":["setup_token"],"title":"McpSetupOAuthStartBody","description":"The one-time setup token, and a client credential only if the server demanded one.\n\n**There is no address, no audience and no label here, and their absence is the design.** Those\nthree were frozen when Patricia minted the link, under the requester's authority and, for a team\nserver, under an approval bound to them. The console's own start accepts an address and an\naudience from the browser and defaults a new connection to team, so a body that carried them\nwould let a personal request come back as a team connection with every console rule satisfied.\n\n``client_id`` and ``client_secret`` are the same pair the console's credentials step collects,\nINHERITED from :class:`services.mcp_oauth.PastedClientCredentialFields` rather than restated, so\na secret never arriving without an id, a blank id being refused, and an id being trimmed while a\nsecret keeps every byte are one rule with one implementation. ``OAuthStartBody`` inherits the\nsame base. They are the SECOND call of one connect, sent after this route answered that the\nserver's sign-in service will not register Patricia on its own."},"McpSetupOAuthStartResponse":{"properties":{"authorize_url":{"type":"string","title":"Authorize Url"},"attempt_id":{"type":"string","format":"uuid","title":"Attempt Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["authorize_url","attempt_id","expires_at"],"title":"McpSetupOAuthStartResponse","description":"Where to send the person, and what the ceremony they are leaving for will come back as."},"MeResponse":{"properties":{"user":{"$ref":"#/components/schemas/UserResponse"},"active_tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Active Tenant Id"},"memberships":{"items":{"$ref":"#/components/schemas/MembershipContext"},"type":"array","title":"Memberships"}},"type":"object","required":["user","active_tenant_id","memberships"],"title":"MeResponse","description":"The authenticated user plus their active tenant and all memberships."},"MeetingErasureReceiptView":{"properties":{"status":{"type":"string","enum":["erased","not_found"],"title":"Status","description":"'erased' when a recording existed and was removed; 'not_found' when there was none."},"complete":{"type":"boolean","title":"Complete","description":"True when everything this erasure reaches is gone, Recall's master recording included. It does not speak for the stores in known_residuals, which no erasure reaches yet."},"deleted":{"additionalProperties":{"type":"integer"},"type":"object","title":"Deleted","description":"Rows removed per store: the recording, its derived memories, its recap emails, and the cached copy of the recap posted into chat."},"known_residuals":{"items":{"type":"string"},"type":"array","title":"Known Residuals","description":"Stores holding meeting-derived content this erasure does not reach — the same list every time, so a residual is never a surprise."},"vendor_media_deleted":{"type":"boolean","title":"Vendor Media Deleted","description":"Whether Recall's stored media for this meeting was deleted AND verified gone.","default":false},"vendor_residual":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Vendor Residual","description":"Why the vendor copy could not be confirmed deleted, when it could not be."}},"type":"object","required":["status","complete"],"title":"MeetingErasureReceiptView","description":"What an erasure actually removed — counts and outcomes, never content.\n\n``status`` is the field to read first, because \"erased\" and \"not_found\" are the two answers a\nrow count cannot tell apart: an erasure that matched nothing looks exactly like one that had\nnothing to match. ``complete`` says whether everything this erasure REACHES is gone, and\n``known_residuals`` names the places it does not reach, so neither field has to carry the other's\nmeaning."},"MeetingFilterPeopleResponse":{"properties":{"owners":{"items":{"$ref":"#/components/schemas/MeetingOwnerOption"},"type":"array","title":"Owners"},"participants":{"items":{"$ref":"#/components/schemas/MeetingParticipantOption"},"type":"array","title":"Participants"}},"type":"object","title":"MeetingFilterPeopleResponse","description":"The people the Meetings list can be filtered by, so the UI never asks anyone to type an id."},"MeetingOwnerOption":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"name":{"type":"string","title":"Name","description":"The person's display name: what the picker shows."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"Their email, shown under the name to tell namesakes apart."},"meeting_count":{"type":"integer","title":"Meeting Count","description":"How many visible recordings they own."}},"type":"object","required":["actor_id","name","meeting_count"],"title":"MeetingOwnerOption","description":"One selectable meeting owner, with how many of the caller's visible recordings they own."},"MeetingParticipantOption":{"properties":{"name":{"type":"string","title":"Name","description":"The speaker label as it appears in the transcripts."},"meeting_count":{"type":"integer","title":"Meeting Count","description":"How many visible recordings they spoke in."}},"type":"object","required":["name","meeting_count"],"title":"MeetingParticipantOption","description":"One selectable participant, taken from the speaker labels on the transcripts themselves."},"MeetingRecordingDetailView":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The meeting's title, when one was given."},"platform":{"type":"string","title":"Platform","description":"The meeting platform (e.g. 'Zoom', 'Google Meet'), or 'the meeting'."},"status":{"type":"string","title":"Status","description":"Lifecycle: 'requested', 'recording', 'done' (processing), 'ingested' (notes ready), 'failed'."},"requested_at":{"type":"string","format":"date-time","title":"Requested At","description":"When the recording was requested."},"recap_state":{"type":"string","title":"Recap State","description":"Recap delivery state: 'posted' (confirmed delivered), 'not_posted' (attempted, not confirmed), 'pending', 'off' (auto-recap disabled), or 'none' (no recap yet)."},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id","description":"The conversation the recording was asked from (where the recap lives), when known."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"The short failure reason, only when status is 'failed'."},"owner_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Actor Id","description":"The person this recording belongs to, when the provenance is known."},"owner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Name","description":"That person's display name, when they are still a known actor in this workspace."},"attendees":{"items":{"type":"string"},"type":"array","title":"Attendees","description":"Distinct speaker names from the transcript, in speaking order (empty until notes are ready)."},"duration_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Minutes","description":"Approximate recorded minutes, from the transcript's spoken span."},"recap_text":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recap Text","description":"The recap Patricia generated for this meeting, when one was saved."},"speakers":{"items":{"$ref":"#/components/schemas/MeetingSpeakerShare"},"type":"array","title":"Speakers","description":"Transcript-text share by speaker, descending and bounded to 25 speakers."}},"type":"object","required":["id","platform","status","requested_at","recap_state"],"title":"MeetingRecordingDetailView","description":"One recording with its transcript-derived extras (attendees + rough duration)."},"MeetingRecordingHistoryItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title","description":"The meeting's title, when one was given."},"platform":{"type":"string","title":"Platform","description":"The meeting platform (e.g. 'Zoom', 'Google Meet'), or 'the meeting'."},"status":{"type":"string","title":"Status","description":"Lifecycle: 'requested', 'recording', 'done' (processing), 'ingested' (notes ready), 'failed'."},"requested_at":{"type":"string","format":"date-time","title":"Requested At","description":"When the recording was requested."},"recap_state":{"type":"string","title":"Recap State","description":"Recap delivery state: 'posted' (confirmed delivered), 'not_posted' (attempted, not confirmed), 'pending', 'off' (auto-recap disabled), or 'none' (no recap yet)."},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id","description":"The conversation the recording was asked from (where the recap lives), when known."},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"The short failure reason, only when status is 'failed'."},"owner_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Owner Actor Id","description":"The person this recording belongs to, when the provenance is known."},"owner_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Owner Name","description":"That person's display name, when they are still a known actor in this workspace."}},"type":"object","required":["id","platform","status","requested_at","recap_state"],"title":"MeetingRecordingHistoryItem","description":"One recorded meeting in the history list. Never carries the raw meeting URL (PII-adjacent)."},"MeetingRecordingHistoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MeetingRecordingHistoryItem"},"type":"array","title":"Items"}},"type":"object","title":"MeetingRecordingHistoryResponse","description":"The workspace's recent recordings, newest first."},"MeetingSpeakerShare":{"properties":{"name":{"type":"string","title":"Name"},"share_pct":{"type":"number","title":"Share Pct"}},"type":"object","required":["name","share_pct"],"title":"MeetingSpeakerShare","description":"One speaker's share of the included transcript text."},"MeetingTranscriptPage":{"properties":{"turns":{"items":{"$ref":"#/components/schemas/MeetingTranscriptTurn"},"type":"array","title":"Turns"},"total":{"type":"integer","title":"Total"},"offset":{"type":"integer","title":"Offset"},"limit":{"type":"integer","title":"Limit"}},"type":"object","required":["total","offset","limit"],"title":"MeetingTranscriptPage","description":"An offset page over the recording's fully merged transcript turns."},"MeetingTranscriptTurn":{"properties":{"speaker":{"type":"string","title":"Speaker"},"text":{"type":"string","title":"Text"},"start":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Start"}},"type":"object","required":["speaker","text"],"title":"MeetingTranscriptTurn","description":"One readable transcript turn after consecutive same-speaker segments are merged."},"MeetingUsageView":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Whether meeting recording is enabled for this workspace."},"slots_in_use":{"type":"integer","title":"Slots In Use","description":"Concurrent recording slots currently in use (requested + recording)."},"max_concurrent":{"type":"integer","title":"Max Concurrent","description":"The most bots this workspace may record at once (the slot cap)."},"monthly_minutes_used":{"type":"integer","title":"Monthly Minutes Used","description":"Recorded minutes metered this calendar month."},"monthly_minutes_budget":{"type":"integer","title":"Monthly Minutes Budget","description":"The workspace's recorded-minutes budget for the month."},"active_recordings":{"items":{"$ref":"#/components/schemas/ActiveRecordingView"},"type":"array","title":"Active Recordings","description":"The currently-active recordings, oldest first."}},"type":"object","required":["enabled","slots_in_use","max_concurrent","monthly_minutes_used","monthly_minutes_budget"],"title":"MeetingUsageView","description":"A workspace's live meeting-bot usage: slots in use vs the cap, monthly minutes, and active calls."},"MeetingsEffectiveSettingsView":{"properties":{"recap_email_audience":{"type":"string","enum":["everyone_on_invite","workspace_participants","company_domain","only_me","do_not_send"],"title":"Recap Email Audience"},"recap_email_excludes_externals":{"type":"boolean","title":"Recap Email Excludes Externals","description":"The same clamp as the team field, answered for THIS caller's resolved audience: true when their own recap emails reach nobody outside the workspace even though their audience asks for them. Separate from the team answer, which can differ whenever they override it."},"prep_email_audience":{"type":"string","enum":["all_participants","only_me","do_not_send"],"title":"Prep Email Audience"},"autojoin_scope":{"type":"string","enum":["any_meeting_link","i_host","internal","external","workspace_teammates"],"title":"Autojoin Scope"}},"type":"object","required":["recap_email_audience","recap_email_excludes_externals","prep_email_audience","autojoin_scope"],"title":"MeetingsEffectiveSettingsView","description":"The resolved personal policies this caller actually receives."},"MeetingsPersonalSettingsUpdate":{"properties":{"autojoin_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autojoin Enabled","description":"Your consent to automatic meeting joins. Workspace recording and join switches also apply."},"recap_email_audience":{"anyOf":[{"type":"string","enum":["everyone_on_invite","workspace_participants","company_domain","only_me","do_not_send"]},{"type":"null"}],"title":"Recap Email Audience","description":"Who receives recap emails for your meetings. Null follows the workspace default."},"prep_email_audience":{"anyOf":[{"type":"string","enum":["all_participants","only_me","do_not_send"]},{"type":"null"}],"title":"Prep Email Audience","description":"Who receives preparation emails for your meetings. Null follows the workspace default."},"autojoin_scope":{"anyOf":[{"type":"string","enum":["any_meeting_link","i_host","internal","external","workspace_teammates"]},{"type":"null"}],"title":"Autojoin Scope","description":"Your calendar events eligible for automatic joins. Null follows the workspace default."}},"additionalProperties":false,"type":"object","title":"MeetingsPersonalSettingsUpdate","description":"PUT body for the caller's own meeting preferences."},"MeetingsPersonalSettingsView":{"properties":{"autojoin_enabled":{"type":"boolean","title":"Autojoin Enabled","description":"Whether auto-join is on for THIS person's own calendar meetings. On by default; only their explicit opt-out turns it off. It acts only once their own calendar is connected."},"recap_email_audience":{"anyOf":[{"type":"string","enum":["everyone_on_invite","workspace_participants","company_domain","only_me","do_not_send"]},{"type":"null"}],"title":"Recap Email Audience","description":"The caller's override, or null to follow the workspace default."},"prep_email_audience":{"anyOf":[{"type":"string","enum":["all_participants","only_me","do_not_send"]},{"type":"null"}],"title":"Prep Email Audience","description":"The caller's override, or null to follow the workspace default."},"autojoin_scope":{"anyOf":[{"type":"string","enum":["any_meeting_link","i_host","internal","external","workspace_teammates"]},{"type":"null"}],"title":"Autojoin Scope","description":"The caller's override, or null to follow the workspace default."}},"type":"object","required":["autojoin_enabled"],"title":"MeetingsPersonalSettingsView","description":"The caller's own meeting preferences (per-person, self-set)."},"MeetingsSettingsView":{"properties":{"recording_enabled":{"type":"boolean","title":"Recording Enabled","description":"Effective recording enablement: the workspace toggle AND the platform arming."},"team":{"$ref":"#/components/schemas/MeetingsTeamSettingsView"},"personal":{"$ref":"#/components/schemas/MeetingsPersonalSettingsView"},"effective":{"$ref":"#/components/schemas/MeetingsEffectiveSettingsView"},"workspace_domains":{"items":{"type":"string"},"type":"array","title":"Workspace Domains","description":"Every non-consumer email domain represented by non-deactivated workspace members."},"calendar":{"$ref":"#/components/schemas/CalendarConnectionView"},"autojoin":{"$ref":"#/components/schemas/AutojoinStateView"},"recording_visibility_choices":{"items":{"$ref":"#/components/schemas/RecordingVisibilityChoiceView"},"type":"array","title":"Recording Visibility Choices","description":"Every recording-visibility value with the consequence of choosing it, resolved against the workspace's current recap-email audience. The dashboard renders these rather than recomputing anything, so a stated consequence is the sender's own answer."},"recap_email_audience_choices":{"items":{"$ref":"#/components/schemas/RecapEmailAudienceChoiceView"},"type":"array","title":"Recap Email Audience Choices","description":"The same, for the other picker: every recap-email audience value with the consequence of choosing it, resolved against the workspace's current recording policy."},"can_edit_team":{"type":"boolean","title":"Can Edit Team","description":"Whether the caller may change the team-level settings (admin/owner)."},"can_edit_personal":{"type":"boolean","title":"Can Edit Personal","description":"Whether the caller may change their own auto-join opt-in (holds preferences:edit; a read-only viewer cannot). The UI disables the personal switch when false."}},"type":"object","required":["recording_enabled","team","personal","effective","calendar","autojoin","can_edit_team","can_edit_personal"],"title":"MeetingsSettingsView","description":"Everything the dashboard's Meetings view needs in one read: settings, calendar, and the gate."},"MeetingsTeamSettingsUpdate":{"properties":{"autojoin_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Autojoin Enabled","description":"Allow automatic meeting joins for the workspace, subject to the recording switch and personal consent."},"recap_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Recap Enabled","description":"Send meeting recaps after recording."},"recap_destination":{"anyOf":[{"type":"string","enum":["thread","channel","dm"]},{"type":"null"}],"title":"Recap Destination","description":"Where Patricia sends the meeting recap. Owner-only recording access sends it to the owner."},"recap_channel_id":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Recap Channel Id","description":"The selected recap channel. Null clears the channel."},"recap_channel_platform":{"anyOf":[{"type":"string","maxLength":50},{"type":"null"}],"title":"Recap Channel Platform","description":"The workspace platform that holds the recap channel."},"recap_share_instructions":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Recap Share Instructions","description":"Instructions Patricia follows when sharing the meeting recap."},"recap_email_audience":{"anyOf":[{"type":"string","enum":["everyone_on_invite","workspace_participants","company_domain","only_me","do_not_send"]},{"type":"null"}],"title":"Recap Email Audience","description":"The workspace default for who receives a recap email."},"prep_email_audience":{"anyOf":[{"type":"string","enum":["all_participants","only_me","do_not_send"]},{"type":"null"}],"title":"Prep Email Audience","description":"The workspace default for who receives a meeting preparation email."},"autojoin_scope":{"anyOf":[{"type":"string","enum":["any_meeting_link","i_host","internal","external","workspace_teammates"]},{"type":"null"}],"title":"Autojoin Scope","description":"The calendar events eligible for automatic joins."},"recording_visibility":{"anyOf":[{"type":"string","enum":["teammates_and_link","participants_and_teammates","participants","teammates","only_me"]},{"type":"null"}],"title":"Recording Visibility","description":"Who can open the meeting recording."},"public_access_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Public Access Enabled","description":"Allow public access to recordings when the recording policy permits it."}},"additionalProperties":false,"type":"object","title":"MeetingsTeamSettingsUpdate","description":"PATCH body for the team settings: every field optional; only what's provided is written.\n\n``recap_channel_id``, ``recap_channel_platform``, and ``recap_share_instructions`` accept an\nexplicit null to clear. Choosing the 'channel' destination requires a channel and platform in\nthe same request or already stored. The server enforces the post-update shape."},"MeetingsTeamSettingsView":{"properties":{"autojoin_enabled":{"type":"boolean","title":"Autojoin Enabled","description":"Whether auto-join is armed for the workspace. On by default (a workspace that never opened these settings reads on); an admin's explicit opt-out turns it off."},"recap_enabled":{"type":"boolean","title":"Recap Enabled","description":"Whether Patricia auto-posts a recap when a meeting's notes are ready."},"recap_destination":{"type":"string","enum":["thread","channel","dm"],"title":"Recap Destination","description":"Where a recap goes when there is no asking thread to reply into (an auto-joined meeting): 'thread' replies where asked, 'channel' posts to the chosen channel, 'dm' messages the person whose meeting it was."},"recap_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recap Channel Id","description":"The channel recaps go to when the destination is 'channel'."},"recap_channel_platform":{"anyOf":[{"type":"string","enum":["slack","teams"]},{"type":"null"}],"title":"Recap Channel Platform","description":"The stored chat platform for the recap channel, or null when none is stored."},"recap_share_instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recap Share Instructions","description":"How Patricia should write recaps (e.g. 'summarize the action items and name each owner'). Steers the recap text only."},"recap_email_audience":{"type":"string","enum":["everyone_on_invite","workspace_participants","company_domain","only_me","do_not_send"],"title":"Recap Email Audience","description":"Workspace default for meeting recap emails."},"recap_email_excludes_externals":{"type":"boolean","title":"Recap Email Excludes Externals","description":"True when this workspace default asks for people who are not in the workspace but recording_visibility refuses them, so none of them receive the recap email. Server-derived from the same two rules the sender applies; the dashboard renders it as a plain warning."},"prep_email_audience":{"type":"string","enum":["all_participants","only_me","do_not_send"],"title":"Prep Email Audience","description":"Workspace default for meeting-preparation emails."},"autojoin_scope":{"type":"string","enum":["any_meeting_link","i_host","internal","external","workspace_teammates"],"title":"Autojoin Scope","description":"Workspace default for which calendar meetings Patricia joins."},"recording_visibility":{"type":"string","enum":["teammates_and_link","participants_and_teammates","participants","teammates","only_me"],"title":"Recording Visibility","description":"This policy controls who can open a recording, its recap, and transcript in the meetings area. It also controls whose chat questions can surface the meeting's notes from Patricia's memory."},"public_access_enabled":{"type":"boolean","title":"Public Access Enabled","description":"Saved intent for future public meeting links."}},"type":"object","required":["autojoin_enabled","recap_enabled","recap_destination","recap_email_audience","recap_email_excludes_externals","prep_email_audience","autojoin_scope","recording_visibility","public_access_enabled"],"title":"MeetingsTeamSettingsView","description":"The workspace-level meeting settings (the enforced ``meeting_bot_tenant_settings`` values)."},"MemberActionBlockedReason":{"type":"string","enum":["rate_limited","once_ever_hello"],"title":"MemberActionBlockedReason","description":"Why the roster's next action is disabled."},"MemberAdoption":{"properties":{"numerator":{"type":"integer","title":"Numerator"},"denominator":{"type":"integer","title":"Denominator"}},"type":"object","required":["numerator","denominator"],"title":"MemberAdoption","description":"Workspace adoption terms derived from the returned roster items."},"MemberDeactivationRequest":{"properties":{"membership_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Membership Ids"}},"additionalProperties":false,"type":"object","required":["membership_ids"],"title":"MemberDeactivationRequest","description":"The exact memberships selected for bulk removal."},"MemberDeactivationResponse":{"properties":{"requested":{"type":"integer","title":"Requested"},"removed":{"type":"integer","title":"Removed"},"refused":{"type":"integer","title":"Refused"},"results":{"items":{"$ref":"#/components/schemas/MemberRemovalResultItem"},"type":"array","title":"Results"},"connections_disconnected":{"type":"integer","title":"Connections Disconnected","default":0},"revocations_queued":{"type":"integer","title":"Revocations Queued","default":0}},"type":"object","required":["requested","removed","refused","results"],"title":"MemberDeactivationResponse","description":"Ordered bulk-removal outcomes and their counts.\n\nCarries the same two credential counts as :class:`MemberRemovalResponse`, and for the same reason:\na departing member's personal connections go with them, and a token they pasted can only be\nrotated at the server that issued it. Removing several members at once is where the most\ncredentials leave at once, so telling the admin here matters more than on the single-member route,\nnot less.\n\nBatch TOTALS rather than per-member figures. What the admin has to act on is \"some of what just\nleft cannot be revoked from here\", which is a property of the batch; attributing a count to each\nmembership would put a number next to people who connected nothing, and the per-member breakdown\nbelongs to the connection list rather than to a removal receipt."},"MemberLifecycleStatus":{"type":"string","enum":["removed","activated","unknown","invite_expired","invited","not_invited"],"title":"MemberLifecycleStatus","description":"The lifecycle state shown for one team member."},"MemberLinkUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Provider sign-in URL carrying the signed, browser-bound link state."}},"type":"object","required":["url"],"title":"MemberLinkUrlResponse","description":"Where to send the browser so somebody can prove a provider identity."},"MemberListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemberRosterRow"},"type":"array","title":"Items"},"adoption":{"$ref":"#/components/schemas/MemberAdoption"},"has_invited_anyone":{"type":"boolean","title":"Has Invited Anyone"}},"type":"object","required":["items","adoption","has_invited_anyone"],"title":"MemberListResponse","description":"Paginated-style wrapper (flat list; no cursor needed at team scale)."},"MemberMailboxProofIssueResponse":{"properties":{"queued":{"type":"boolean","const":true,"title":"Queued","default":true},"target_membership_id":{"type":"string","format":"uuid","title":"Target Membership Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["target_membership_id","expires_at"],"title":"MemberMailboxProofIssueResponse","description":"A safe receipt for a queued mailbox proof email."},"MemberMergeCarriedItem":{"properties":{"table":{"type":"string","title":"Table"},"column":{"type":"string","title":"Column"},"row_count":{"type":"integer","title":"Row Count"}},"type":"object","required":["table","column","row_count"],"title":"MemberMergeCarriedItem","description":"One group of rows the merge moves, named for a person rather than for the schema."},"MemberMergePreviewBody":{"properties":{"surviving_membership_id":{"type":"string","format":"uuid","title":"Surviving Membership Id","description":"The member who keeps their account."},"retiring_membership_id":{"type":"string","format":"uuid","title":"Retiring Membership Id","description":"The duplicate, retired by the merge."},"mailbox_proof_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Mailbox Proof Id","description":"A consumed mailbox proof issued for the retiring member."}},"additionalProperties":false,"type":"object","required":["surviving_membership_id","retiring_membership_id"],"title":"MemberMergePreviewBody","description":"Which two members, and which way round."},"MemberMergePreviewResponse":{"properties":{"allowed":{"type":"boolean","title":"Allowed"},"evidence_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Evidence Code"},"refusal_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refusal Code"},"detail":{"additionalProperties":true,"type":"object","title":"Detail"},"emails_gained":{"items":{"type":"string"},"type":"array","title":"Emails Gained"},"chat_identity_moves":{"type":"boolean","title":"Chat Identity Moves","default":false},"rows_moved":{"type":"integer","title":"Rows Moved","default":0},"carried":{"items":{"$ref":"#/components/schemas/MemberMergeCarriedItem"},"type":"array","title":"Carried"}},"type":"object","required":["allowed"],"title":"MemberMergePreviewResponse","description":"What would happen, and if it may not, why not."},"MemberMergeResponse":{"properties":{"merge_id":{"type":"string","format":"uuid","title":"Merge Id"},"surviving_membership_id":{"type":"string","format":"uuid","title":"Surviving Membership Id"},"retiring_membership_id":{"type":"string","format":"uuid","title":"Retiring Membership Id"},"evidence_code":{"type":"string","title":"Evidence Code"},"rows_moved":{"type":"integer","title":"Rows Moved"},"emails_gained":{"items":{"type":"string"},"type":"array","title":"Emails Gained"}},"type":"object","required":["merge_id","surviving_membership_id","retiring_membership_id","evidence_code","rows_moved"],"title":"MemberMergeResponse","description":"The recorded merge."},"MemberNextAction":{"type":"string","enum":["send_invite","send_reminder","resend_invite","invite_to_platform","send_email_invite","none"],"title":"MemberNextAction","description":"The action the team roster can offer for one member."},"MemberNextStepOutcome":{"type":"string","enum":["invited_dm","invited_email","reminded_email","skipped_activated","skipped_rate_limited","skipped_no_second_hello","skipped_unknown_history","skipped_already_queued","skipped_guest","skipped_guest_unverified","skipped_no_channel","skipped_attempts_exhausted","skipped_deactivated","skipped_email_suppressed","skipped_owner_role","failed","invited_to_platform","email_invite_sent","skipped_nothing_to_do"],"title":"MemberNextStepOutcome","description":"The result of one server-derived member action."},"MemberNextStepResponse":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"outcome":{"$ref":"#/components/schemas/MemberNextStepOutcome"},"channel":{"anyOf":[{"$ref":"#/components/schemas/MemberOutreachChannel"},{"type":"null"}]}},"type":"object","required":["membership_id","outcome","channel"],"title":"MemberNextStepResponse","description":"The outcome and selected lane for one member's current next step."},"MemberOutreachChannel":{"type":"string","enum":["slack_dm","teams_dm","email"],"title":"MemberOutreachChannel","description":"The delivery lane selected for one member."},"MemberOutreachOutcome":{"type":"string","enum":["invited_dm","invited_email","reminded_email","skipped_activated","skipped_rate_limited","skipped_no_second_hello","skipped_unknown_history","skipped_already_queued","skipped_guest","skipped_guest_unverified","skipped_no_channel","skipped_attempts_exhausted","skipped_deactivated","skipped_email_suppressed","skipped_owner_role","failed"],"title":"MemberOutreachOutcome","description":"The result of one requested member outreach action."},"MemberOutreachRequest":{"properties":{"membership_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":100,"minItems":1,"title":"Membership Ids"}},"additionalProperties":false,"type":"object","required":["membership_ids"],"title":"MemberOutreachRequest","description":"The exact memberships selected for bulk outreach."},"MemberOutreachResponse":{"properties":{"requested":{"type":"integer","title":"Requested"},"invited":{"type":"integer","title":"Invited"},"reminded":{"type":"integer","title":"Reminded"},"skipped":{"type":"integer","title":"Skipped"},"results":{"items":{"$ref":"#/components/schemas/MemberOutreachResultItem"},"type":"array","title":"Results"}},"type":"object","required":["requested","invited","reminded","skipped","results"],"title":"MemberOutreachResponse","description":"Ordered bulk outreach outcomes and their counts."},"MemberOutreachResultItem":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"outcome":{"$ref":"#/components/schemas/MemberOutreachOutcome"},"channel":{"anyOf":[{"$ref":"#/components/schemas/MemberOutreachChannel"},{"type":"null"}]}},"type":"object","required":["membership_id","outcome","channel"],"title":"MemberOutreachResultItem","description":"The outcome and selected lane for one membership."},"MemberRemovalOutcome":{"type":"string","enum":["removed","already_removed","refused_owner","refused_self","refused_security_hold","refused_status_held","not_found","failed"],"title":"MemberRemovalOutcome","description":"The result of one requested member removal."},"MemberRemovalResponse":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"connections_disconnected":{"type":"integer","title":"Connections Disconnected"},"revocations_queued":{"type":"integer","title":"Revocations Queued"}},"type":"object","required":["membership_id","connections_disconnected","revocations_queued"],"title":"MemberRemovalResponse","description":"What removing one member did BEYOND deactivating them.\n\nThe route used to answer 204. It answers a body now because the removal has a consequence the\nperson doing it cannot otherwise see: a departing member's personal connections are disconnected\nwith them, and one of the two credential kinds cannot be taken back by Patricia at all. An admin\nwho is not told that believes the offboarding is finished when a token they have never seen is\nstill live at somebody else's server.\n\nTwo counts rather than one, because the two kinds owe different actions and a single number could\nonly support the weaker sentence. ``revocations_queued`` is a promise about work that is owed and\ndrained in the background, never a report that the provider has confirmed anything."},"MemberRemovalResultItem":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"outcome":{"$ref":"#/components/schemas/MemberRemovalOutcome"}},"type":"object","required":["membership_id","outcome"],"title":"MemberRemovalResultItem","description":"The removal outcome for one requested membership."},"MemberRosterRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"role_code":{"type":"string","title":"Role Code"},"status_code":{"type":"string","title":"Status Code"},"first_interacted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Interacted At"},"first_interacted_platform_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Interacted Platform Code"},"first_signed_in_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Signed In At"},"email_disabled":{"type":"boolean","title":"Email Disabled","default":false},"guest_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Tier"},"is_external":{"type":"boolean","title":"Is External","description":"True only on a positively proven Slack Connect actor; never a claim about false.","default":false},"slack_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack User Id","description":"The member's Slack id when their linked actor is a Slack one, and the subject a deletion request names. Null covers three people the console treats alike: a member never seen in Slack, a member whose linked actor is on another platform, and a Slack actor whose id the deletion route's subject pattern would refuse. None of these three people is erasable through this field, and null is no claim that the person has no Slack data elsewhere."},"status":{"$ref":"#/components/schemas/MemberLifecycleStatus","description":"Activated = the member's first human-directed run in this workspace (mention, DM, message, or a legacy manual run). Silent, failed, parked, reaped and soft-deleted runs count. A console login does not."},"invited_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Invited At"},"delivered_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Delivered At"},"activated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Activated At"},"last_chat_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Chat At"},"last_console_activity_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Console Activity At"},"next_action":{"$ref":"#/components/schemas/MemberNextAction"},"next_action_enabled":{"type":"boolean","title":"Next Action Enabled"},"next_action_blocked_reason":{"anyOf":[{"$ref":"#/components/schemas/MemberActionBlockedReason"},{"type":"null"}]},"counts_as_adopted":{"type":"boolean","title":"Counts As Adopted"},"counts_toward_adoption":{"type":"boolean","title":"Counts Toward Adoption"}},"type":"object","required":["id","email","name","handle","role_code","status_code","first_interacted_platform_code","first_signed_in_at","status","invited_at","delivered_at","activated_at","last_chat_at","last_console_activity_at","next_action","next_action_enabled","next_action_blocked_reason","counts_as_adopted","counts_toward_adoption"],"title":"MemberRosterRow","description":"A member enriched with lifecycle and activity facts for the roster."},"MemberRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"name":{"type":"string","title":"Name"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"role_code":{"type":"string","title":"Role Code"},"status_code":{"type":"string","title":"Status Code"},"first_interacted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Interacted At"},"first_interacted_platform_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Interacted Platform Code"},"first_signed_in_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"First Signed In At"},"email_disabled":{"type":"boolean","title":"Email Disabled","default":false},"guest_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Guest Tier"}},"type":"object","required":["id","email","name","handle","role_code","status_code","first_interacted_platform_code","first_signed_in_at"],"title":"MemberRow","description":"A single member returned after a mutation."},"MemberSourceRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"MemberSourceRefReferenceFullValidator"},"MembershipContext":{"properties":{"tenant":{"$ref":"#/components/schemas/TenantSummary"},"role_code":{"type":"string","title":"Role Code"},"scopes":{"items":{"type":"string"},"type":"array","title":"Scopes"}},"type":"object","required":["tenant","role_code","scopes"],"title":"MembershipContext","description":"A user's membership in one tenant: role + the scopes that role grants."},"MembershipRowIn":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"disposition":{"$ref":"#/components/schemas/RowDisposition"}},"additionalProperties":false,"type":"object","required":["membership_id","disposition"],"title":"MembershipRowIn"},"MembershipStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"MembershipStatusRefReferenceFullValidator"},"MemoryKind":{"type":"string","enum":["fact","preference","entity","event","lesson","summary"],"title":"MemoryKind"},"MemoryKindRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"MemoryKindRefReferenceFullValidator"},"MemoryMap":{"properties":{"points":{"items":{"$ref":"#/components/schemas/MemoryMapPoint"},"type":"array","title":"Points"},"total":{"type":"integer","title":"Total","description":"Points in this response. Never a count over rows the caller cannot read."},"ready":{"type":"boolean","title":"Ready","description":"True when this workspace has a map built by the current recipe. False when no map was built yet or the stored map used a different recipe."},"built_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Built At","description":"When the served map was built, or null when `ready` is false."}},"type":"object","required":["points","total","ready","built_at"],"title":"MemoryMap","description":"Every point of this tenant's projection that the calling person may see.\n\nNever a sample. A map that silently drew some of the corpus would misrepresent the rest of it,\nso this returns the caller's whole visible point set or an empty one."},"MemoryMapMatches":{"properties":{"query":{"type":"string","title":"Query","description":"The search this answers, trimmed exactly as it was applied."},"ids":{"items":{"type":"string"},"type":"array","title":"Ids","description":"Matching memory UUIDs, at most 5000 of them."},"total":{"type":"integer","title":"Total","description":"Every match the caller may see, even when more than `ids` carries."},"truncated":{"type":"boolean","title":"Truncated","description":"True when `total` is larger than the returned `ids`."}},"type":"object","required":["query","ids","total","truncated"],"title":"MemoryMapMatches","description":"Which drawn memories a search matched, as ids the open map already holds.\n\nThe map is not re-sent and no memory text comes back: the client has both, and this answers the\none question it cannot answer alone, because a point carries a preview while the search reads\nthe whole memory."},"MemoryMapPoint":{"properties":{"id":{"type":"string","title":"Id","description":"The memory's UUID. Stable across every recompute."},"x":{"type":"number","title":"X"},"y":{"type":"number","title":"Y"},"z":{"type":"number","title":"Z"},"group":{"type":"string","title":"Group","description":"Provenance family code, matching BeliefItem.group."},"group_label":{"type":"string","title":"Group Label","description":"Friendly provenance-family label. Never a raw code."},"preview":{"type":"string","title":"Preview","description":"The first 140 characters of the memory."}},"type":"object","required":["id","x","y","z","group","group_label","preview"],"title":"MemoryMapPoint","description":"One memory's place in the picture.\n\n``id`` is the memory's own id, which is what makes a deep link to a point survive every\nrecompute: the projection is rebuilt nightly, but a point is identified by the memory it draws,\nnever by a cluster index or a position.\n\nThe coordinates carry no unit and no meaning of their own. Distance between two points is a\nhint about similarity and never evidence of it, and the axes are not quantities: search,\nneighbours and every count read the real vectors instead."},"MemoryScope":{"type":"string","enum":["tenant","group","conversation","actor"],"title":"MemoryScope"},"MemoryScopeRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"MemoryScopeRefReferenceFullValidator"},"MemoryTotals":{"properties":{"live":{"type":"integer","title":"Live"},"pinned":{"type":"integer","title":"Pinned"},"pruned":{"type":"integer","title":"Pruned"},"expired":{"type":"integer","title":"Expired"}},"type":"object","required":["live","pinned","pruned","expired"],"title":"MemoryTotals"},"MessageActionPolicyBody":{"properties":{"stored_policy_unreadable":{"anyOf":[{"type":"boolean","const":false},{"type":"null"}],"title":"Stored Policy Unreadable"},"dropped_allowlist_entries":{"anyOf":[{"type":"integer","minimum":0.0},{"type":"null"}],"title":"Dropped Allowlist Entries"},"enabled":{"type":"boolean","title":"Enabled","description":"Allow message actions in the workspace."},"reaction_allowlist":{"items":{"type":"string"},"type":"array","title":"Reaction Allowlist","description":"The emoji names Patricia may use for reactions."},"proactive_reactions_enabled":{"type":"boolean","title":"Proactive Reactions Enabled","description":"Allow unprompted message reactions."},"proactive_replies_enabled":{"type":"boolean","title":"Proactive Replies Enabled","description":"Allow unprompted replies in message threads."},"proactive_top_level_posts_enabled":{"type":"boolean","title":"Proactive Top Level Posts Enabled","description":"Allow unprompted top-level channel messages."},"max_reactions_per_channel_per_hour":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Max Reactions Per Channel Per Hour","description":"The hourly reaction limit in each channel."},"max_replies_per_channel_per_hour":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Max Replies Per Channel Per Hour","description":"The hourly reply limit in each channel."},"max_top_level_posts_per_channel_per_hour":{"type":"integer","maximum":1000.0,"minimum":0.0,"title":"Max Top Level Posts Per Channel Per Hour","description":"The hourly limit on top-level messages in each channel."}},"additionalProperties":false,"type":"object","required":["enabled","reaction_allowlist","proactive_reactions_enabled","proactive_replies_enabled","proactive_top_level_posts_enabled","max_reactions_per_channel_per_hour","max_replies_per_channel_per_hour","max_top_level_posts_per_channel_per_hour"],"title":"MessageActionPolicyBody","description":"Request body for setting a workspace's message-action policy (admin only, full replace).\n\n**EVERY POLICY FIELD IS REQUIRED, AND THAT IS THE WHOLE DESIGN OF THIS CLASS.** It carries no\ndefaults for any field it can STORE, which is what makes it impossible for this body and\n:class:`MessageActionPolicy` to declare two different defaults for the same field. (The two\nGET echoes below do default to ``None`` — they are accepted so a GET response round-trips,\nexcluded from every dump, and never stored, so neither is a second declaration of a policy\nvalue that could drift.) There is exactly one set of field defaults for the policy in this\nmodule — the policy's own — and it answers exactly one question: what a workspace that has\nNEVER been configured gets. The read path's :data:`_ABSENT_KEY_FALLBACKS` is not a second set:\nit narrows a STORED block that omits a key, where absence is missing information with nobody\nleft to ask. Absence in a REQUEST is different — the caller is present to be told — so \"what\nif they left it out\" is not a defaults question at all; it is a malformed request.\n\nIt was not always so, and the failure that changed it is worth keeping. Every field used to\ncarry its own default, which meant the same field was declared twice with two independent\nvalues, and they drifted: ``proactive_reactions_enabled`` was ``True`` on the policy (shipped\n2026-08-03) and ``False`` here, so a ``PUT`` that omitted it silently disabled the capability\nthat had just shipped, answered 200, and published ``default: false`` in the OpenAPI contract as\nif that were correct. The console had already diagnosed this from the outside and worked around\nit client-side (``useMessageActionPolicy.ts``'s ``Required<…>`` guard, whose comment called a\npartial body \"silent data loss\" until the hole closed); the hole itself was server-side and\nstayed open.\n\nSyncing the two sets of defaults was the obvious repair and is the wrong one: it only changes\nWHICH silent thing an omission does. With them synced, omitting ``proactive_replies_enabled``\nwould GRANT unprompted replies — text that cannot be taken back — to a workspace that had turned\nthem off. The same argument, about the allowlist, was already written in this file before this\nchange: defaulting it to empty \"would make the same partial body silently disable every reaction\ninstead, trading one surprise for a worse one.\"\n\nSo the second set of defaults is deleted rather than corrected. An omitted field is now a 422\nnaming it, which is what the endpoint description and the owner checklist have always told\ncallers to expect (\"send every field\"), and what the console already enforces at compile time.\nLoud beats either flavour of silent."},"MessageActionPolicyResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"reaction_allowlist":{"items":{"type":"string"},"type":"array","title":"Reaction Allowlist"},"proactive_reactions_enabled":{"type":"boolean","title":"Proactive Reactions Enabled"},"proactive_replies_enabled":{"type":"boolean","title":"Proactive Replies Enabled"},"proactive_top_level_posts_enabled":{"type":"boolean","title":"Proactive Top Level Posts Enabled"},"max_reactions_per_channel_per_hour":{"type":"integer","title":"Max Reactions Per Channel Per Hour"},"max_replies_per_channel_per_hour":{"type":"integer","title":"Max Replies Per Channel Per Hour"},"max_top_level_posts_per_channel_per_hour":{"type":"integer","title":"Max Top Level Posts Per Channel Per Hour"},"stored_policy_unreadable":{"type":"boolean","title":"Stored Policy Unreadable","default":false},"dropped_allowlist_entries":{"type":"integer","title":"Dropped Allowlist Entries","default":0}},"additionalProperties":false,"type":"object","required":["enabled","reaction_allowlist","proactive_reactions_enabled","proactive_replies_enabled","proactive_top_level_posts_enabled","max_reactions_per_channel_per_hour","max_replies_per_channel_per_hour","max_top_level_posts_per_channel_per_hour"],"title":"MessageActionPolicyResponse","description":"The effective message-action policy for a workspace."},"MetaAdAccountBody":{"properties":{"ad_account_id":{"type":"string","maxLength":64,"minLength":1,"title":"Ad Account Id"}},"additionalProperties":false,"type":"object","required":["ad_account_id"],"title":"MetaAdAccountBody","description":"Make one of a Meta connection's discovered ad accounts its default."},"MetaAdAccountSummary":{"properties":{"id":{"type":"string","title":"Id"},"account_id":{"type":"string","title":"Account Id"},"name":{"type":"string","title":"Name"},"account_status":{"type":"integer","title":"Account Status"},"status_label":{"type":"string","title":"Status Label"},"currency":{"type":"string","title":"Currency"},"business_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Business Name"},"user_tasks":{"items":{"type":"string"},"type":"array","title":"User Tasks"},"can_write":{"type":"boolean","title":"Can Write","default":false},"is_active":{"type":"boolean","title":"Is Active","default":false},"enabled":{"type":"boolean","title":"Enabled","default":false}},"type":"object","required":["id","account_id","name","account_status","status_label","currency"],"title":"MetaAdAccountSummary","description":"One Meta ad account this connection can reach, as the picker shows it.\n\nEvery field either makes a row identifiable to a person, or marks it unusable: a closed account,\nor access that cannot write."},"MetaAdAccountsResponse":{"properties":{"ad_accounts":{"items":{"$ref":"#/components/schemas/MetaAdAccountSummary"},"type":"array","title":"Ad Accounts"},"selected_ad_account_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Ad Account Id"},"enabled_ad_account_ids":{"items":{"type":"string"},"type":"array","title":"Enabled Ad Account Ids"}},"type":"object","title":"MetaAdAccountsResponse","description":"Every ad account a Meta connection discovered, which are switched on, and the default."},"MetaEnabledAdAccountsBody":{"properties":{"enabled_ad_account_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"title":"Enabled Ad Account Ids"}},"additionalProperties":false,"type":"object","title":"MetaEnabledAdAccountsBody","description":"Choose which of a Meta connection's discovered ad accounts Patricia may use.\n\nThe whole set travels on every write rather than one id at a time, so the request states the\nintended end state instead of a delta whose meaning depends on what the server already held."},"ModelChoice":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"provider_label":{"type":"string","title":"Provider Label"},"cost_label":{"type":"string","title":"Cost Label"},"thinking_options":{"items":{"$ref":"#/components/schemas/ThinkingOption"},"type":"array","title":"Thinking Options"},"recommended":{"type":"boolean","title":"Recommended"},"warning":{"type":"string","title":"Warning","default":""}},"type":"object","required":["id","label","description","provider_label","cost_label","thinking_options","recommended"],"title":"ModelChoice","description":"One model a workspace can actually be routed to, as offered in the picker."},"ModelSettingsResponse":{"properties":{"tiers":{"items":{"$ref":"#/components/schemas/ModelTierView"},"type":"array","title":"Tiers"},"selected_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Selected Tier"},"using_recommended_routing":{"type":"boolean","title":"Using Recommended Routing"},"using_recommended":{"type":"boolean","title":"Using Recommended"},"models":{"items":{"$ref":"#/components/schemas/ModelChoice"},"type":"array","title":"Models"},"custom_tier":{"type":"string","title":"Custom Tier"},"custom_scope_note":{"type":"string","title":"Custom Scope Note"},"custom":{"anyOf":[{"$ref":"#/components/schemas/CustomSetupView"},{"type":"null"}]},"model_choice_locked":{"type":"boolean","title":"Model Choice Locked","default":false},"model_choice_locked_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model Choice Locked Note"}},"type":"object","required":["tiers","selected_tier","using_recommended_routing","using_recommended","models","custom_tier","custom_scope_note"],"title":"ModelSettingsResponse","description":"The workspace's effective reasoning state, plus what it can choose from."},"ModelSettingsUpdate":{"properties":{"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier","description":"The intelligence level for regular work: deep, balanced, or fast."},"custom":{"anyOf":[{"$ref":"#/components/schemas/CustomModelUpdate"},{"type":"null"}],"description":"Your model and thinking setup for regular workspace work."},"reset_to_recommended":{"type":"boolean","title":"Reset To Recommended","default":false}},"additionalProperties":false,"type":"object","title":"ModelSettingsUpdate","description":"PATCH body: pick a level, build a custom setup, or restore the recommendation."},"ModelTierView":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"},"used_for":{"items":{"type":"string"},"type":"array","title":"Used For"},"model_id":{"type":"string","title":"Model Id"},"model_label":{"type":"string","title":"Model Label"},"reasoning":{"type":"boolean","title":"Reasoning"},"thinking_label":{"type":"string","title":"Thinking Label"},"posture_label":{"type":"string","title":"Posture Label"},"cost_label":{"type":"string","title":"Cost Label"},"between_steps_label":{"type":"string","title":"Between Steps Label"},"effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effort"},"is_chat_default":{"type":"boolean","title":"Is Chat Default"},"overridden":{"type":"boolean","title":"Overridden"},"fallback_model_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Model Id"},"fallback_model_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Model Label"},"fallback_effort":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Effort"},"fallback_posture_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Fallback Posture Label"},"fallback_note":{"type":"string","title":"Fallback Note","default":""}},"type":"object","required":["key","label","description","used_for","model_id","model_label","reasoning","thinking_label","posture_label","cost_label","between_steps_label","effort","is_chat_default","overridden"],"title":"ModelTierView","description":"One reasoning level as the workspace actually runs it."},"MonthlyCapView":{"properties":{"dollars":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Dollars"},"source":{"type":"string","title":"Source"},"min_dollars":{"type":"number","title":"Min Dollars"},"max_dollars":{"type":"number","title":"Max Dollars"}},"type":"object","required":["dollars","source","min_dollars","max_dollars"],"title":"MonthlyCapView","description":"The optional workspace-wide monthly spend ceiling.\n\n``dollars=None`` means no monthly cap; the remaining credit balance is the limit.\n\nDollar amounts are usage cost.\nUsage cost is Patricia's measure of what your work costs to run, not what you paid for your credits."},"NeededApp":{"properties":{"slug":{"type":"string","title":"Slug"},"label":{"type":"string","title":"Label"}},"type":"object","required":["slug","label"],"title":"NeededApp"},"NegotiatedSwitchPreview":{"properties":{"amount_due_cents":{"type":"integer","title":"Amount Due Cents"}},"type":"object","required":["amount_due_cents"],"title":"NegotiatedSwitchPreview","description":"GET /v1/billing/switch-to-negotiated/preview: what Stripe would charge right now."},"OAuthFinalizeBody":{"properties":{"capability":{"type":"string","maxLength":512,"minLength":1,"title":"Capability"},"protocol_version":{"anyOf":[{"type":"integer","const":2},{"type":"null"}],"title":"Protocol Version"}},"additionalProperties":false,"type":"object","required":["capability"],"title":"OAuthFinalizeBody","description":"The capability the dashboard came back with, plus a compatibility marker.\n\n``extra=\"forbid\"`` is what makes the marker work at all: a replica that predates this field\nrejects a request carrying it with a 422 during BODY VALIDATION — before the claim runs, so\nnothing is claimed and no capability is consumed. That is the whole mechanism, and it is why the\nconsole sends the field only when the capability announces a personal ceremony. Sent\nunconditionally it would 422 every TEAM finalize against an old replica, breaking the property\nthe namespace was designed to preserve.\n\nIt is compatibility metadata and NOTHING else. It must never select visibility: the attempt row\nis the only thing that says what scope the human consented to, and a marker in a request body\ncould be changed by whoever sends it."},"OAuthStartBody":{"properties":{"client_id":{"anyOf":[{"type":"string","maxLength":1024},{"type":"null"}],"title":"Client Id"},"client_secret":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Client Secret"},"base_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Base Url"},"account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Account Id"},"visibility":{"anyOf":[{"type":"string","enum":["team","personal"]},{"type":"null"}],"title":"Visibility"}},"additionalProperties":false,"type":"object","required":["base_url"],"title":"OAuthStartBody","description":"The address, and — only on a second attempt — the client credential the server needs.\n\nNo auth-mode chips. The client credential is a LATER step by design, offered only after every\nautomatic path has been tried and refused: asking for it up front would make the common case\n(96.2% of hosts register automatically) look like the hard case. The dashboard does not show the\nfields until a start has come back with ``MCP_CLIENT_CREDENTIALS_REQUIRED`` or\n``MCP_PUBLIC_CLIENT_ID_REQUIRED``, and then it resubmits this same body with them filled in. The\nsecond code is what makes the secret optional on that form, for a service that issues none.\n\n**A secret never arrives without an id.** A lone secret is a 422, not a partial credential; a\nlone id is a public client, and only the discovered server can say whether that is one this\nservice issues.\n\n**An empty secret is read as none supplied; a whitespace-only one is refused.** Those are\ndifferent answers on purpose: an empty field is somebody who has no secret, and spaces are a\nmistyped one. An empty client id is refused either way. The generated types cannot express any of\nthis on their own — they describe two independent optional strings, which is what a second\nconsumer would build against.\n\nThe pair, its bounds and both of those rules are INHERITED from\n:class:`services.mcp_oauth.PastedClientCredentialFields`, which is the only implementation. This\nbody adds the three fields the console has and the chat setup lane must not: the address, the\naccount to re-consent, and the audience."},"OAuthStartResponse":{"properties":{"authorize_url":{"type":"string","title":"Authorize Url"},"attempt_id":{"type":"string","format":"uuid","title":"Attempt Id"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["authorize_url","attempt_id","expires_at"],"title":"OAuthStartResponse","description":"Where to send the browser, and what it will come back as."},"OccurrenceSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"event_type_code":{"type":"string","title":"Event Type Code"},"subject_key":{"type":"string","title":"Subject Key"},"entity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"},"delivery_date":{"type":"string","format":"date","title":"Delivery Date"},"due_at":{"type":"string","format":"date-time","title":"Due At"},"occurrence_tz":{"type":"string","title":"Occurrence Tz"},"state_code":{"type":"string","title":"State Code"},"skip_reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skip Reason Code"},"attempt_count":{"type":"integer","title":"Attempt Count"},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At"},"reconciled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Reconciled At"}},"type":"object","required":["id","installation_id","event_type_code","subject_key","entity_id","delivery_date","due_at","occurrence_tz","state_code","skip_reason_code","attempt_count","sent_at","reconciled_at"],"title":"OccurrenceSummary","description":"One occurrence on the agenda / dry-run / reconcile surfaces (PII-safe: ids, dates, codes only)."},"OffboardCleanupResult":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"accounts":{"type":"integer","title":"Accounts","description":"Connected accounts that were active and got disconnected locally."},"revoked_upstream":{"type":"integer","title":"Revoked Upstream","description":"Of those, how many were confirmed revoked at the provider."},"orphaned_upstream":{"type":"integer","title":"Orphaned Upstream","description":"How many could NOT be confirmed revoked (flagged for the report)."},"adapter_errors":{"type":"integer","title":"Adapter Errors","description":"Of the orphaned ones, how many failed on our side with no provider answer recorded, rather than the provider being unreachable. Anything above zero needs a human: usually a bug to fix, sometimes a debt that cannot be built into an authenticated request, sometimes an absent signing key. Never an outage to wait out.","default":0},"incomplete_accounts":{"type":"integer","title":"Incomplete Accounts","description":"Accounts this pass could not finish: the provider call ran but its bookkeeping would not save, or the turn failed before the call. The counts above describe what happened at the provider; this one says how many accounts the database did not record an outcome for. Above zero means that many accounts have no retry queued, and re-running this route will NOT pick them up — they are already locally disconnected, which is what makes the route idempotent. Read the leak report before revoking anything by hand: one of the cases counted here is a cycle that was superseded, where the member reconnected while the sweep was mid-flight, so the credential is live because it is IN USE rather than leaked. The report tells those apart; this number does not.","default":0}},"type":"object","required":["tenant_id","accounts","revoked_upstream","orphaned_upstream"],"title":"OffboardCleanupResult","description":"Outcome of running the offboard cleanup for one tenant."},"OnboardingAiTool":{"type":"string","enum":["chatgpt","claude","gemini","copilot","grok","perplexity"],"title":"OnboardingAiTool"},"OnboardingAiToolsRequest":{"properties":{"ai_tools":{"items":{"$ref":"#/components/schemas/OnboardingAiTool"},"type":"array","title":"Ai Tools"}},"additionalProperties":false,"type":"object","required":["ai_tools"],"title":"OnboardingAiToolsRequest"},"OnboardingAiToolsResponse":{"properties":{"ai_tools":{"items":{"$ref":"#/components/schemas/OnboardingAiTool"},"type":"array","title":"Ai Tools"}},"type":"object","required":["ai_tools"],"title":"OnboardingAiToolsResponse"},"OnboardingChatPlatformRequest":{"properties":{"platform":{"type":"string","enum":["slack","microsoft_teams"],"title":"Platform"}},"type":"object","required":["platform"],"title":"OnboardingChatPlatformRequest","description":"A password-signup workspace's pick, for ``POST /v1/onboarding-chat-platform``."},"OnboardingChatPlatformResponse":{"properties":{"platform":{"type":"string","enum":["slack","microsoft_teams"],"title":"Platform"}},"type":"object","required":["platform"],"title":"OnboardingChatPlatformResponse"},"OnboardingChatStep":{"type":"string","enum":["chat_platform","slack","microsoft_teams"],"title":"OnboardingChatStep","description":"The one chat step this workspace has to finish: the chooser, or a platform's connect screen.\n\nAlways a real step, whatever else is outstanding, so a caller that only wants the chat step does\nnot have to walk :class:`OnboardingResumeStep` past ``company`` and ``tools`` to find it."},"OnboardingCompleteResponse":{"properties":{"onboarding_completed":{"type":"boolean","title":"Onboarding Completed"}},"type":"object","required":["onboarding_completed"],"title":"OnboardingCompleteResponse","description":"Acknowledgement that the workspace's onboarding is marked complete."},"OnboardingIntegrationsRequest":{"properties":{"integrations":{"items":{"type":"string"},"type":"array","minItems":1,"title":"Integrations"}},"additionalProperties":false,"type":"object","required":["integrations"],"title":"OnboardingIntegrationsRequest"},"OnboardingIntegrationsResponse":{"properties":{"integrations":{"items":{"type":"string"},"type":"array","title":"Integrations"}},"type":"object","required":["integrations"],"title":"OnboardingIntegrationsResponse"},"OnboardingProgressResponse":{"properties":{"slack":{"type":"boolean","title":"Slack","description":"A Slack platform installation exists (Patricia's chat bot is installed)."},"microsoft_teams":{"type":"boolean","title":"Microsoft Teams","description":"A Microsoft Teams platform installation exists (Patricia's chat bot is installed). Named in full so it cannot be misread as the `team` step, which reports whether other people joined the workspace."},"chat_platform":{"$ref":"#/components/schemas/ChatPlatform","description":"Which chat platform this workspace has installed, or `not_yet` when it has installed neither. A claim about what is connected, so the dashboard words its copy from it. Never decide what to OFFER from this field: a workspace reporting `not_yet` is still being asked to connect one specific platform, and `chat_platform_to_connect` names it."},"chat_platform_to_connect":{"type":"string","enum":["slack","microsoft_teams"],"title":"Chat Platform To Connect","description":"Which chat platform this workspace is being asked to connect: the one it has installed, else the one it signed up through. Always a real platform, because every connect CTA, skip key and wizard chat step has to name one even before anything is installed. Reports what to OFFER, never what is connected (`chat_platform` answers that)."},"company":{"type":"boolean","title":"Company","description":"The company profile holds real content: the website was analyzed, or somebody filled in something anywhere in the Brand Kit (details, voice, words, colours, typography, or a logo in any slot and mode). The seeded brand-kit baseline, add-on and theme toggles, and a bare website URL on its own do not count."},"channels":{"type":"boolean","title":"Channels","description":"Patricia is in at least one live Slack or Microsoft Teams channel, private ones included."},"tools":{"type":"boolean","title":"Tools","description":"At least one active non-Slack integration account the user connected (Patricia-managed auto-provisioned accounts don't count)."},"first_task":{"type":"boolean","title":"First Task","description":"The user gave Patricia a task: a human-directed run (mention/dm/message/manual) or a live scheduled task the user created."},"team":{"type":"boolean","title":"Team","description":"More than one active member, or a pending invitation exists."},"calendar":{"type":"boolean","title":"Calendar","description":"A live Google or Outlook calendar exists that someone connected, kept personal or shared with the team. Meeting auto-join reads a calendar for the person who connected it. A Patricia-managed account that nobody connected does not count. Reported as a step but excluded from all_done, because connecting a calendar is optional."},"chat_step":{"$ref":"#/components/schemas/OnboardingChatStep","description":"The chat step this workspace has to finish: `chat_platform` while it still has to pick one, else the connect screen for the platform it is being offered. Always a real step, even once a platform is connected, so a caller can send someone to the chat step without walking `resume_step` past the steps before it. The chat steps cannot be skipped."},"skipped":{"items":{"$ref":"#/components/schemas/OnboardingSkipStep"},"type":"array","title":"Skipped","description":"Onboarding steps the workspace chose to skip: company, tools, calendar, use_case, or team, sorted by name."},"resume_step":{"$ref":"#/components/schemas/OnboardingResumeStep","description":"The first unresolved wizard step, or wait once chat is connected and the background reads it started are the only work left. The steps come in a fixed order: company, tools, calendar, use_case, integrations, AI tools, then chat. A step is resolved by its answer or by a recorded skip, so a `tools` skip still leads to `calendar` unless a calendar is already connected or the `calendar` step was skipped too."},"all_done":{"type":"boolean","title":"All Done","description":"True when every step above except calendar is complete (lets the dashboard hide the card; the optional calendar step must not pin it open)."}},"type":"object","required":["slack","microsoft_teams","chat_platform","chat_platform_to_connect","company","channels","tools","first_task","team","calendar","chat_step","skipped","resume_step","all_done"],"title":"OnboardingProgressResponse","description":"Per-step onboarding completion for the caller's workspace.\n\nEvery field is a truthful, tenant-scoped signal: ``false`` whenever the\nunderlying data is absent (a step is never assumed complete). ``all_done`` is\nthe AND of every step except ``calendar`` (optional by design, see the module\ndocstring), so the dashboard can hide the checklist once the workspace is\nfully set up rather than showing a stale 100%."},"OnboardingReadinessResponse":{"properties":{"still_reading":{"type":"boolean","title":"Still Reading","description":"True while the caller's own person-signals read (calendar or Gmail) has started and not yet finished."}},"type":"object","required":["still_reading"],"title":"OnboardingReadinessResponse","description":"Whether the person research kicked off during setup is still running.\n\nRead by the wizard's finish screen, which says so instead of silently claiming the research is done."},"OnboardingResumeStep":{"type":"string","enum":["company","tools","calendar","use_case","integrations","ai_tools","chat_platform","slack","microsoft_teams","wait","done"],"title":"OnboardingResumeStep"},"OnboardingSkipRequest":{"properties":{"step":{"$ref":"#/components/schemas/OnboardingSkipStep"}},"type":"object","required":["step"],"title":"OnboardingSkipRequest"},"OnboardingSkipResponse":{"properties":{"step":{"$ref":"#/components/schemas/OnboardingSkipStep"}},"type":"object","required":["step"],"title":"OnboardingSkipResponse"},"OnboardingSkipStep":{"type":"string","enum":["company","tools","calendar","use_case","integrations","team"],"title":"OnboardingSkipStep","description":"The wizard steps a workspace may leave unfinished.\n\nThe chat steps are deliberately absent: connecting a chat platform is where Patricia lives, so\nthe chooser and the two connect screens are required and carry no Skip. A workspace that skipped\none before this rule keeps the stored marker, which no longer names a step and is ignored.\nThe calendar, use-case and integrations steps are dismissible; the chat steps remain required.\nThe AI tools step has no skip: \"We use none yet\" answers it by storing an empty list."},"OnboardingUseCaseRequest":{"properties":{"title":{"$ref":"#/components/schemas/OnboardingUseCaseTitle"}},"additionalProperties":false,"type":"object","required":["title"],"title":"OnboardingUseCaseRequest"},"OnboardingUseCaseResponse":{"properties":{"title":{"$ref":"#/components/schemas/OnboardingUseCaseTitle"}},"type":"object","required":["title"],"title":"OnboardingUseCaseResponse"},"OnboardingUseCaseTitle":{"type":"string","enum":["Client reports, without the manual work","Keep every client project on track","Watch our ad accounts","Calls, proposals and the pipeline","Answer my team's questions about our clients"],"title":"OnboardingUseCaseTitle"},"OptOutRequest":{"properties":{"domain_key":{"type":"string","title":"Domain Key"},"entity_id":{"type":"string","format":"uuid","title":"Entity Id"}},"type":"object","required":["domain_key","entity_id"],"title":"OptOutRequest","description":"Opt a subject out of a canonical fact (subject-GLOBAL, shared across every skill referencing it)."},"OrphanedAccount":{"properties":{"id":{"type":"string","title":"Id","description":"IntegrationAccount id."},"tenant_id":{"type":"string","title":"Tenant Id","description":"Owning tenant."},"provider":{"type":"string","title":"Provider","description":"Provider still potentially billing for this account."},"app_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Slug","description":"Connected app/platform slug."},"external_account_id":{"type":"string","title":"External Account Id","description":"The provider-side account id we could not confirm revoked."},"disconnected_at":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Disconnected At","description":"When we deactivated it locally (soft-delete time)."},"failure":{"anyOf":[{"$ref":"#/components/schemas/UpstreamRevokeState"},{"type":"null"}],"description":"Why the credential was never confirmed revoked, as an ``upstream_revoke_states`` code: ``provider_error`` (the provider call failed, so retry it), ``adapter_error`` (the fault is ours and no provider answer was recorded, so a retry cannot help: our adapter needs a code fix, or the debt carries too little to build an authenticated request and needs an operator, or a signing key is absent and needs configuration), or ``attempt_pending``. ``attempt_pending`` does NOT mean nothing was attempted: it is written BEFORE the provider call and rewritten only when an outcome or a settled debt supersedes it, so it also sits on a call running right now, on one whose outcome write was rolled back, and on an uninstall tombstone the drainer has already failed against several times. A row can leave it without any debt ever being queued, because a disconnect records its own outcome directly. Read ``retry_ownership`` to tell those apart. Rows reported here are always one of those three; ``revoked`` and ``unsupported`` are not leaks and never appear."},"retry_ownership":{"$ref":"#/components/schemas/RevokeRetryOwnership","description":"Whether anything still owes this credential a kill, and so whether it is yours to act on. Being on this report never meant retries had stopped; this is what tells you. The states are described on the RevokeRetryOwnership schema. What matters at THIS endpoint is that the value is a SNAPSHOT taken during the read, not a promise: a disconnect commits its marker before calling the provider and queues a debt only if that call fails, so an ordinary in-flight disconnect (and every account still ahead of a tenant offboard's serial provider loop) reads ``unowned`` meanwhile. Re-reading is NOT a barrier — a second read of a still-running disconnect says ``unowned`` too. Wait for any disconnect or offboard you know of to finish, THEN re-run the report, and only then act."}},"type":"object","required":["id","tenant_id","provider","external_account_id","retry_ownership"],"title":"OrphanedAccount","description":"A connected account deactivated locally but not confirmed revoked upstream (a COGS leak)."},"OrphanedUpstreamReport":{"properties":{"accounts":{"items":{"$ref":"#/components/schemas/OrphanedAccount"},"type":"array","title":"Accounts"},"count":{"type":"integer","title":"Count","description":"Number of orphaned accounts in scope."}},"type":"object","required":["count"],"title":"OrphanedUpstreamReport","description":"The orphaned-upstream leak report: credentials we could not confirm dead, so they may still\nbe billing. NOT a to-do list — read ``retry_ownership`` per row before touching anything, because\ncleaning up a row a worker still owns races that retry."},"OutreachChannelRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"OutreachChannelRefReferenceFullValidator"},"OutreachPersonalizationRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"OutreachPersonalizationRefReferenceFullValidator"},"OutreachSettingsResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"type":"object","required":["enabled"],"title":"OutreachSettingsResponse","description":"The workspace marketing-email switch as stored (fail-closed default OFF)."},"OutreachSettingsUpdate":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Allow marketing emails to your team. Change this in the dashboard."}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"OutreachSettingsUpdate","description":"PATCH body: the one knob. ``StrictBool`` on purpose (matching the stored block's model):\na consent switch must never flip on a coerced ``\"yes\"``/``1``."},"OutreachStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"OutreachStatusRefReferenceFullValidator"},"OverBudgetView":{"properties":{"behavior":{"type":"string","enum":["warn","stop"],"title":"Behavior"},"source":{"type":"string","title":"Source"}},"type":"object","required":["behavior","source"],"title":"OverBudgetView","description":"What happens when a single run reaches its per-run limit.\n\n``\"warn\"`` (the platform default): Patricia keeps going past the limit and tells the owner\nwhat it cost, but a safety stop still ends any run that reaches four times its limit, or\nsooner when the workspace is close to its monthly cap or low on credits. ``\"stop\"``\n(opt-in): the task stops at the limit itself."},"OverrideIneligibleReason":{"type":"string","enum":["critical_tier","unreadable_live_tier","mandatory_call","audience_reaching","no_tool_ref","managed_account","tool_disabled","policy_always","tenant_master_disabled","no_caller_actor"],"title":"OverrideIneligibleReason","description":"Why a per-tool \"Run automatically\" override cannot be minted for this tool by this caller.\n\nONE vocabulary for two surfaces that must never disagree: the Tools-tab read renders it as the\nlocked-state tooltip (``AccountToolSummary.override_ineligible_reason``) and the mint route raises\nit as the error envelope's top-level ``code``. A control offered on the read side and then refused\non the write side is the failure this shared enum exists to prevent.\n\nThe first three are *approval-floor* reasons and come from\n:func:`~models.approval_policy.evaluate_tool_approval`, so the read side never re-derives a floor.\nThe rest are account-, tool-, or caller-shaped and are decided by their own owners.\n\n``mandatory_call``, never ``mandatory_provider``: ``core.mandatory_providers.is_mandatory_call``\nis CALL-scoped, and now exclusively so. It reads a Windsor action-namespace ref or a Composio\nGitHub merge; its docstring names the refs. The provider-wide arm the name once also covered was deleted\nwith ``MANDATORY_APPROVAL_PROVIDERS``, so the provider-shaped name would now name a rule that does\nnot exist at all rather than merely reading as a bug on one row."},"OwnSkillRatingSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"verdict":{"type":"string","enum":["up","down"],"title":"Verdict"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment"}},"type":"object","required":["id","verdict"],"title":"OwnSkillRatingSummary","description":"The calling actor's latest answered rating for this skill."},"OwnerIn":{"properties":{"variant":{"type":"string","enum":["dashboard","chat","system","unresolved"],"title":"Variant"},"user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"User Id"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"bridged_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Bridged Actor Id"},"reason":{"anyOf":[{"$ref":"#/components/schemas/UnresolvedReason"},{"type":"null"}]}},"additionalProperties":false,"type":"object","required":["variant"],"title":"OwnerIn","description":"The owner a credential row carries TODAY, as the approver read it off the case.\n\nMirrors the four-variant sum type the credential plane writes through. It is stated rather than\ninferred because the recovery's per-variant rule depends on it, and because the commit checks\nthis claim against the live row — a document describing a row that has since changed must fail\nrather than move it."},"ParticipantIn":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id"},"expected_credential_epoch":{"type":"integer","title":"Expected Credential Epoch"}},"additionalProperties":false,"type":"object","required":["user_id","expected_credential_epoch"],"title":"ParticipantIn","description":"A user this recovery touches, pinned to the credential epoch it was decided against."},"PasswordLinkRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"captcha_token":{"type":"string","maxLength":2048,"title":"Captcha Token","default":""}},"additionalProperties":false,"type":"object","required":["email"],"title":"PasswordLinkRequest","description":"Ask for a set-password or reset-password link. Answers identically either way."},"PasswordResetRequest":{"properties":{"token":{"type":"string","maxLength":512,"minLength":1,"title":"Token","description":"The opaque token from the emailed link."},"password":{"type":"string","maxLength":128,"minLength":8,"format":"password","title":"Password","writeOnly":true}},"additionalProperties":false,"type":"object","required":["token","password"],"title":"PasswordResetRequest","description":"Redeem a set/reset link and write the new password."},"PaymentMethodList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PaymentMethodView"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PaymentMethodList","description":"GET /v1/billing/payment-methods: the tenant's saved cards (default first)."},"PaymentMethodSyncResult":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PaymentMethodView"},"type":"array","title":"Items"},"refreshed":{"type":"boolean","title":"Refreshed","description":"True when the saved cards were re-read from Stripe just now. False means the list is the last state we saved, either because this workspace has no billing account yet or because Stripe could not be reached."},"notice":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Notice","description":"A sentence to show the person when the refresh did not happen; null when it did."}},"type":"object","required":["items","refreshed"],"title":"PaymentMethodSyncResult","description":"POST /v1/billing/payment-methods/sync: the saved cards, plus whether Stripe was actually read.\n\nThe list alone cannot tell a caller which answer it got: a Stripe outage returns the local rows\nunchanged, and those look exactly like a successful sync that found the same cards. ``refreshed``\nis the field that separates them, and ``notice`` is the sentence to show the person when it is\nfalse, so a card that Stripe has and we do not is visible instead of simply absent."},"PaymentMethodView":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"stripe_payment_method_id":{"type":"string","title":"Stripe Payment Method Id"},"brand":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Brand"},"last4":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last4"},"exp_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp Month"},"exp_year":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Exp Year"},"is_default":{"type":"boolean","title":"Is Default"}},"type":"object","required":["id","stripe_payment_method_id","brand","last4","exp_month","exp_year","is_default"],"title":"PaymentMethodView","description":"A saved card in the dashboard's payment-methods list.\n\nNon-sensitive fields only: the full number/CVC never leave Stripe. ``id`` is the local\nrow id (used to set-default / remove); ``stripe_payment_method_id`` is the ``pm_…`` handle."},"PendingConnectionSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"type":"string","title":"Provider"},"app_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Slug"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"state":{"type":"string","title":"State"},"message":{"type":"string","title":"Message"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"type":"object","required":["id","provider","state","message","created_at"],"title":"PendingConnectionSummary","description":"An in-flight console connect the requester started, so the tab shows honest state, never nothing.\n\n``state`` is ``connecting`` while the connect is live inside its window, or ``failed`` once it either\nreached a terminal failure or the window passed with no account. A ``failed`` chip is dismissible via\n``DELETE /integrations/pending/{id}``. Owner-scoped: only the actor who started the connect sees it."},"PeopleRowSummary":{"properties":{"subject_key":{"type":"string","title":"Subject Key"},"entity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"},"display_label":{"type":"string","title":"Display Label"},"status_code":{"type":"string","title":"Status Code"},"facts":{"items":{"$ref":"#/components/schemas/FactCellSummary"},"type":"array","title":"Facts"},"next_delivery_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Next Delivery Date"}},"type":"object","required":["subject_key","entity_id","display_label","status_code","facts","next_delivery_date"],"title":"PeopleRowSummary","description":"One subject row on the ``people_table`` surface: a handle + per-fact cells + a rollup status.\n\nPII-safe: ``display_label`` is a chat handle (a label, not a personal fact); each fact cell carries\nonly the recurring month/day label + resolution status; ``next_delivery_date`` is a derived date."},"PeopleTableResponse":{"properties":{"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"fact_columns":{"items":{"$ref":"#/components/schemas/FactCellSummary"},"type":"array","title":"Fact Columns"},"rows":{"items":{"$ref":"#/components/schemas/PeopleRowSummary"},"type":"array","title":"Rows"}},"type":"object","required":["installation_id","fact_columns","rows"],"title":"PeopleTableResponse","description":"The resolved people-table read-model (fact columns + subject rows) for one installation.\n\n``fact_columns`` are the header cells (``domain_key`` + ``label``) in a deterministic order; each\nrow's ``facts`` list is aligned to the same order so the dashboard renders a stable column layout\nfor any skill's bound facts."},"PermissionRequestRow":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"risk_tier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Tier Code"},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"can_approve":{"type":"boolean","title":"Can Approve","default":false},"can_deny":{"type":"boolean","title":"Can Deny","default":false},"dispatch_blocked":{"type":"boolean","title":"Dispatch Blocked","description":"True when the bound account is personal and the run's actor is not its connector, so an approval would be refused. Deliberately separate from can_approve, which keeps its own meaning: whether this caller holds approval authority under the audience policy.","default":false},"dispatch_block_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Dispatch Block Reason","description":"Machine-readable code naming why dispatch is blocked, or null when it is not."},"input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input","description":"Tool arguments, sanitized. Present only for callers holding runs:execute (the authority that can decide this request); null for read-only callers, which receive input_summary instead. Null with no input_summary means the request carries no stored arguments."},"input_summary":{"anyOf":[{"items":{"$ref":"#/components/schemas/ArgSummaryEntry"},"type":"array"},{"type":"null"}],"title":"Input Summary","description":"Value-free per-argument summary, populated in place of input for callers without runs:execute."},"repeat_coverage_announced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Repeat Coverage Announced"},"task_offer_manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Task Offer Manifest"},"task_offer_manifest_digest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Offer Manifest Digest"},"delivery_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Ref"},"approver_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Approver Actor Id"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"PermissionRequestRow","description":"Row shape for the approval queue.\n\nAll fields optional so ``fields=`` projection validates (runflow pattern).\n\n``input`` is shaped per caller by the router (``routers/permission_requests.py``),\nnever returned raw: sanitized values for callers holding the approval scope\n(``runs:execute``), null with ``input_summary`` populated for plain ``runs:read``\ncallers. The SQL below still selects the stored column; the shaping is response-time."},"PermissionStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"PermissionStatusRefReferenceFullValidator"},"PersonFactSummary":{"properties":{"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"definition_id":{"type":"string","format":"uuid","title":"Definition Id"},"status_code":{"type":"string","title":"Status Code"},"recurring_month":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurring Month"},"recurring_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Recurring Day"},"date_value":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date Value"},"effective_tz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Tz"},"fact_revision":{"type":"integer","title":"Fact Revision"}},"type":"object","required":["entity_id","definition_id","status_code","recurring_month","recurring_day","date_value","effective_tz","fact_revision"],"title":"PersonFactSummary","description":"A resolved person fact (PII-safe: month/day or date, status, tz; never a birth year)."},"PersonalToolChoiceBatchRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PersonalToolChoiceRequest"},"type":"array","maxItems":5000,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"PersonalToolChoiceBatchRequest"},"PersonalToolChoiceBatchResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PersonalToolChoiceResponse"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PersonalToolChoiceBatchResponse"},"PersonalToolChoiceClearRequest":{"properties":{"tool_ref":{"type":"string","maxLength":512,"minLength":1,"title":"Tool Ref"}},"type":"object","required":["tool_ref"],"title":"PersonalToolChoiceClearRequest"},"PersonalToolChoiceRequest":{"properties":{"tool_ref":{"type":"string","maxLength":512,"minLength":1,"title":"Tool Ref"},"choice":{"type":"string","enum":["ask","block"],"title":"Choice"}},"type":"object","required":["tool_ref","choice"],"title":"PersonalToolChoiceRequest"},"PersonalToolChoiceResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"integration_account_id":{"type":"string","format":"uuid","title":"Integration Account Id"},"tool_ref":{"type":"string","title":"Tool Ref"},"choice":{"type":"string","enum":["ask","block"],"title":"Choice"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","integration_account_id","tool_ref","choice","created_at"],"title":"PersonalToolChoiceResponse"},"Platform":{"type":"string","enum":["slack","teams","console"],"title":"Platform"},"PlatformAuditActions":{"properties":{"items":{"items":{"type":"string"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"PlatformAuditActions","description":"Distinct action names, so the console filters with a picker rather than a typed string."},"PlatformAuditEntry":{"properties":{"id":{"type":"string","title":"Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"action":{"type":"string","title":"Action"},"principal_type":{"type":"string","title":"Principal Type","description":"Which id space the principal lives in: \"user\" | \"service_key\"."},"principal_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Principal Id"},"tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tenant Id","description":"The team the action targeted, when it had one."},"resource_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Type"},"resource_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Resource Id"},"result":{"type":"string","title":"Result"},"changes":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Changes"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"request_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Id"}},"type":"object","required":["id","created_at","action","principal_type","principal_id","result"],"title":"PlatformAuditEntry","description":"One recorded platform-scope action.\n\n``changes`` and ``metadata_`` are rendered but never queryable (the model declares them opaque\nand no route parameter reaches them). ``ip_address`` / ``user_agent`` are absent by design; see\nthe module docstring."},"PlatformAuditPageResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlatformAuditEntry"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"read_audit_id":{"type":"string","title":"Read Audit Id","description":"The platform_read_audit_logs row recording THIS read. Looking at the trail is audited too."}},"type":"object","required":["items","total","limit","offset","read_audit_id"],"title":"PlatformAuditPageResponse","description":"One page of the trail, plus the id of the read-audit row this request itself produced."},"PlatformGoal":{"properties":{"counted_result":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Counted Result","description":"On Google Ads, the conversion action exactly as Google Ads spells it. On Meta, purchases, leads or registrations. On LinkedIn, leads or website conversions. Null reads it from the account and marks it as a guess."},"goal_metric":{"anyOf":[{"type":"string","enum":["cpa","roas"]},{"type":"null"}],"title":"Goal Metric","description":"\"cpa\" or \"roas\". Null reads the goal from the bid strategy and marks it as a guess."},"target":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Target","description":"The goal, in real-result units: an amount in the account currency for CPA, a ratio for ROAS."},"floor":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Floor","description":"The break-even line, in the same unit as target. Past it, the watch flags the campaign."},"measurement_changed_on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Measurement Changed On","description":"The day (YYYY-MM-DD) the counted result or its setup changed on this platform. No comparison crosses it."}},"additionalProperties":false,"type":"object","title":"PlatformGoal","description":"What counts as a result on one platform, the goal for it, and the day that setup last changed."},"PlatformRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"PlatformRefReferenceFullValidator"},"PortalResponse":{"properties":{"portal_url":{"type":"string","title":"Portal Url"}},"type":"object","required":["portal_url"],"title":"PortalResponse","description":"The Stripe Billing Portal URL a tenant manages its subscription from."},"PreferenceSource":{"type":"string","enum":["explicit","inferred"],"title":"PreferenceSource","description":"How an employee preference was captured.\n\n``EXPLICIT`` preferences are authoritative and Curator-exempt; ``INFERRED``\nones mirror what the reflection loop learned and may decay."},"PreferenceSourceRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"PreferenceSourceRefReferenceFullValidator"},"PreviewRowSummary":{"properties":{"subject_key":{"type":"string","title":"Subject Key"},"entity_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Entity Id"},"event_type_code":{"type":"string","title":"Event Type Code"},"would_fire":{"type":"boolean","title":"Would Fire"},"would_post":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Would Post"},"delivery_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Delivery Date"},"channel_id":{"type":"string","title":"Channel Id"},"reason_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason Code"},"basis":{"additionalProperties":true,"type":"object","title":"Basis"}},"type":"object","required":["subject_key","entity_id","event_type_code","would_fire","would_post","delivery_date","channel_id","reason_code","basis"],"title":"PreviewRowSummary","description":"One subject's explainable dry-run line: \"WOULD post '<msg>' on <date>\", plus WHY (PII-safe).\n\n``would_post`` interpolates only the display handle (never a birth date); the birthday's month/day\nis reflected solely as the derived ``delivery_date``. ``reason_code`` FKs the platform reason\ncatalog when it WON'T fire; ``basis`` is the boolean breakdown behind the verdict."},"ProactiveCandidateStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ProactiveCandidateStatusRefReferenceFullValidator"},"ProactiveCooldownView":{"properties":{"value":{"type":"integer","title":"Value"},"default":{"type":"integer","title":"Default"},"source":{"type":"string","title":"Source"},"choices":{"items":{"type":"integer"},"type":"array","title":"Choices"}},"type":"object","required":["value","default","source","choices"],"title":"ProactiveCooldownView","description":"The quiet period (minutes) between two unprompted replies in the same channel."},"ProactiveLimitsResponse":{"properties":{"reply_cap":{"$ref":"#/components/schemas/ProactiveReplyCapView"},"cooldown":{"$ref":"#/components/schemas/ProactiveCooldownView"},"using_recommended":{"type":"boolean","title":"Using Recommended"},"programs_enabled":{"type":"boolean","title":"Programs Enabled"}},"type":"object","required":["reply_cap","cooldown","using_recommended","programs_enabled"],"title":"ProactiveLimitsResponse","description":"Effective proactive-reply limits for the caller's workspace (platform default + override)."},"ProactiveLimitsUpdate":{"properties":{"max_replies_per_channel_per_day":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Replies Per Channel Per Day","description":"The daily limit on unprompted replies in each channel."},"channel_cooldown_minutes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Channel Cooldown Minutes","description":"The quiet period in minutes between unprompted replies in a channel."},"reset_to_recommended":{"type":"boolean","title":"Reset To Recommended","default":false},"programs_enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Programs Enabled","description":"Turn Patricia's proactive check-ins on or off for the whole workspace."}},"additionalProperties":false,"type":"object","title":"ProactiveLimitsUpdate","description":"PATCH body: every field optional; only what's provided is written.\n\n``max_replies_per_channel_per_day`` must be within the allowed range and\n``channel_cooldown_minutes`` one of the allowed minute choices (both strict types, so a JSON\n``true``/``false`` can't coerce to a number). ``programs_enabled`` is the workspace switch for the\nproactive programs. ``reset_to_recommended`` clears both limit overrides, leaves the switch as it\nis, and cannot be combined with an explicit value."},"ProactiveModeSource":{"type":"string","enum":["channel","workspace","default"],"title":"ProactiveModeSource","description":"Which layer supplied the effective mode."},"ProactiveProgramMode":{"type":"string","enum":["observe","dm_only","full","disabled"],"title":"ProactiveProgramMode","description":"How much a proactive program may do (the staged rollout — §5.1, §7).\n\n``observe`` → the program runs (reads + reasons) but the delivery gate blocks EVERY outbound\n(it only records what it WOULD do); ``dm_only`` → DMs + reactions; ``full`` → also channel\nposts; ``disabled`` → the program does not run at all. Both programs seed ``dm_only``; a mode\nchange is staff-only."},"ProactiveReplyCapView":{"properties":{"value":{"type":"integer","title":"Value"},"default":{"type":"integer","title":"Default"},"source":{"type":"string","title":"Source"},"minimum":{"type":"integer","title":"Minimum"},"maximum":{"type":"integer","title":"Maximum"}},"type":"object","required":["value","default","source","minimum","maximum"],"title":"ProactiveReplyCapView","description":"The per-channel daily cap on unprompted replies (effective value + is-it-an-override)."},"ProactiveReplyMode":{"type":"string","enum":["off","mentions_only","proactive"],"title":"ProactiveReplyMode","description":"How freely Patricia replies in a conversation she was not directly addressed in."},"ProactiveSendSort":{"type":"string","enum":["created_at:desc","created_at:asc"]},"ProviderCount":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id","description":"The tenant whose accounts are counted."},"provider":{"type":"string","title":"Provider","description":"Integration provider (e.g. composio, slack)."},"active_count":{"type":"integer","title":"Active Count","description":"ACTIVE, non-deleted connected accounts for this provider."}},"type":"object","required":["tenant_id","provider","active_count"],"title":"ProviderCount","description":"One (tenant, provider) connected-account tally."},"ProxyCatalogDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"type":"string","title":"Provider"},"app_slug":{"type":"string","title":"App Slug"},"endpoint_scope":{"type":"string","title":"Endpoint Scope"},"generation":{"type":"integer","title":"Generation"},"source":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source"},"complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Complete"},"source_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Scope"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"checked_generation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checked Generation"},"checked_rules_revision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checked Rules Revision"},"drift":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Drift"},"comparison_state":{"type":"string","enum":["unpublished","unchecked","stale","drift","compatible"],"title":"Comparison State"},"running_rules_revision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Running Rules Revision"},"coverage_state":{"type":"string","enum":["open_surface","finite_set","unregistered"],"title":"Coverage State"},"catalog_entries_checked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Entries Checked"},"catalog_entries_matched_current_rules":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Entries Matched Current Rules","description":"Catalog entries matched current rules."},"drift_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Drift Count"},"body_reading_incomplete":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Body Reading Incomplete"},"diagnostic_sample":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Diagnostic Sample"},"diagnostic_sample_truncated":{"type":"boolean","title":"Diagnostic Sample Truncated"},"catalog":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Catalog"},"revision_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Revision Id"},"revisions":{"items":{"$ref":"#/components/schemas/ProxyCatalogRevisionIdentifier"},"type":"array","title":"Revisions"}},"type":"object","required":["id","provider","app_slug","endpoint_scope","generation","source","complete","source_scope","last_checked_at","checked_generation","checked_rules_revision","drift","comparison_state","running_rules_revision","coverage_state","catalog_entries_checked","catalog_entries_matched_current_rules","drift_count","body_reading_incomplete","diagnostic_sample","diagnostic_sample_truncated","catalog","revision_id","revisions"],"title":"ProxyCatalogDetail"},"ProxyCatalogDiagnosticReport":{"properties":{"catalogs":{"type":"integer","title":"Catalogs"},"checked":{"type":"integer","title":"Checked","description":"Catalogs with diagnostics for the current generation and running rules."},"drift":{"type":"integer","title":"Drift"},"stale":{"type":"integer","title":"Stale"},"never_checked":{"type":"integer","title":"Never Checked"},"unpublished":{"type":"integer","title":"Unpublished"},"source_complete":{"type":"integer","title":"Source Complete"},"source_partial":{"type":"integer","title":"Source Partial"},"source_unknown":{"type":"integer","title":"Source Unknown"},"catalog_entries_checked":{"type":"integer","title":"Catalog Entries Checked"},"catalog_entries_matched_current_rules":{"type":"integer","title":"Catalog Entries Matched Current Rules","description":"Catalog entries matched current rules."},"drift_count":{"type":"integer","title":"Drift Count"},"sample":{"items":{"$ref":"#/components/schemas/ProxyCatalogStatus"},"type":"array","title":"Sample"},"sample_truncated":{"type":"boolean","title":"Sample Truncated"}},"type":"object","required":["catalogs","checked","drift","stale","never_checked","unpublished","source_complete","source_partial","source_unknown","catalog_entries_checked","catalog_entries_matched_current_rules","drift_count","sample","sample_truncated"],"title":"ProxyCatalogDiagnosticReport"},"ProxyCatalogPublicationResult":{"properties":{"catalog_id":{"type":"string","format":"uuid","title":"Catalog Id"},"revision_id":{"type":"string","format":"uuid","title":"Revision Id"},"generation":{"type":"integer","title":"Generation"}},"type":"object","required":["catalog_id","revision_id","generation"],"title":"ProxyCatalogPublicationResult"},"ProxyCatalogRestorationRequest":{"properties":{"expected_generation":{"type":"integer","maximum":9.223372036854776e+18,"minimum":0.0,"title":"Expected Generation"},"retained_generation":{"type":"integer","maximum":9.223372036854776e+18,"minimum":1.0,"title":"Retained Generation"}},"additionalProperties":false,"type":"object","required":["expected_generation","retained_generation"],"title":"ProxyCatalogRestorationRequest"},"ProxyCatalogRevisionIdentifier":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"generation":{"type":"integer","title":"Generation"},"published_at":{"type":"string","format":"date-time","title":"Published At"},"published_by_user_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Published By User Id"}},"type":"object","required":["id","generation","published_at","published_by_user_id"],"title":"ProxyCatalogRevisionIdentifier"},"ProxyCatalogStatus":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"provider":{"type":"string","title":"Provider"},"app_slug":{"type":"string","title":"App Slug"},"endpoint_scope":{"type":"string","title":"Endpoint Scope"},"generation":{"type":"integer","title":"Generation"},"source":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Source"},"complete":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Complete"},"source_scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Scope"},"last_checked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Checked At"},"checked_generation":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Checked Generation"},"checked_rules_revision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Checked Rules Revision"},"drift":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Drift"},"comparison_state":{"type":"string","enum":["unpublished","unchecked","stale","drift","compatible"],"title":"Comparison State"},"running_rules_revision":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Running Rules Revision"},"coverage_state":{"type":"string","enum":["open_surface","finite_set","unregistered"],"title":"Coverage State"},"catalog_entries_checked":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Entries Checked"},"catalog_entries_matched_current_rules":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Catalog Entries Matched Current Rules","description":"Catalog entries matched current rules."},"drift_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Drift Count"},"body_reading_incomplete":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Body Reading Incomplete"},"diagnostic_sample":{"items":{"additionalProperties":true,"type":"object"},"type":"array","title":"Diagnostic Sample"},"diagnostic_sample_truncated":{"type":"boolean","title":"Diagnostic Sample Truncated"}},"type":"object","required":["id","provider","app_slug","endpoint_scope","generation","source","complete","source_scope","last_checked_at","checked_generation","checked_rules_revision","drift","comparison_state","running_rules_revision","coverage_state","catalog_entries_checked","catalog_entries_matched_current_rules","drift_count","body_reading_incomplete","diagnostic_sample","diagnostic_sample_truncated"],"title":"ProxyCatalogStatus"},"PublicLinearStatus":{"type":"string","enum":["backlog","todo","doing","done","closed"],"title":"PublicLinearStatus","description":"Tenant-facing Linear workflow buckets."},"PublicRequestStatus":{"type":"string","enum":["received","in_review","planned","closed"],"title":"PublicRequestStatus","description":"The deliberately small lifecycle vocabulary tenants may see."},"PutDraftFileRequest":{"properties":{"path":{"type":"string","maxLength":512,"minLength":1,"title":"Path","description":"The bundle-relative path, e.g. 'references/api.md'."},"kind":{"type":"string","title":"Kind","description":"skill_md · reference · script · asset."},"content":{"type":"string","maxLength":400000,"title":"Content","description":"The file's text."}},"type":"object","required":["path","kind","content"],"title":"PutDraftFileRequest","description":"Write one file into a draft, addressed by its bundle-relative path."},"QualityBucket":{"properties":{"period_start":{"type":"string","format":"date-time","title":"Period Start","description":"Start of the bucket on the UTC clock, with no offset attached (week buckets start on Monday). It names a calendar period, not an instant, so a client renders it as-is; attaching Z and converting would move a period label to the previous day west of Greenwich."},"scorer_version":{"type":"string","title":"Scorer Version","description":"The rubric version these scores were produced under. Scores from different versions are not comparable, so a bucket is split per version rather than blended."},"scored":{"type":"integer","title":"Scored"},"dimension_averages":{"additionalProperties":{"type":"number"},"type":"object","title":"Dimension Averages"},"band_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Band Counts"}},"type":"object","required":["period_start","scorer_version","scored","dimension_averages","band_counts"],"title":"QualityBucket","description":"One period of the quality series, for one scorer version."},"Reaction":{"type":"string","enum":["up","down"]},"ReactionFilter":{"type":"string","enum":["up","down","none"]},"ReasonSummary":{"properties":{"reason_code":{"type":"string","title":"Reason Code"},"label":{"type":"string","title":"Label"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"is_terminal":{"type":"boolean","title":"Is Terminal"},"applies_to":{"items":{},"type":"array","title":"Applies To"}},"type":"object","required":["reason_code","label","description","is_terminal","applies_to"],"title":"ReasonSummary","description":"A platform reason-catalog entry: the shared worker/UI \"why will / won't fire\" vocabulary."},"RecapChannelOption":{"properties":{"platform":{"type":"string","enum":["slack","teams"],"title":"Platform"},"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"},"is_member":{"type":"boolean","title":"Is Member"}},"type":"object","required":["platform","id","name","is_member"],"title":"RecapChannelOption","description":"One named PUBLIC chat channel that can receive meeting recaps.\n\nThe list carries public channels only, so it has no ``is_private`` field. Carrying one would\nmean a column that can only ever read ``false``, which a later consumer would reasonably take\nto mean the workspace has no private channels. Filtering happens server side rather than at a\nhigher permission scope so the name never reaches the wire at all, which holds even if the\nscope on the route changes later. ``routers/channel_feeds.py`` withholds private channels the\nsame way."},"RecapEmailAudienceChoiceView":{"properties":{"value":{"type":"string","enum":["everyone_on_invite","workspace_participants","company_domain","only_me","do_not_send"],"title":"Value"},"recap_email_excludes_externals":{"type":"boolean","title":"Recap Email Excludes Externals","description":"What the clamp becomes if this value is saved, holding the workspace's current recording policy. The other direction of the same coupling as the visibility choices, answered by the same function so a surface cannot warn about one direction and stay silent on the other."},"selectable":{"type":"boolean","title":"Selectable","description":"Whether the write path would accept this value for this workspace. Derived by running the write path's own validator, so this list can never offer a value the API would reject."},"unavailable_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Unavailable Reason","description":"Why not, when selectable is false: 'no_company_domain'. Null otherwise."}},"type":"object","required":["value","recap_email_excludes_externals","selectable"],"title":"RecapEmailAudienceChoiceView","description":"One recap-email audience option, with the outcome of CHOOSING it and whether it can be chosen."},"RecentDoc":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"path":{"type":"string","title":"Path"},"title":{"type":"string","title":"Title"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","path","title","updated_at"],"title":"RecentDoc","description":"One of the 10 most recently updated ACTIVE brain docs: ordered by ``updated_at`` DESC, then ``path``.\n\nNOT a usage ranking, and there is no usage signal to build one from — see\n:func:`compute_brain_stats`. ``updated_at`` is on the wire because it IS the ranking: a ranked\nlist whose ordering key is invisible invites the reader to guess one, which is how the old\n``hit_count`` column read as a usage measure while holding a constant."},"ReconcileRequest":{"properties":{"posted":{"type":"boolean","title":"Posted"}},"type":"object","required":["posted"],"title":"ReconcileRequest","description":"Resolve a ``delivery_unknown`` occurrence: was the ambiguous post actually made?"},"RecordingVisibilityChoiceView":{"properties":{"value":{"type":"string","enum":["teammates_and_link","participants_and_teammates","participants","teammates","only_me"],"title":"Value"},"behaves_like":{"type":"string","enum":["teammates_and_link","participants_and_teammates","participants","teammates","only_me"],"title":"Behaves Like","description":"The value whose enforced behavior is identical to this one's, which is this value itself when it is the one worth offering. Five stored values enforce three behaviors: 'teammates_and_link' promises a public link that does not exist and 'participants' reads as participant-scoped while enforcing owner-only. A picker offering a distinction the system does not implement is the defect; this field is how a client avoids offering one without keeping its own list of which values are redundant."},"workspace_can_open":{"type":"boolean","title":"Workspace Can Open","description":"Whether a teammate who was not in the meeting can open the recording under this value. The access half of the answer, separate from the email half because the two come apart: a workspace-wide policy can still mail nobody outside the workspace."},"recap_email_excludes_externals":{"type":"boolean","title":"Recap Email Excludes Externals","description":"What the team-level clamp becomes if this value is saved, holding the workspace's current recap-email audience."},"recap_email_reaches_externals":{"type":"boolean","title":"Recap Email Reaches Externals","description":"Whether anybody outside the workspace would actually be mailed the recap under this value. NOT the negation of the field above: both are false whenever the audience never named an outsider to begin with. A client that reads 'not excluded' as 'included' tells a workspace sending no recap email at all that its guests receive one."},"recap_email_clamped_to_owner":{"type":"boolean","title":"Recap Email Clamped To Owner","description":"True when choosing this value collapses the whole recap-email audience to the recording owner, so teammates lose the email too. A wider loss than the field above and a different sentence: calling it 'people outside your workspace miss out' would understate it."}},"type":"object","required":["value","behaves_like","workspace_can_open","recap_email_excludes_externals","recap_email_reaches_externals","recap_email_clamped_to_owner"],"title":"RecordingVisibilityChoiceView","description":"One recording-visibility option, with the outcome of CHOOSING it already worked out.\n\nThe settings pickers save immediately, with no confirm step, so an answer about the pair that is\nalready stored can only describe harm that has happened. These carry the answer for a value that\nhas NOT been saved, resolved against the other setting as it stands, which is what lets the\ndashboard state a consequence next to the option instead of after the write. Server-derived from\nthe same functions the sender runs, so the dashboard performs a lookup and holds no rule of its own."},"RefreshRequest":{"properties":{"refresh_token":{"type":"string","maxLength":512,"minLength":1,"format":"password","title":"Refresh Token","writeOnly":true}},"additionalProperties":false,"type":"object","required":["refresh_token"],"title":"RefreshRequest","description":"Refresh-token rotation payload."},"RegisterBody":{"properties":{"base_url":{"type":"string","maxLength":2048,"minLength":1,"title":"Base Url"},"token":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Token"},"header_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Header Name"},"label":{"anyOf":[{"type":"string","maxLength":120},{"type":"null"}],"title":"Label"},"visibility":{"type":"string","enum":["team","personal"],"title":"Visibility","default":"team"}},"additionalProperties":false,"type":"object","required":["base_url"],"title":"RegisterBody","description":"The connect form: an address, an optional credential, an optional nickname, and who it is for.\n\n``visibility`` defaults to TEAM, which is what makes the field safe to add mid-roll: the console\nomits it unless the member deliberately picked a personal connection, and ``extra=\"forbid\"`` means\nan explicit ``\"team\"`` sent to a replica that predates this field would 422 an ordinary connect."},"RegisterRequest":{"properties":{"email":{"type":"string","format":"email","title":"Email"},"captcha_token":{"type":"string","maxLength":2048,"title":"Captcha Token","default":""}},"additionalProperties":false,"type":"object","required":["email"],"title":"RegisterRequest","description":"Sign-up STEP ONE: ask for a verification link. Creates nothing.\n\nThere is deliberately no password field. A password supplied here would have to be stored\nagainst an address nobody has proved they can read, which is exactly the pre-claim this\ntwo-step flow exists to close: the row is later adopted by the real owner's SSO login or\ninvitation with that hash intact, and whoever pre-claimed the address can then sign in as\nthem. The password is chosen in :class:`EmailVerificationRequest`, after the emailed link\ncomes back."},"RemediationStatus":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"False when API_BRAIN_SALIENCE_REMEDIATION_ENABLED is off, in which case triggering returns 409. Exposed so the console can say so up front instead of offering a control that only fails when pressed."}},"type":"object","required":["enabled"],"title":"RemediationStatus","description":"Whether the one-time salience repair is armed in THIS environment."},"RemediationTriggerResult":{"properties":{"enqueued":{"type":"boolean","title":"Enqueued"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id"}},"type":"object","required":["enqueued"],"title":"RemediationTriggerResult","description":"Ack that the one-time salience-remediation fan-out was enqueued."},"ReplyQualityCauses":{"properties":{"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"scorer_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scorer Version","description":"Null when the window was read across every rubric version."},"scored_in_window":{"type":"integer","title":"Scored In Window"},"below_passing":{"type":"integer","title":"Below Passing"},"passing_from":{"type":"number","title":"Passing From"},"causes":{"items":{"$ref":"#/components/schemas/LowScoreCause"},"type":"array","title":"Causes"},"truncated":{"type":"boolean","title":"Truncated","description":"True when the taxonomy-row limit can hide more cause groups."}},"type":"object","required":["since","until","scored_in_window","below_passing","passing_from","causes","truncated"],"title":"ReplyQualityCauses","description":"The deterministic cause ranking and its scorecard denominator.\n\nThe repository reads the denominator and ranking in one statement. Both values therefore\ncome from one database snapshot.\n\nThe denominator counts scorecards only. A run that produced no reply has no scorecard and\nis excluded by construction, never by a filter."},"ReplyQualityCount":{"properties":{"total":{"type":"integer","title":"Total"}},"type":"object","required":["total"],"title":"ReplyQualityCount","description":"How many replies match the current filters."},"ReplyQualityOptions":{"properties":{"dimensions":{"items":{"type":"string"},"type":"array","title":"Dimensions"},"review_statuses":{"items":{"type":"string"},"type":"array","title":"Review Statuses"},"review_verdicts":{"items":{"type":"string"},"type":"array","title":"Review Verdicts"},"failure_codes":{"items":{"type":"string"},"type":"array","title":"Failure Codes"},"reply_types":{"items":{"type":"string"},"type":"array","title":"Reply Types"},"outcomes":{"items":{"type":"string"},"type":"array","title":"Outcomes"},"current_scorer_version":{"type":"string","title":"Current Scorer Version"},"max_note_chars":{"type":"integer","title":"Max Note Chars"},"max_bulk_size":{"type":"integer","title":"Max Bulk Size"},"failing_below":{"type":"number","title":"Failing Below"},"passing_from":{"type":"number","title":"Passing From"},"min_sample":{"type":"integer","title":"Min Sample"}},"type":"object","required":["dimensions","review_statuses","review_verdicts","failure_codes","reply_types","outcomes","current_scorer_version","max_note_chars","max_bulk_size","failing_below","passing_from","min_sample"],"title":"ReplyQualityOptions","description":"Every closed vocabulary the console renders as a picker."},"ReplyQualityRow":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"correctness":{"type":"integer","title":"Correctness"},"correctness_note":{"type":"string","title":"Correctness Note"},"groundedness":{"type":"integer","title":"Groundedness"},"groundedness_note":{"type":"string","title":"Groundedness Note"},"instruction_following":{"type":"integer","title":"Instruction Following"},"instruction_following_note":{"type":"string","title":"Instruction Following Note"},"tone_voice":{"type":"integer","title":"Tone Voice"},"tone_voice_note":{"type":"string","title":"Tone Voice Note"},"actionability":{"type":"integer","title":"Actionability"},"actionability_note":{"type":"string","title":"Actionability Note"},"overall":{"type":"number","title":"Overall"},"reply_type_code":{"type":"string","title":"Reply Type Code"},"outcome_code":{"type":"string","title":"Outcome Code"},"topic_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Topic Code"},"tool_used":{"type":"boolean","title":"Tool Used"},"tool_rounds":{"type":"integer","title":"Tool Rounds"},"tool_families":{"items":{"type":"string"},"type":"array","title":"Tool Families"},"output_type_code":{"type":"string","title":"Output Type Code"},"complexity_code":{"type":"string","title":"Complexity Code"},"judge_model":{"type":"string","title":"Judge Model"},"effort_tier":{"type":"string","title":"Effort Tier"},"judge_cost_micro_usd":{"type":"integer","title":"Judge Cost Micro Usd"},"scorer_version":{"type":"string","title":"Scorer Version"},"rubric_version":{"type":"string","title":"Rubric Version"},"parse_status":{"type":"string","title":"Parse Status"},"sample_reason":{"type":"string","title":"Sample Reason"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"review":{"anyOf":[{"$ref":"#/components/schemas/models__reply_review__ReplyScoreReview__FullValidator"},{"type":"null"}]}},"type":"object","required":["id","tenant_id","correctness","correctness_note","groundedness","groundedness_note","instruction_following","instruction_following_note","tone_voice","tone_voice_note","actionability","actionability_note","overall","reply_type_code","outcome_code","tool_used","tool_rounds","tool_families","output_type_code","complexity_code","judge_model","effort_tier","judge_cost_micro_usd","scorer_version","rubric_version","parse_status","sample_reason","created_at"],"title":"ReplyQualityRow","description":"One scored reply plus the staff review of it, when a reviewer has filed one.\n\n``review`` is ``None`` for a card nobody has looked at yet. That absence is the queue's\ndefault state, not missing data, so the console reads it as \"open\" rather than \"unknown\"."},"ReplyQualitySummaryResponse":{"properties":{"scorer_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scorer Version","description":"The scorer version read. Null when the summary was read across every scorer version."},"scored_in_window":{"type":"integer","title":"Scored In Window"},"dimension_averages":{"additionalProperties":{"anyOf":[{"type":"number"},{"type":"null"}]},"type":"object","title":"Dimension Averages"},"band_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Band Counts"},"triage_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Triage Counts"},"verdict_matrix":{"items":{"$ref":"#/components/schemas/AgreementCell"},"type":"array","title":"Verdict Matrix"},"user_signal_matrix":{"items":{"$ref":"#/components/schemas/AgreementCell"},"type":"array","title":"User Signal Matrix"},"failure_counts":{"items":{"$ref":"#/components/schemas/FailureLabelCount"},"type":"array","title":"Failure Counts"},"scored_today":{"type":"integer","title":"Scored Today","description":"Recorded scoring attempts today, including attempts that produced no scorecard."},"spent_today_micro_usd":{"type":"integer","title":"Spent Today Micro Usd"},"daily_budget_micro_usd":{"type":"integer","title":"Daily Budget Micro Usd"},"tenant_daily_cap":{"type":"integer","title":"Tenant Daily Cap"}},"type":"object","required":["scorer_version","scored_in_window","dimension_averages","band_counts","triage_counts","verdict_matrix","user_signal_matrix","failure_counts","scored_today","spent_today_micro_usd","daily_budget_micro_usd","tenant_daily_cap"],"title":"ReplyQualitySummaryResponse","description":"The console header. Rates are computed client-side from these raw counts.\n\nEvery average is ``float | None`` and every rate is derived from counts that may be zero:\nan empty window must render as \"no data\", never as a score of 0, which on a 1-to-5 rubric\nwould read as the worst quality ever recorded."},"ReplyQualityTeams":{"properties":{"since":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Since"},"until":{"type":"string","format":"date-time","title":"Until","description":"The end this aggregate actually read to. Always present, so a caller can label the table it got."},"scorer_version":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scorer Version","description":"Null when the window was read across every rubric version."},"teams":{"items":{"$ref":"#/components/schemas/TeamQuality"},"type":"array","title":"Teams"}},"type":"object","required":["until","teams"],"title":"ReplyQualityTeams","description":"Per-workspace quality for the window, busiest workspace first.\n\n``since`` and ``until`` echo the window the rows were actually aggregated over, which is not\nalways the window the caller asked for: omitting either bound applies the default span. Read\nthem rather than the request, and label the table from them. ``until`` is always present: it is\neither the end the caller named or the instant this request captured, so it is not a \"as of\nnow\" stamp. ``since`` is null only when the caller asked for every scorecard ever written, and\nthe rows then reach back to the first one on record."},"ReplyQualityTrend":{"properties":{"granularity":{"type":"string","title":"Granularity"},"since":{"type":"string","format":"date-time","title":"Since"},"until":{"type":"string","format":"date-time","title":"Until"},"current_scorer_version":{"type":"string","title":"Current Scorer Version","description":"The version replies are being scored under now — the only series that keeps growing."},"scorer_versions":{"items":{"type":"string"},"type":"array","title":"Scorer Versions","description":"Every rubric version present in the window, oldest bucket first. More than one means the series has a discontinuity in it."},"buckets":{"items":{"$ref":"#/components/schemas/QualityBucket"},"type":"array","title":"Buckets"}},"type":"object","required":["granularity","since","until","current_scorer_version","scorer_versions","buckets"],"title":"ReplyQualityTrend","description":"The quality series plus what a reader needs to interpret it.\n\n``buckets`` is sparse: a period nobody was scored in is simply absent. It is never emitted\nas a zero, because \"nobody asked Patricia anything\" and \"the judge stopped running\" are\ndifferent facts and neither of them is a quality of 0 on a 1-to-5 rubric."},"ReplyReviewRequest":{"properties":{"status_code":{"type":"string","title":"Status Code","description":"Where this card goes in the queue: open, acknowledged, escalated or dismissed.","default":"acknowledged"},"verdict_code":{"type":"string","title":"Verdict Code","description":"Was the judge right about this reply: agree, too_strict, too_lenient, or unset when the reviewer is only triaging and has no opinion on the score.","default":"unset"},"failure_code":{"type":"string","title":"Failure Code","description":"What actually went wrong, from the closed cause list. Empty means unlabelled.","default":""},"note":{"type":"string","maxLength":2000,"title":"Note","description":"Optional reviewer note.","default":""}},"additionalProperties":false,"type":"object","title":"ReplyReviewRequest","description":"A reviewer's decision about one scored reply.\n\n``extra=\"forbid\"`` so a misspelled field is a 422 rather than a silently dropped decision.\nA reviewer who thinks they recorded a verdict and did not is the worst outcome here."},"RequestSeverity":{"type":"string","enum":["blocker","high","medium","low"]},"RequestSort":{"type":"string","enum":["created_at:desc","created_at:asc"]},"ResendResponse":{"properties":{"channels":{"items":{"type":"string"},"type":"array","title":"Channels"},"skipped_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skipped Reason"}},"type":"object","required":["channels"],"title":"ResendResponse","description":"POST /members/{id}/resend response: channels enqueued this call.\n\n``skipped_reason`` is set when nothing was enqueued for a knowable reason: nobody in the\nworkspace has given Patricia a task in chat yet (``\"workspace_has_not_used_patricia\"``), the\nmember is a guest, their one hello is already spent, or the DM has already failed its attempt\nallowance (``\"welcome_dm_attempts_exhausted\"``). ``None`` with empty ``channels`` means every\nchannel was already outreached."},"RevokeClearanceRefusal":{"type":"string","enum":["not_revoke_failed","live_debt_exists"],"title":"RevokeClearanceRefusal","description":"Why a revoke-failure clearance did not take. DERIVED at the point of refusal, never stored.\n\n- ``NOT_REVOKE_FAILED``: the row was not at ``revoke_failed``. Already released by an earlier\n  clearance, or never fenced. Nothing to do.\n- ``LIVE_DEBT_EXISTS``: the row is fenced AND a non-terminal outbox debt is still owed on the\n  credential, so a worker may yet kill it. The leak report shows this account as ``owned``. Wait\n  for the debt to settle; if it dead-letters, the clearance becomes available."},"RevokeFailureClearance":{"properties":{"upstream_confirmed_revoked":{"type":"boolean","title":"Upstream Confirmed Revoked","description":"True when the operator verified in the provider's own console that the credential is gone. False when they are accepting a leak they could not kill — the account then stays on the orphan report, because it may still be billing."}},"type":"object","required":["upstream_confirmed_revoked"],"title":"RevokeFailureClearance","description":"Which of the two decisions the operator is recording.\n\nClearing a dead letter always means the same thing to the MEMBER — the fence lifts and they can\nconnect that app again — but it can mean either of two opposite things about the CREDENTIAL, and\nthe COGS orphan report needs to know which. Confirmed in the provider's console: it is dead, and\nreporting it as a live charge for ever is a false positive nobody can clear. Accepted as a leak:\nit may still be billing, and quietly dropping it from the report is how a real cost disappears.\n\nRequired rather than defaulted, because either default silently answers a money question on the\noperator's behalf."},"RevokeFailureClearanceResult":{"properties":{"account":{"type":"string","title":"Account"},"tenant_id":{"type":"string","title":"Tenant Id"},"cleared":{"type":"boolean","title":"Cleared","description":"False when the clearance did not take; see ``refusal`` for why."},"refusal":{"anyOf":[{"$ref":"#/components/schemas/RevokeClearanceRefusal"},{"type":"null"}],"description":"Why the clearance did not take. Null when ``cleared`` is true. ``not_revoke_failed``: the row was not fenced, so there was nothing to release. ``live_debt_exists``: it IS fenced but a worker is still owed a kill on the credential (the leak report shows it as ``owned``) — wait for that debt to settle rather than retrying the clearance. Read as a hint, not a verdict: it is measured just after the write rather than inside it, so a debt that settles in that instant reports ``not_revoke_failed``. ``cleared`` is exact."},"still_reported_as_orphaned":{"type":"boolean","title":"Still Reported As Orphaned","description":"True when the account remains on the COGS orphan report — either the operator accepted the leak, or the row was not theirs to clear."}},"type":"object","required":["account","tenant_id","cleared","still_reported_as_orphaned"],"title":"RevokeFailureClearanceResult","description":"What the operator's clearance did.\n\n``cleared`` is false for two different reasons, and ``refusal`` says which. Reported rather than\nraised, so a double-click is a no-op with an honest answer instead of an error about a state the\noperator already wanted — but \"nothing to do\" and \"a worker still owns this\" are opposite next\nactions, so they are not reported as the same thing."},"RevokeRetryOwnership":{"type":"string","enum":["owned","dead_lettered","unowned"],"title":"RevokeRetryOwnership","description":"Whether anything is still trying to revoke a reported credential, as of this read.\n\nBeing on the leak report never meant retries had stopped, and this is the field that says so. It\nis a snapshot taken while the report was built, not a promise about the future.\n\n- ``OWNED``: something still owes this credential a revoke and may yet perform it. Do not clean\n  the credential up at the provider by hand — you would race that attempt.\n- ``DEAD_LETTERED``: attempts were exhausted and nothing will retry. This is the state the\n  revoke-failure clearance route accepts, and the one that is yours to act on.\n- ``UNOWNED``: nothing was owed when the report ran. Usually that means no retry is coming, but\n  it is also what an in-flight disconnect looks like, because a disconnect records a debt only\n  after its provider call fails. Wait for any disconnect or offboard you know of to finish before\n  treating a row as abandoned."},"RiskTier":{"type":"string","enum":["read_only","low","medium","high","critical"],"title":"RiskTier"},"RiskTierRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"RiskTierRefReferenceFullValidator"},"Role":{"type":"string","enum":["owner","admin","member","viewer"],"title":"Role"},"RoleRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"RoleRefReferenceFullValidator"},"RosterState":{"type":"string","enum":["not_connected","unavailable","listed"],"title":"RosterState","description":"Whether this workspace's chat roster can be shown at all."},"RosterSyncPolicyBody":{"properties":{"include_full_members":{"type":"boolean","title":"Include Full Members","description":"Include full workspace members when syncing the team list.","default":true},"include_multi_channel_guests":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Multi Channel Guests","description":"Include multi-channel Slack guests. Either guest option also includes Teams guests."},"include_single_channel_guests":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Single Channel Guests","description":"Include single-channel Slack guests. Either guest option also includes Teams guests."},"include_guests":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Include Guests"},"admins_only":{"type":"boolean","title":"Admins Only","description":"Sync only workspace owners and admins. Guests remain excluded.","default":false}},"additionalProperties":false,"type":"object","title":"RosterSyncPolicyBody","description":"Admin request body to set the roster-sync policy (who joins from Slack)."},"RosterSyncPolicyResponse":{"properties":{"include_full_members":{"type":"boolean","title":"Include Full Members"},"include_multi_channel_guests":{"type":"boolean","title":"Include Multi Channel Guests"},"include_single_channel_guests":{"type":"boolean","title":"Include Single Channel Guests"},"admins_only":{"type":"boolean","title":"Admins Only"},"include_guests":{"type":"boolean","title":"Include Guests"}},"type":"object","required":["include_full_members","include_multi_channel_guests","include_single_channel_guests","admins_only","include_guests"],"title":"RosterSyncPolicyResponse","description":"The tenant's effective roster-sync policy (admin view)."},"RowDisposition":{"type":"string","enum":["approved","hostile"],"title":"RowDisposition","description":"What the approver decided about one row. Two answers, and no default.\n\nThere is deliberately no \"unknown\" member. A row the approver did not classify is a row the\nmanifest does not name, and a row the manifest does not name is never touched — absence is the\nsafe state, so representing indecision inside the document would create a third behaviour\nnobody approved."},"RunDetailResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"trigger_code":{"$ref":"#/components/schemas/RunTrigger"},"trigger_context":{"anyOf":[{"$ref":"#/components/schemas/RunTriggerContext"},{"type":"null"}]},"message_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Excerpt"},"status_code":{"$ref":"#/components/schemas/RunStatus"},"truncated":{"type":"boolean","title":"Truncated","default":false},"no_result":{"type":"boolean","title":"No Result","default":false},"silent":{"type":"boolean","title":"Silent","default":false},"model":{"type":"string","title":"Model"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens"},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens"},"cost_micro_usd":{"type":"integer","title":"Cost Micro Usd"},"budget_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Budget Micro Usd"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"peekable_skill_slugs":{"items":{"type":"string"},"type":"array","title":"Peekable Skill Slugs","description":"Skill slugs this run loaded that the peek drawer (GET /skill-catalog/{slug}) would serve right now. Gated by the skills:read scope: a caller who holds runs:read but not skills:read always gets an empty list here, even for a run that did load a skill."},"progress":{"anyOf":[{"$ref":"#/components/schemas/RunProgressOut"},{"type":"null"}],"description":"Live progress for this run. no_signal means the API cannot observe the run right now, not that the run is healthy. Always null for a terminal run."},"models_used":{"items":{"type":"string"},"type":"array","title":"Models Used","description":"The models that served this run's rounds, in the order each first served one. A run the person switched to another model mid-way names both; each round is billed at its own model. Read from the first 1,024 rounds the run records, so a model that first served after that is not listed."},"credits":{"type":"integer","title":"Credits","description":"Credits fixed when the run finished, with live-rate conversion for runs without a snapshot.","readOnly":true}},"type":"object","required":["id","tenant_id","trigger_code","status_code","model","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","cost_micro_usd","created_at","updated_at","credits"],"title":"RunDetailResponse","description":"``GET /runs/{id}`` with live progress and this run's peekable-skill signal.\n\n``progress`` projects the Redis marker for a non-terminal run. It stays explicit when no live\nmarker can be observed, and it is always null after the run reaches a terminal status.\n\n``peekable_skill_slugs`` names the distinct skill slugs THIS run loaded\n(``read_skill_file`` / ``stage_skill_scripts``) that ``GET /skill-catalog/{slug}`` would answer\nfor the caller right now — resolved through the exact same predicate that route serves by\n(:func:`services.skill_platform.catalog_detail.resolve_peekable_skill_slugs`), so the dashboard's\n\"See skill\" button can never offer a slug the peek drawer would then refuse. Deliberately absent\nfrom the list route: it costs a per-run resolution the run list has no use for, so only the detail\nload pays it."},"RunHistoryRow":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"trigger_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Trigger Code"},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"credits":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits","description":"Credits fixed at the rate used when this run finished. Uses the current rate if no saved amount exists."},"total_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Tokens"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"activity_title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Activity Title"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"actor_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Actor Label"}},"type":"object","title":"RunHistoryRow","description":"Row shape returned by the run-history query.\n\nUsage is reported to the dashboard as ``credits``. A settled run reports the whole-credit\namount frozen at the peg that applied when it finished, so a later re-peg cannot restate it;\na run with no snapshot falls back to its metered COGS converted at the live peg (half-up),\nmatching the credit ledger. ``_credits_column`` builds both branches. ``total_tokens``\n(input + output) is also carried for internal/admin callers; the raw dollar cost\n(``cost_micro_usd``) is never surfaced (pricing-v2 §8a). All fields optional so\n``fields=`` projection validates (runflow pattern).\n\n``activity_title`` is the real thing that started the run (a schedule name, or the\nfirst line of a directed message), approver-gated like the trigger-context prompt:\na caller who cannot decide an approval receives ``None`` and the dashboard shows the\ngeneric trigger label instead. ``actor_id`` / ``actor_label`` attribute the run to the\nHUMAN it ran as: ``actor_id`` is null for a system/bot/headless run (no human owner),\nand ``actor_label`` is resolved router-side (null → the dashboard renders Patricia; a\ndeparted teammate reads \"Former member\")."},"RunJournalKind":{"type":"string","enum":["tool_finished","final_reply","run_failed","run_reaped"],"title":"RunJournalKind","description":"What one journal row records. The table's CHECK constraint lists exactly these."},"RunProgressOut":{"properties":{"state":{"type":"string","enum":["working","waiting_approval","no_signal"],"title":"State","description":"Live marker state. no_signal means the API cannot observe the run right now. It is not a claim that the run is healthy."},"activity":{"type":"string","title":"Activity","description":"Newest reported step label, or an empty string when unknown."},"steps":{"items":{"type":"string"},"type":"array","title":"Steps","description":"Recent reported step labels, with the newest label last."},"waiting_on":{"type":"string","title":"Waiting On","description":"Approval label when the run is waiting, or an empty string otherwise."},"checklist":{"type":"string","title":"Checklist","description":"The task checklist's current line, as 'the step in flight, N of M' while one step is in flight and 'N of M done' once none is. Empty when the run keeps no checklist, or when its list has nothing left to count. It says what the run is for; the step labels say what it is doing.","default":""},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At","description":"When the live marker started this run."},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At","description":"When the live marker last changed."}},"type":"object","required":["state","activity","steps","waiting_on"],"title":"RunProgressOut","description":"The live progress signal for a non-terminal run."},"RunSort":{"type":"string","enum":["created_at:desc","created_at:asc"]},"RunStatsBucket":{"properties":{"date":{"type":"string","format":"date-time","title":"Date","description":"Truncated UTC start of the period (midnight; Monday for week, 1st for month)."},"runs":{"type":"integer","title":"Runs","description":"Runs created in this period."},"credits":{"type":"integer","title":"Credits","description":"Credits consumed in this period (metered COGS converted to whole credits)."},"tokens":{"type":"integer","title":"Tokens","description":"Summed input + output tokens for this period (internal/admin; dashboard uses credits)."},"by_source":{"items":{"$ref":"#/components/schemas/RunStatsBucketSource"},"type":"array","title":"By Source","description":"Per-source credit split of this bucket; empty on a zero-filled period. Slices sum to `credits`."}},"type":"object","required":["date","runs","credits","tokens","by_source"],"title":"RunStatsBucket","description":"One zero-filled timeline period: its UTC start plus run count and usage.\n\n``credits`` is the customer-facing consumption for the period (metered COGS →\nwhole credits, half-up); ``tokens`` is the raw input+output sum kept for\ninternal/admin callers. ``by_source`` splits ``credits`` across the period's run\nsources for the stacked chart (empty on a zero-filled period; the slice credits\nsum the same per-run figures and exactly partition this bucket's ``credits``)."},"RunStatsBucketSource":{"properties":{"source":{"type":"string","title":"Source","description":"Run trigger code (mention / dm / message / cron / heartbeat / …)."},"runs":{"type":"integer","title":"Runs","description":"Runs from this source in this bucket."},"credits":{"type":"integer","title":"Credits","description":"Sum of this source's per-run whole credits in the bucket; source slices sum to the bucket's `credits`."}},"type":"object","required":["source","runs","credits"],"title":"RunStatsBucketSource","description":"One run-source (``trigger_code``) slice of a single timeline bucket.\n\nEach slice sums the same per-run whole-credit expression as the parent bucket.\nA run uses its frozen credit snapshot when present, otherwise its COGS converted at the live peg.\nSource slices therefore partition the bucket exactly; their credits sum to the bucket total.\n``runs`` counts the runs from this source in this bucket."},"RunStatsByMemberResponse":{"properties":{"members":{"items":{"$ref":"#/components/schemas/RunStatsMemberSlice"},"type":"array","title":"Members","description":"Per-actor slices, most credits first (then tokens, runs, actor_id); active members only."}},"type":"object","required":["members"],"title":"RunStatsByMemberResponse","description":"Per-member run/usage breakdown for a tenant over a UTC date window.\n\nBacks the Usage → \"Per team\" table: usage attributed per teammate (per actor),\nin **credits** (never dollars; pricing-v2 §8a), most credits first. Members with\nno runs in the window are omitted (the table shows only who was active)."},"RunStatsMemberSlice":{"properties":{"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id","description":"The run actor's id, or null for unattributed (automated / system) runs."},"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name","description":"The actor's display name; null for the automated slice or a removed member."},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle","description":"The actor's chat handle (e.g. Slack @handle) when known, else null."},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email","description":"The actor's email when known, else null."},"runs":{"type":"integer","title":"Runs","description":"Runs this teammate triggered in the window."},"credits":{"type":"integer","title":"Credits","description":"Credits consumed by this teammate's runs (metered COGS converted to whole credits)."},"total_tokens":{"type":"integer","title":"Total Tokens","description":"Summed input + output tokens for this teammate's runs (internal/admin; dashboard uses credits)."}},"type":"object","required":["actor_id","name","handle","email","runs","credits","total_tokens"],"title":"RunStatsMemberSlice","description":"One teammate's run count + token usage over the window (the \"Per team\" breakdown).\n\nRuns are attributed by ``AgentRun.actor_id``, the platform identity that\ntriggered the run. Runs with no actor (e.g. scheduled / system work) collapse\ninto a single ``actor_id = null`` slice the dashboard labels \"Automated\". A run\nwhose actor was later removed (soft-deleted) keeps its own ``actor_id`` slice\nbut with null ``name`` / ``handle`` / ``email`` (rendered as \"Former member\")."},"RunStatsResponse":{"properties":{"timeline":{"items":{"$ref":"#/components/schemas/RunStatsBucket"},"type":"array","title":"Timeline","description":"Per-period buckets, zero-filled across the whole window."},"totals":{"$ref":"#/components/schemas/RunStatsTotals","description":"Window totals for the KPI cards."},"by_source":{"items":{"$ref":"#/components/schemas/RunStatsSourceSlice"},"type":"array","title":"By Source","description":"Split by run source, most runs first."},"previous_totals":{"anyOf":[{"$ref":"#/components/schemas/RunStatsTotals"},{"type":"null"}],"description":"Totals for the shifted prior window, populated only when `compare` is set, else null."}},"type":"object","required":["timeline","totals","by_source","previous_totals"],"title":"RunStatsResponse","description":"Aggregate run/usage stats for a tenant over a UTC date window."},"RunStatsSourceSlice":{"properties":{"source":{"type":"string","title":"Source","description":"Run trigger code (mention / dm / message / cron / heartbeat / …)."},"runs":{"type":"integer","title":"Runs","description":"Runs created from this source in the window."},"credits":{"type":"integer","title":"Credits","description":"Credits consumed by this source (metered COGS converted to whole credits)."},"tokens":{"type":"integer","title":"Tokens","description":"Summed input + output tokens for this source (internal/admin; dashboard uses credits)."}},"type":"object","required":["source","runs","credits","tokens"],"title":"RunStatsSourceSlice","description":"Run count + usage for one run source (``trigger_code``)."},"RunStatsTotals":{"properties":{"runs":{"type":"integer","title":"Runs","description":"Total runs created in the window."},"credits":{"type":"integer","title":"Credits","description":"Total credits consumed in the window (metered COGS → whole credits), the headline usage metric."},"total_tokens":{"type":"integer","title":"Total Tokens","description":"Total input + output tokens across runs (internal/admin; the dashboard shows credits)."},"success_rate":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Success Rate","description":"Percentage (0–100) of terminal runs that completed successfully; null when no run has finished."}},"type":"object","required":["runs","credits","total_tokens","success_rate"],"title":"RunStatsTotals","description":"Window totals for the KPI cards.\n\n``success_rate`` is computed over **terminal** runs only (``completed`` /\n``failed`` / ``cancelled`` / ``denied_autonomous``) as the percentage that\n``completed``. It is ``null`` until at least one run in the window has reached a\nterminal state. A run the authority model refused counts in the denominator:\nit finished without succeeding, so excluding it would flatter the rate."},"RunStatus":{"type":"string","enum":["queued","running","waiting_approval","suspended","completed","failed","cancelled","denied_autonomous"],"title":"RunStatus"},"RunStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"RunStatusRefReferenceFullValidator"},"RunTrigger":{"type":"string","enum":["mention","dm","message","proactive","cron","event","heartbeat","discovery","onboarding","manual","spawn"],"title":"RunTrigger"},"RunTriggerAttachment":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"mime_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mime Type"},"size_bytes":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Size Bytes"},"external_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"External Id"}},"type":"object","title":"RunTriggerAttachment","description":"Read-safe metadata for a file attached to the message that started a run."},"RunTriggerContext":{"properties":{"sender":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Sender"},"attachments":{"items":{"$ref":"#/components/schemas/RunTriggerAttachment"},"type":"array","title":"Attachments","default":[]},"schedule_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule Name"},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"cron_job_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cron Job Id"},"built_in_template_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Built In Template Key"},"one_shot":{"type":"boolean","title":"One Shot","default":false},"post_every_run":{"type":"boolean","title":"Post Every Run","default":false},"mcp_direct_tool_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Direct Tool Ref"},"admin_console_operator":{"type":"boolean","title":"Admin Console Operator","default":false},"loop_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Loop Id"},"loop_final":{"type":"boolean","title":"Loop Final","default":false},"task_test_run":{"type":"boolean","title":"Task Test Run","default":false},"task_summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Summary"},"prompt_digest":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt Digest"}},"type":"object","title":"RunTriggerContext","description":"Curated provenance for the request card at the start of a run timeline."},"RunTriggerRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"RunTriggerRefReferenceFullValidator"},"SalienceBucket":{"properties":{"bucket":{"type":"string","title":"Bucket"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["bucket","count"],"title":"SalienceBucket"},"ScopeDrivePair":{"properties":{"drive":{"type":"string","maxLength":512,"minLength":1,"title":"Drive"},"site":{"type":"string","maxLength":512,"minLength":1,"title":"Site"}},"additionalProperties":false,"type":"object","required":["drive","site"],"title":"ScopeDrivePair","description":"One drive, named with the site it sits under.\n\nThe parent travels with the drive because the policy is read while a call is being authorized,\nand an authorizer that had to ask the provider which site a drive belongs to would be making a\nnetwork call to decide whether it may make a network call."},"ScopeKindCount":{"properties":{"scope_code":{"type":"string","title":"Scope Code"},"kind_code":{"type":"string","title":"Kind Code"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["scope_code","kind_code","count"],"title":"ScopeKindCount"},"SearchResponse_ActorKindRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorKindRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[ActorKindRefReferenceFullValidator]"},"SearchResponse_BrainDocScopeRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BrainDocScopeRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[BrainDocScopeRefReferenceFullValidator]"},"SearchResponse_ConversationKindRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ConversationKindRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[ConversationKindRefReferenceFullValidator]"},"SearchResponse_CronKindRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/CronKindRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[CronKindRefReferenceFullValidator]"},"SearchResponse_DocStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/DocStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[DocStatusRefReferenceFullValidator]"},"SearchResponse_GroupStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GroupStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[GroupStatusRefReferenceFullValidator]"},"SearchResponse_GroupSuggestionStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/GroupSuggestionStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[GroupSuggestionStatusRefReferenceFullValidator]"},"SearchResponse_IntegrationStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IntegrationStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[IntegrationStatusRefReferenceFullValidator]"},"SearchResponse_IntegrationVisibilityRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IntegrationVisibilityRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[IntegrationVisibilityRefReferenceFullValidator]"},"SearchResponse_InvitationStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/InvitationStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[InvitationStatusRefReferenceFullValidator]"},"SearchResponse_LessonStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/LessonStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[LessonStatusRefReferenceFullValidator]"},"SearchResponse_MemberSourceRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemberSourceRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[MemberSourceRefReferenceFullValidator]"},"SearchResponse_MembershipStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MembershipStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[MembershipStatusRefReferenceFullValidator]"},"SearchResponse_MemoryKindRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemoryKindRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[MemoryKindRefReferenceFullValidator]"},"SearchResponse_MemoryScopeRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/MemoryScopeRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[MemoryScopeRefReferenceFullValidator]"},"SearchResponse_OutreachChannelRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OutreachChannelRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[OutreachChannelRefReferenceFullValidator]"},"SearchResponse_OutreachPersonalizationRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OutreachPersonalizationRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[OutreachPersonalizationRefReferenceFullValidator]"},"SearchResponse_OutreachStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OutreachStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[OutreachStatusRefReferenceFullValidator]"},"SearchResponse_PermissionStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PermissionStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[PermissionStatusRefReferenceFullValidator]"},"SearchResponse_PlatformRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PlatformRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[PlatformRefReferenceFullValidator]"},"SearchResponse_PreferenceSourceRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PreferenceSourceRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[PreferenceSourceRefReferenceFullValidator]"},"SearchResponse_ProactiveCandidateStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ProactiveCandidateStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[ProactiveCandidateStatusRefReferenceFullValidator]"},"SearchResponse_RiskTierRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RiskTierRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[RiskTierRefReferenceFullValidator]"},"SearchResponse_RoleRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RoleRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[RoleRefReferenceFullValidator]"},"SearchResponse_RunStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[RunStatusRefReferenceFullValidator]"},"SearchResponse_RunTriggerRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunTriggerRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[RunTriggerRefReferenceFullValidator]"},"SearchResponse_TenantStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TenantStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[TenantStatusRefReferenceFullValidator]"},"SearchResponse_ToolCallStatusRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolCallStatusRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[ToolCallStatusRefReferenceFullValidator]"},"SearchResponse_ToolKindRefReferenceFullValidator_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolKindRefReferenceFullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchResponse[ToolKindRefReferenceFullValidator]"},"SendOutcome":{"type":"string","enum":["sent","silent","failed","in_progress","not_recorded"]},"SetInternalRequest":{"properties":{"is_internal":{"type":"boolean","title":"Is Internal"}},"type":"object","required":["is_internal"],"title":"SetInternalRequest"},"SetPersonFactRequest":{"properties":{"domain_key":{"type":"string","title":"Domain Key","description":"The canonical fact key, e.g. person.birthday / person.work_anniversary."},"month":{"anyOf":[{"type":"integer","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Month","description":"Birthday month (1–12); no year is collected."},"day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Day","description":"Birthday day (1–31)."},"on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"On","description":"Work-anniversary date (ISO). Only month/day recur."},"effective_tz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Tz","description":"IANA tz for this subject (optional)."},"entity_id":{"type":"string","format":"uuid","title":"Entity Id","description":"The subject Actor id the fact is about."}},"type":"object","required":["domain_key","entity_id"],"title":"SetPersonFactRequest","description":"Set a person's birthday or work anniversary (admin data entry). The subject is ``entity_id``."},"SetProactiveProgramModeRequest":{"properties":{"mode_code":{"$ref":"#/components/schemas/ProactiveProgramMode"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"}},"additionalProperties":false,"type":"object","required":["mode_code"],"title":"SetProactiveProgramModeRequest","description":"Change one program's mode. ``enabled`` defaults to \"runnable unless disabled\"."},"SetSkillTestingRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled"}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"SetSkillTestingRequest","description":"Set the staff-owned skill-testing designation for a workspace."},"SetupSessionResponse":{"properties":{"checkout_url":{"type":"string","title":"Checkout Url"},"session_id":{"type":"string","title":"Session Id"}},"type":"object","required":["checkout_url","session_id"],"title":"SetupSessionResponse","description":"The hosted Stripe Checkout Session (``mode=setup``) URL for adding a card.\n\nAdd-card uses a Checkout redirect (NOT client-side Stripe.js): the browser is sent to\n``checkout_url``, saves the card, and returns to the Billing tab; the card is synced into\n``payment_methods`` when that session's ``checkout.session.completed`` arrives."},"SharePointScopeBody":{"properties":{"mode_code":{"$ref":"#/components/schemas/SharePointScopeMode"},"sites":{"items":{"type":"string"},"type":"array","maxItems":500,"title":"Sites"},"expected_policy_version":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Expected Policy Version"}},"additionalProperties":false,"type":"object","required":["mode_code"],"title":"SharePointScopeBody","description":"Replace a SharePoint connection's WHOLE site policy.\n\nWhole-set, never a delta: a policy is the complete answer to \"which sites may Patricia address\nthrough this connection\", so the request that sets it says the whole answer. A delta protocol\ncould be made concurrency-safe too, with its own removal grammar; this one is simply the shape\nthat needs no such grammar, and the version check below is what makes it safe.\n\n``expected_policy_version`` is the compare-and-set guard, and omitting it is an EXPECTATION\nrather than a bypass — it means \"I read no policy\", so against a connection that already has one\nthe write is refused. That is the direction that cannot silently discard somebody's choice.\n\n**Only sites are sent.** The stored policy also names the drives under them, and those are\nenumerated server-side from the selection rather than accepted here: a ``drive -> site`` pair is\nwhat admits a call rooted at a drive, so a client able to state one could name a drive under a\nsite it holds and reach a library on a site it does not. The read still returns the pairs, which\nis what makes the stored policy inspectable."},"SharePointScopeMode":{"type":"string","enum":["unrestricted","selected_sites"],"title":"SharePointScopeMode","description":"Which SharePoint sites a connection may address through Patricia.\n\n- ``UNRESTRICTED``: anything the Microsoft identity and the reviewed tool surface permit. This\n  is what every connection does today, and what a migration-backfilled row records.\n- ``SELECTED_SITES``: only the canonical site ids named in the policy, and the drive ids\n  materialized under them.\n\nThe mode alone never decides access. A row's ``owner_authored_at`` says whether a HUMAN chose\nthe policy or a landing insert merely recorded that the connection exists, and only the former\nis a grant."},"SharePointScopeResponse":{"properties":{"mode_code":{"anyOf":[{"$ref":"#/components/schemas/SharePointScopeMode"},{"type":"null"}]},"policy_version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Policy Version"},"owner_authored":{"type":"boolean","title":"Owner Authored"},"sites":{"items":{"type":"string"},"type":"array","title":"Sites"},"drives":{"items":{"$ref":"#/components/schemas/ScopeDrivePair"},"type":"array","title":"Drives"}},"additionalProperties":false,"type":"object","required":["mode_code","policy_version","owner_authored","sites","drives"],"title":"SharePointScopeResponse","description":"One connection's policy, and the version the next write has to send back.\n\n``policy_version`` is ``None`` when no policy row exists, which is the expect-absent case rather\nthan version zero — an editor has to be able to say \"I read no policy\" and have that be checkable\nagainst the row that does or does not appear.\n\n``owner_authored`` is what makes a row a grant. A row written by the connection-landing insert\ncarries ``false`` here: it records that the connection exists, never that anybody chose its\npolicy, and the authorizer reads that rather than ``mode_code``."},"ShareRequestCreate":{"properties":{"installation_id":{"type":"string","format":"uuid","title":"Installation Id","description":"The caller's own personal installation to offer to the team."}},"additionalProperties":false,"type":"object","required":["installation_id"],"title":"ShareRequestCreate","description":"Ask for ONE of your own personal installs to be shared with the whole workspace.\n\nThe install is named by id and nothing else: who may ask is decided server-side from the caller's\nmembership-linked chat actor, so a body cannot nominate a requester."},"ShareRequestReview":{"properties":{"share_request_id":{"type":"string","format":"uuid","title":"Share Request Id"},"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"manifest_version_id":{"type":"string","format":"uuid","title":"Manifest Version Id"},"semver":{"type":"string","title":"Semver","description":"Semver of the pinned version, not of the skill's newest one."},"archetype_code":{"type":"string","title":"Archetype Code"},"title":{"type":"string","title":"Title","description":"The pinned version's own title, falling back to the skill's current one when the pinned manifest carries none."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"The pinned version's own summary, or null when the pinned manifest carries none. The skill's current summary is never substituted: that one tracks the newest version the author saved, which is not the version this request would share."},"renamed_since_pin":{"type":"boolean","title":"Renamed Since Pin","description":"True when the skill has been renamed since this version was pinned, so the sheet can say so out loud. Compared against the title as rendered, so it stays false when title itself fell back to the skill's current name."},"instructions_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions Body","description":"The pinned markdown body for an ``instructions`` skill, which is the archetype that keeps its prose in the manifest. Null for a portable ``skill``, whose prose lives in its file bundle rather than its manifest, and null when the pinned manifest carries no body."},"requester_name":{"type":"string","title":"Requester Name"},"requested_at":{"type":"string","format":"date-time","title":"Requested At"}},"type":"object","required":["share_request_id","skill_id","installation_id","manifest_version_id","semver","archetype_code","title","renamed_since_pin","requester_name","requested_at"],"title":"ShareRequestReview","description":"What an approver reads before deciding one open ask: the EXACT version they would share.\n\nContent comes from the installation's pinned ``manifest_version_id``, never from the skill's newest\nversion and never from :class:`ShareRequestSummary`'s snapshots. Those three can all say different\nthings: the snapshot froze the title when the ask was raised, the newest version is whatever the\nauthor saved most recently, and the pin is the one document the workspace would actually run. Only\nthe last of them is what an approval consents to.\n\nONE field is chosen between two sources, and it documents that on itself: ``title`` falls back to\nthe skill's current name when the pinned manifest carries no usable one, because both manifest\nschemas REQUIRE ``identity.title``: a pin without one is a corrupt row, and a sheet with no heading\nis the worse answer for it. Every other content field is the pin's or is null. ``description`` in\nparticular is null when the pin carries none (which is ordinary, since the schemas make it optional)\nrather than borrowing the definition's, whose column is rewritten from the newest save.\n\nBuilt field by field rather than validated from a row (no ``from_attributes``): no single ORM\nobject holds this shape."},"ShareRequestSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"skill_slug":{"type":"string","title":"Skill Slug"},"skill_title":{"type":"string","title":"Skill Title"},"skill_summary":{"type":"string","title":"Skill Summary"},"requester_name":{"type":"string","title":"Requester Name"},"requester_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Requester Actor Id"},"status_code":{"type":"string","title":"Status Code"},"decided_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Decided At"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","installation_id","skill_id","skill_slug","skill_title","skill_summary","requester_name","status_code","created_at"],"title":"ShareRequestSummary","description":"One share request as the API returns it: the ask, its snapshots, and its decision.\n\nThe ``skill_*`` and ``requester_*`` values are SNAPSHOTS taken when the ask was raised, so an\napproval card still reads correctly after the requester leaves or the skill is renamed."},"ShareToTeamUnavailableReason":{"type":"string","enum":["already_shared","managed_account","scope_sealed_at_connect","missing_edit_permission","not_your_account","mcp_share_needs_reconnect"],"title":"ShareToTeamUnavailableReason","description":"Why ``can_share_to_team`` is False for this caller. Null when it is True.\n\nThe value names the first term of that answer that fails, in the order ``account_capabilities``\nstates:\n\n- ``already_shared``: the connection is shared with the whole workspace already.\n- ``managed_account``: Patricia manages the connection. The visibility write refuses a managed\n  connection for every caller.\n- ``scope_sealed_at_connect``: the connection's credential is sealed to the sharing it was\n  connected with (``core.scope_sealed_credentials``), and both visibility writes refuse to move\n  it in either direction. Disconnecting it and connecting it again with the sharing wanted is the\n  remedy.\n- ``missing_edit_permission``: the caller does not hold ``integrations:edit``.\n- ``not_your_account``: the caller is not the person who connected this private connection.\n- ``mcp_share_needs_reconnect``: the MCP server's saved sign-in would stop its tools working once\n  the server is shared, so the write refuses with the ``MCP_SHARE_NEEDS_RECONNECT`` error code.\n  Reconnecting the server is the remedy."},"SharedAssetAuthor":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"The name of the person who made the file. Null when nothing resolves."},"made_by_patricia":{"type":"boolean","title":"Made By Patricia","description":"Whether a Patricia run created this file. True with a display_name reads 'Patricia for <name>'; true without one reads 'Patricia'; false reads the name alone.","default":false}},"additionalProperties":false,"type":"object","title":"SharedAssetAuthor","description":"Who made a shared file, for the person the link was sent to.\n\nDeliberately NOT :class:`AssetAuthor`, and the missing field is the whole point: this shape has\nno ``actor_id`` to fill, so the public surface cannot carry a workspace member's identifier\nhowever it is later edited. A name is what \"who sent me this\" wants; an id addresses nothing a\nrecipient can open and everything a scraper would like."},"SharedAssetGrant":{"properties":{"grant":{"type":"string","title":"Grant"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"type":"object","required":["grant","expires_at"],"title":"SharedAssetGrant"},"SharedAssetUnlock":{"properties":{"password":{"type":"string","title":"Password"}},"additionalProperties":false,"type":"object","required":["password"],"title":"SharedAssetUnlock"},"SharedAssetView":{"properties":{"is_owner":{"type":"boolean","title":"Is Owner","description":"Whether the signed-in caller owns this file."},"requires_access_acknowledgement":{"type":"boolean","title":"Requires Access Acknowledgement","description":"Whether content requires an access_acknowledgement UUID and a durable audit receipt."},"name":{"type":"string","title":"Name","description":"The file's name. UNTRUSTED text: render escaped."},"category":{"type":"string","enum":["document","media","app"],"title":"Category","description":"Which library it came from: 'document' or 'media'."},"kind":{"type":"string","enum":["app","audio","docx","file","html","image","markdown","pdf","slides","spreadsheet","video"],"title":"Kind","description":"What sort of file this is, for the icon and the preview."},"content_type":{"type":"string","title":"Content Type","description":"The current version's media type, e.g. 'application/pdf'."},"byte_size":{"type":"integer","title":"Byte Size","description":"The current version's size in bytes."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"When the file was made (UTC)."},"updated_at":{"type":"string","format":"date-time","title":"Updated At","description":"When the file last changed (UTC)."},"author":{"$ref":"#/components/schemas/SharedAssetAuthor","description":"Who made the file: the page's 'Shared by' line."},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At","description":"When this link stops working, so the page can say so before the file goes. Null only for a link minted before share links carried a deadline."},"thumbnail_status":{"type":"string","enum":["ready","pending","unavailable"],"title":"Thumbnail Status","description":"Whether a preview image exists for this file. 'ready' means GET /shared-assets/{token}/thumbnail serves it; 'pending' means one is being prepared, ask again shortly; 'unavailable' means the type icon is the answer.","default":"unavailable"},"visibility":{"anyOf":[{"type":"string","enum":["private","team","external"]},{"type":"null"}],"title":"Visibility","description":"Who can open this file, so the page can say so. Answered only for a signed-in member of the workspace that owns it; null for anyone else, because who else can read a file is not a stranger's business."},"can_change_visibility":{"type":"boolean","title":"Can Change Visibility","description":"Whether YOU may change who can see this file from this page. True only when every condition PUT /assets/{id}/visibility checks for itself already holds: you are a member of this file's workspace, your session is signed in to THAT workspace, your role carries assets:edit, and you added the file or are a workspace admin. False for anyone else, so a control enabled by this flag is never refused by that request.","default":false},"asset_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Asset Id","description":"This file's id, for the PUT /assets/{id}/visibility call the control above makes. Null for anyone who is not a signed-in member of the workspace that owns it."}},"additionalProperties":false,"type":"object","required":["name","category","kind","content_type","byte_size","created_at","updated_at"],"title":"SharedAssetView","description":"One shared file as its READER sees it — the capability-scoped shape behind ``/shared/<token>``.\n\nEverything a page needs to show the file honestly, and nothing that describes the workspace it\ncame from. There is no tenant, no folder, no version history and no sibling here, because the\ntoken addresses ONE file: a field that named anything else would be describing something the\nholder was never handed.\n\nMembers receive ``visibility``, ``can_change_visibility`` and ``asset_id`` with values for their\naccess. Outside readers receive these three fields as ``null``, ``false`` and ``null``.\nMembers also receive ``is_owner`` and ``requires_access_acknowledgement``. The server omits both\nfields for outside readers. These fields tell members whose file they see and whether opening\nit requires a recorded acknowledgement.\n\nThe server decides whether the page offers the visibility control through\n``can_change_visibility``. The ``PUT /assets/{id}/visibility`` route checks the same authority.\n\n``name`` is UNTRUSTED text, exactly as it is on the authenticated surface — an agent run names\nan asset. It goes out as a plain JSON string and the page renders it as text, never as markup."},"SharedFolderFacts":{"properties":{"name":{"type":"string","title":"Name","description":"The folder's name. UNTRUSTED text: render escaped."},"total":{"type":"integer","title":"Total","description":"How many live files this folder currently holds."}},"additionalProperties":false,"type":"object","required":["name","total"],"title":"SharedFolderFacts","description":"One shared FOLDER as its recipient sees it — no workspace name, no ids, just the label and\nthe true count of files inside it."},"SharedFolderFile":{"properties":{"name":{"type":"string","title":"Name","description":"The file's name. UNTRUSTED text: render escaped."},"category":{"type":"string","enum":["document","media","app"],"title":"Category"},"kind":{"type":"string","enum":["app","audio","docx","file","html","image","markdown","pdf","slides","spreadsheet","video"],"title":"Kind"},"content_type":{"type":"string","title":"Content Type"},"byte_size":{"type":"integer","title":"Byte Size"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"thumbnail_status":{"type":"string","enum":["ready","pending","unavailable"],"title":"Thumbnail Status","default":"unavailable"},"locator":{"type":"string","title":"Locator","description":"An opaque, versioned, signed selector for this file within this folder link — pass it to the thumbnail and download routes. Meaningless outside this link, and outside this folder link's lifetime."}},"additionalProperties":false,"type":"object","required":["name","category","kind","content_type","byte_size","created_at","updated_at","locator"],"title":"SharedFolderFile","description":"One file in a shared folder's paged listing — the same shape :class:`SharedAssetView` uses\nfor a single file, plus the opaque locator its thumbnail and download routes need."},"SharedFolderPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SharedFolderFile"},"type":"array","title":"Items"},"next_cursor":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next Cursor","description":"Pass as `cursor` to fetch the next page. Null on the last page."}},"additionalProperties":false,"type":"object","required":["items"],"title":"SharedFolderPage","description":"One page of a shared folder's files, cursor-paged over an immutable key.\n\nDeliberately carries NO ``total`` — :class:`SharedFolderFacts` is the one place that count\nlives. The listing's own ``total`` would recompute the SAME correlated, live-link-gated count\n(:meth:`~repositories.asset.AssetFolderRepository.totals_for`) on every single page a recipient\nloads, for a number ``useSharedFolder.ts`` already holds from the first ``GET\n/shared-folders/{token}`` call and never needed a second time."},"SignedInRedeemBody":{"properties":{"token":{"type":"string","maxLength":512,"minLength":1,"format":"password","title":"Token","writeOnly":true}},"additionalProperties":false,"type":"object","required":["token"],"title":"SignedInRedeemBody","description":"The single-use connect token the dashboard page read from the link's URL fragment."},"SignedInRedeemResponse":{"properties":{"connect_url":{"type":"string","title":"Connect Url"}},"type":"object","required":["connect_url"],"title":"SignedInRedeemResponse","description":"The provider's consent URL, where the browser goes next."},"SiteOption":{"properties":{"site_id":{"type":"string","title":"Site Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"web_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Web Url"}},"additionalProperties":false,"type":"object","required":["site_id"],"title":"SiteOption","description":"One site a picker may offer, identified the way a policy stores it."},"SiteOptionsResponse":{"properties":{"sites":{"items":{"$ref":"#/components/schemas/SiteOption"},"type":"array","title":"Sites"},"sources_exhausted":{"type":"boolean","title":"Sources Exhausted"},"incomplete_reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Incomplete Reason"}},"additionalProperties":false,"type":"object","required":["sites","sources_exhausted"],"title":"SiteOptionsResponse","description":"Sites this connection was found to reach — never a claim about the whole estate.\n\n**There is no field saying this list is complete, because the sources cannot establish that.**\nThey are the sites the person FOLLOWS and the sites matching a keyword; a connection can reach a\nsite that is neither. Treat this as a set of suggestions to pick from, and let somebody enter a\nsite it does not contain.\n\n``sources_exhausted`` answers the smaller question: did every request finish, or did something\nstop part way. ``false`` means this list is shorter than even these sources would have given —\nworth telling a person, so they know to retry rather than conclude their estate is small. It is\nNOT permission to do anything, and in particular a ``true`` here licenses no narrowing.\n\n``incomplete_reason`` is a bounded code, never provider text, so it can be logged and compared."},"SkillAboutSummary":{"properties":{"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"taxonomy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taxonomy"},"example_phrases":{"items":{"type":"string"},"type":"array","title":"Example Phrases"},"requires_connected":{"items":{"type":"string"},"type":"array","title":"Requires Connected"},"works_with":{"items":{"type":"string"},"type":"array","title":"Works With"},"needs_skills":{"items":{"type":"string"},"type":"array","title":"Needs Skills"},"credits_per_run":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credits Per Run"},"instructions_body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions Body"},"has_settings":{"type":"boolean","title":"Has Settings","default":false}},"type":"object","title":"SkillAboutSummary","description":"What a skill IS, projected from its pinned manifest: the Hub's plain-language overview.\n\nThe Hub renders a skill's feature from its compiled ``feature_surface`` rows, but a skill whose\nmanifest declares no surfaces (every ``skill``/``instructions`` archetype today) compiles none, so\nthat path alone leaves the page blank. The manifest still describes the skill perfectly well\n(what it is for, what to say to reach it, what it wants connected), and this projects exactly that,\ngenerically: no per-skill branching, one shape for every archetype.\n\nDisplay labels only, never a personal fact (G4). Every field is optional-or-empty so a manifest\nthat omits one simply renders one section fewer."},"SkillConfigResponse":{"properties":{"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"config_version":{"type":"integer","title":"Config Version"},"status_code":{"type":"string","title":"Status Code"},"fields":{"items":{"$ref":"#/components/schemas/ConfigFieldSchema"},"type":"array","title":"Fields"},"values":{"additionalProperties":true,"type":"object","title":"Values"}},"type":"object","required":["installation_id","config_version","status_code","fields","values"],"title":"SkillConfigResponse","description":"The manifest-driven settings form for one installation: the field schema + the current values.\n\n``fields`` is the projected ``config_fields`` schema (what to render); ``values`` is the install's\nactive typed ``config_json`` (what to pre-fill). ``status_code`` lets the form gate the activate\ncontrol (an admin can't take a skill live until the required fields are set; the backend also\nenforces this on activation)."},"SkillConfigUpdateRequest":{"properties":{"values":{"additionalProperties":true,"type":"object","title":"Values"}},"type":"object","title":"SkillConfigUpdateRequest","description":"Save an installation's settings: the complete desired values for the declared config fields.\n\nUnknown keys are dropped server-side (only declared fields persist, G2); an invalid value is\nrejected with a per-field 422. A partial save is allowed (untouched fields keep their current\nvalue), so an admin can fill settings incrementally; go-live completeness is enforced at activation."},"SkillDraftDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id"},"author_user_id":{"type":"string","format":"uuid","title":"Author User Id"},"title":{"type":"string","title":"Title"},"archetype_code":{"type":"string","title":"Archetype Code"},"source_kind":{"type":"string","title":"Source Kind"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"file_count":{"type":"integer","title":"File Count","default":0},"slug":{"type":"string","title":"Slug"},"validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Validated At"},"validation_errors":{"items":{"type":"string"},"type":"array","title":"Validation Errors"},"base_version_stale":{"type":"boolean","title":"Base Version Stale","default":false},"manifest":{"additionalProperties":true,"type":"object","title":"Manifest"},"base_version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Base Version Id"},"published_version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Published Version Id"},"files":{"items":{"$ref":"#/components/schemas/DraftFileSummary"},"type":"array","title":"Files"},"source_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source Ref"}},"type":"object","required":["id","skill_id","author_user_id","title","archetype_code","source_kind","published_at","created_at","updated_at","slug","validated_at"],"title":"SkillDraftDetail","description":"One draft in full, returned to its author alone: the manifest plus the file list."},"SkillDraftMetadata":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id"},"author_user_id":{"type":"string","format":"uuid","title":"Author User Id"},"title":{"type":"string","title":"Title"},"archetype_code":{"type":"string","title":"Archetype Code"},"source_kind":{"type":"string","title":"Source Kind"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"file_count":{"type":"integer","title":"File Count","default":0}},"type":"object","required":["id","skill_id","author_user_id","title","archetype_code","source_kind","published_at","created_at","updated_at"],"title":"SkillDraftMetadata","description":"A draft WITHOUT its content — the shape a ``skills:delete`` holder may see.\n\nNo manifest, no file bytes, no file paths. Enough to decide whether an abandoned draft should go,\nand nothing that would turn the cleanup route into a read-anything backdoor."},"SkillDraftSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Skill Id"},"author_user_id":{"type":"string","format":"uuid","title":"Author User Id"},"title":{"type":"string","title":"Title"},"archetype_code":{"type":"string","title":"Archetype Code"},"source_kind":{"type":"string","title":"Source Kind"},"published_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Published At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"file_count":{"type":"integer","title":"File Count","default":0},"slug":{"type":"string","title":"Slug"},"validated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Validated At"},"validation_errors":{"items":{"type":"string"},"type":"array","title":"Validation Errors"},"base_version_stale":{"type":"boolean","title":"Base Version Stale","default":false}},"type":"object","required":["id","skill_id","author_user_id","title","archetype_code","source_kind","published_at","created_at","updated_at","slug","validated_at"],"title":"SkillDraftSummary","description":"A draft in its AUTHOR's list — metadata plus the cached validation state."},"SkillFacetProposalRequest":{"properties":{"manifest":{"additionalProperties":true,"type":"object","title":"Manifest","description":"The derived import manifest as a JSON object."},"skill_md":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Skill Md","description":"The imported skill's inert SKILL.md, if it has one."}},"type":"object","required":["manifest"],"title":"SkillFacetProposalRequest","description":"A derived manifest and its inert prose for one import-facet proposal."},"SkillFacetProposalResponse":{"properties":{"taxonomy":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Taxonomy"},"keywords":{"items":{"type":"string"},"type":"array","title":"Keywords"},"tags":{"items":{"type":"string"},"type":"array","title":"Tags"},"integrations":{"items":{"type":"string"},"type":"array","title":"Integrations"}},"type":"object","required":["taxonomy","keywords","tags","integrations"],"title":"SkillFacetProposalResponse","description":"Suggested import facets that a person confirms or edits before saving.\n\nPatricia never applies these suggestions silently. Every empty field is a normal result."},"SkillHealthFinding":{"properties":{"code":{"type":"string","title":"Code"},"severity":{"type":"string","title":"Severity"},"path":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Path"},"line":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Line"},"message":{"type":"string","title":"Message"},"fix":{"type":"string","title":"Fix"}},"type":"object","required":["code","severity","path","line","message","fix"],"title":"SkillHealthFinding","description":"One specific blocker or warning in an editable skill."},"SkillHealthReport":{"properties":{"ok":{"type":"boolean","title":"Ok"},"blocker_count":{"type":"integer","title":"Blocker Count"},"warning_count":{"type":"integer","title":"Warning Count"},"findings":{"items":{"$ref":"#/components/schemas/SkillHealthFinding"},"type":"array","title":"Findings"}},"type":"object","required":["ok","blocker_count","warning_count"],"title":"SkillHealthReport","description":"The health summary and its ordered findings."},"SkillHealthRequest":{"properties":{"manifest_yaml":{"type":"string","title":"Manifest Yaml"},"files":{"items":{"$ref":"#/components/schemas/AuthoredBundleFilePayload"},"type":"array","title":"Files"}},"type":"object","required":["manifest_yaml"],"title":"SkillHealthRequest","description":"Unsaved playground bytes to inspect without persistence."},"SkillListingState":{"type":"string","enum":["unlisted","testing","listed"],"title":"SkillListingState","description":"Who can discover and install a global skill."},"SkillPackInstallResponse":{"properties":{"pack_slug":{"type":"string","title":"Pack Slug","description":"The pack that was installed."},"installed":{"items":{"type":"string"},"type":"array","title":"Installed","description":"Skill slugs now enabled for this workspace: freshly added (paused, awaiting setup), or a default-on member the workspace had switched off, restored in place with its saved config (already configured, already active)."},"already_installed":{"items":{"type":"string"},"type":"array","title":"Already Installed","description":"Skill slugs this workspace already had running. Left exactly as they were."},"missing":{"items":{"type":"string"},"type":"array","title":"Missing","description":"Slugs with nothing to install yet (not released to the catalog)."}},"type":"object","required":["pack_slug"],"title":"SkillPackInstallResponse","description":"What a pack install did: one bucket per outcome, so the dashboard can say what happened."},"SkillPackSummary":{"properties":{"slug":{"type":"string","title":"Slug","description":"The pack's stable kebab-case identity."},"semver":{"type":"string","title":"Semver","description":"The active pack version."},"title":{"type":"string","title":"Title","description":"The pack's display name."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"A one-line pitch for the pack."},"skill_slugs":{"items":{"type":"string"},"type":"array","title":"Skill Slugs","description":"The member skill slugs this pack installs (its dependency closure is added at install)."},"installed":{"type":"boolean","title":"Installed","description":"Whether this workspace has this pack installed (and can therefore uninstall it).","default":false}},"type":"object","required":["slug","semver","title"],"title":"SkillPackSummary","description":"One available skill pack: its identity + the member skill slugs it installs."},"SkillPackUninstallResponse":{"properties":{"pack_slug":{"type":"string","title":"Pack Slug","description":"The pack that was uninstalled."},"removed":{"items":{"type":"string"},"type":"array","title":"Removed","description":"Skill slugs removed from this workspace, with their settings."},"kept_independent":{"items":{"type":"string"},"type":"array","title":"Kept Independent","description":"Kept because this workspace installed them on its own."},"kept_shared":{"items":{"type":"string"},"type":"array","title":"Kept Shared","description":"Kept because another installed pack includes them too."},"kept_dependency":{"items":{"type":"string"},"type":"array","title":"Kept Dependency","description":"Kept because a skill that stays installed needs them."},"kept_builtin_skills":{"items":{"type":"string"},"type":"array","title":"Kept Builtin Skills","description":"Kept because built-in skills cannot be removed."},"missing":{"items":{"type":"string"},"type":"array","title":"Missing","description":"Skill slugs the pack included that this workspace no longer had."}},"type":"object","required":["pack_slug"],"title":"SkillPackUninstallResponse","description":"What a pack uninstall did: what went, and what stayed and why."},"SkillRatingCommentUpdate":{"properties":{"comment":{"type":"string","maxLength":2000,"title":"Comment"}},"additionalProperties":false,"type":"object","required":["comment"],"title":"SkillRatingCommentUpdate","description":"Replace the free-text comment on one actor-owned rating."},"SkillRatingSummary":{"properties":{"rated_count":{"type":"integer","minimum":0.0,"title":"Rated Count"},"rate":{"type":"number","maximum":1.0,"minimum":0.0,"title":"Rate"},"ranking_score":{"anyOf":[{"type":"number","maximum":1.0,"minimum":0.0},{"type":"null"}],"title":"Ranking Score"}},"type":"object","required":["rated_count","rate"],"title":"SkillRatingSummary","description":"A rating rate and the evidence count that gives the rate meaning."},"SkillSurfaceBundle":{"properties":{"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"manifest_version_id":{"type":"string","format":"uuid","title":"Manifest Version Id"},"surfaces":{"items":{"$ref":"#/components/schemas/FeatureSurfaceSummary"},"type":"array","title":"Surfaces"},"read_models":{"items":{"$ref":"#/components/schemas/FeatureReadModelSummary"},"type":"array","title":"Read Models"},"actions":{"items":{"$ref":"#/components/schemas/FeatureActionSummary"},"type":"array","title":"Actions"},"delivery_policy":{"anyOf":[{"$ref":"#/components/schemas/DeliveryPolicySummary"},{"type":"null"}]}},"type":"object","required":["installation_id","manifest_version_id","surfaces","read_models","actions","delivery_policy"],"title":"SkillSurfaceBundle","description":"Everything the Hub needs to render one installation's feature: surfaces + read-models + delivery.\n\nThe dashboard renders each ``surface`` by its ``surface_kind_code`` and binds it to the read-model in\n``read_models`` whose id matches ``surface.feature_read_model_id``. Proves \"no per-skill UI\": the same\nbundle shape renders Celebrations and the generality fixtures alike."},"SkillVersionRatingSummary":{"properties":{"manifest_version_id":{"type":"string","format":"uuid","title":"Manifest Version Id"},"semver":{"type":"string","title":"Semver"},"rating":{"anyOf":[{"$ref":"#/components/schemas/SkillRatingSummary"},{"type":"null"}]}},"type":"object","required":["manifest_version_id","semver"],"title":"SkillVersionRatingSummary","description":"One immutable manifest version and the rating this caller may see."},"SkillVisibility":{"type":"string","enum":["team","personal"],"title":"SkillVisibility","description":"Who, within a tenant, an installed skill is visible to (``skill_installation.visibility_code``).\n\nThe skill-side counterpart of ``IntegrationVisibility``: ``TEAM`` is any actor in the tenant,\n``PERSONAL`` is only the actor who installed it (``owner_actor_id``). A TEAM install is safe to\nsurface in the shared, per-tenant prompt cache; a PERSONAL install is surfaced only through the\nper-run, actor-scoped progressive-disclosure loader (never the shared prompt, which would leak it\nacross actors)."},"SlackChannelJoinRequest":{"properties":{"channel_ids":{"items":{"type":"string"},"type":"array","maxItems":200,"minItems":1,"title":"Channel Ids"}},"type":"object","required":["channel_ids"],"title":"SlackChannelJoinRequest","description":"Public Slack channel ids Patricia should join in this request."},"SlackChannelJoinResponse":{"properties":{"joined":{"items":{"type":"string"},"type":"array","title":"Joined","description":"Patricia is in these channels, including ones she was already in."},"skipped":{"items":{"type":"string"},"type":"array","title":"Skipped","description":"A person must clear an archived, private, or workspace-policy blocker for these channels."},"failed":{"items":{"type":"string"},"type":"array","title":"Failed","description":"Slack did not answer for these channels in time, so trying again may work."},"queued":{"items":{"type":"string"},"type":"array","title":"Queued","description":"Patricia is joining these in the background right now."}},"type":"object","required":["joined","skipped","failed","queued"],"title":"SlackChannelJoinResponse","description":"Per-channel outcomes from an interactive Slack join request."},"SlackInstallUrlRequest":{"properties":{"return_path":{"type":"string","maxLength":2048,"title":"Return Path","description":"App-relative dashboard path to return to after the Slack consent screen.","default":""}},"type":"object","title":"SlackInstallUrlRequest","description":"Optional body for the install-URL mint: where to return after Slack's consent screen."},"SlackInstallUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Slack authorize URL carrying the HMAC-signed, short-TTL state."}},"type":"object","required":["url"],"title":"SlackInstallUrlResponse","description":"The Slack authorize URL the browser is handed off to."},"SlackJoinableChannelsResponse":{"properties":{"connected":{"type":"boolean","title":"Connected","description":"True when the tenant has an active Slack install to read from."},"workspace_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Workspace Name","description":"The Slack workspace's name, or null when it is not known."},"channels":{"items":{"$ref":"#/components/schemas/JoinableChannel"},"type":"array","title":"Channels","description":"Joinable channels in display order: #general first, then by member count, then name."},"total_public":{"type":"integer","title":"Total Public","description":"Every public channel in the workspace, joined or not."},"total_joinable":{"type":"integer","title":"Total Joinable","description":"Public channels Patricia has not joined yet."},"already_joined_count":{"type":"integer","title":"Already Joined Count","description":"Public channels Patricia is already in."},"max_per_join":{"type":"integer","title":"Max Per Join","description":"The most channels one join request can submit at a time."}},"type":"object","required":["connected","workspace_name","channels","total_public","total_joinable","already_joined_count","max_per_join"],"title":"SlackJoinableChannelsResponse","description":"The public Slack channels Patricia can still join, and the counts the picker screen needs."},"SlackPreviewChannelList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SlackPreviewChannelRow"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"},"truncated":{"type":"boolean","title":"Truncated","description":"True when this is not every channel a preview could go to: one page of Slack's list is read and the offerable rows are capped. The console says so and keeps the typed channel-id box reachable, because a silently short list reads as 'Patricia is not in that channel'."}},"type":"object","required":["items","count","truncated"],"title":"SlackPreviewChannelList"},"SlackPreviewChannelRow":{"properties":{"id":{"type":"string","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"SlackPreviewChannelRow"},"SlackPreviewFrameOut":{"properties":{"fallback_text":{"type":"string","title":"Fallback Text","description":"The notification line, and for a text entry the whole message."},"lines":{"items":{"type":"string"},"type":"array","title":"Lines","description":"The words a reader sees, in reading order. Not a Slack layout."},"buttons":{"items":{"type":"string"},"type":"array","title":"Buttons","description":"Every control the message carries, by label. Inert in a preview."},"blocks":{"anyOf":[{"items":{"additionalProperties":true,"type":"object"},"type":"array"},{"type":"null"}],"title":"Blocks"},"view":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"View"}},"type":"object","required":["fallback_text","lines","buttons"],"title":"SlackPreviewFrameOut","description":"One rendered message of an entry: what it says, what it offers, and its raw Block Kit."},"SlackPreviewMessageList":{"properties":{"items":{"items":{"$ref":"#/components/schemas/SlackPreviewMessageRow"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"},"sendable_count":{"type":"integer","title":"Sendable Count"},"groups":{"items":{"type":"string"},"type":"array","title":"Groups","description":"Catalog group order, so the picker groups without inventing an order."},"send_available":{"type":"boolean","title":"Send Available","description":"False when no ACTIVE Slack install resolves for the allowlisted workspace, so the console can say sending is unavailable instead of offering a button that always fails."},"workspace_name":{"type":"string","title":"Workspace Name","description":"The one workspace a preview can ever be posted into."}},"type":"object","required":["items","count","sendable_count","groups","send_available","workspace_name"],"title":"SlackPreviewMessageList","description":"The whole catalog plus whether this environment can send at all."},"SlackPreviewMessageRow":{"properties":{"id":{"type":"string","title":"Id"},"group":{"type":"string","title":"Group"},"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","title":"Kind"},"sendable":{"type":"boolean","title":"Sendable","description":"False for a message production only ever writes over an earlier card."},"note":{"type":"string","title":"Note","description":"What the dummy data stands for, or why the entry is never posted on its own."}},"type":"object","required":["id","group","name","label","kind","sendable","note"],"title":"SlackPreviewMessageRow","description":"One catalog entry, as the console needs to list and explain it."},"SlackPreviewRender":{"properties":{"id":{"type":"string","title":"Id"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","title":"Kind"},"sendable":{"type":"boolean","title":"Sendable"},"note":{"type":"string","title":"Note"},"frames":{"items":{"$ref":"#/components/schemas/SlackPreviewFrameOut"},"type":"array","title":"Frames"}},"type":"object","required":["id","label","kind","sendable","note","frames"],"title":"SlackPreviewRender","description":"One catalog entry, built from its dummy data and rendered."},"SlackPreviewSendRequest":{"properties":{"message_id":{"type":"string","maxLength":100,"minLength":1,"title":"Message Id"},"channel_id":{"type":"string","maxLength":32,"minLength":1,"title":"Channel Id"}},"additionalProperties":false,"type":"object","required":["message_id","channel_id"],"title":"SlackPreviewSendRequest","description":"What a send may say, and nothing else.\n\n``extra=\"forbid\"`` is load-bearing rather than tidy. A ``workspace_id``, ``team_id``,\n``tenant_id`` or token field would be a 422 here; silently ignored, it would read to a caller\nlike a destination they had chosen."},"SlackPreviewSendResult":{"properties":{"message_id":{"type":"string","title":"Message Id"},"label":{"type":"string","title":"Label"},"workspace_id":{"type":"string","title":"Workspace Id"},"channel_id":{"type":"string","title":"Channel Id"},"channel_name":{"type":"string","title":"Channel Name"},"bot_user_id":{"type":"string","title":"Bot User Id"},"requested_by":{"type":"string","title":"Requested By"},"timestamps":{"items":{"type":"string"},"type":"array","title":"Timestamps","description":"One per posted message, the preview header first."}},"type":"object","required":["message_id","label","workspace_id","channel_id","channel_name","bot_user_id","requested_by","timestamps"],"title":"SlackPreviewSendResult","description":"The server's receipt: where it landed, as whom, and every message it posted."},"SlackStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected","description":"True when an ACTIVE Slack platform installation exists for the tenant."},"platform_tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Tenant Id","description":"The Slack workspace (team) id, or null when there is no live install."},"platform_bot_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Bot User Id","description":"Patricia's own Slack user id, used to open the direct message with her. Null when there is no live install, and also null for an older install recorded before the id was stored."}},"type":"object","required":["connected","platform_tenant_id","platform_bot_user_id"],"title":"SlackStatusResponse","description":"Whether this tenant has a live Slack install, plus the ids to deep-link into it."},"SolicitFactRequest":{"properties":{"domain_key":{"type":"string","title":"Domain Key","description":"The bound canonical fact to solicit, e.g. person.birthday."},"entity_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":500,"title":"Entity Ids","description":"The SELECTED subject actor ids to notify (explicit; empty = no-op, never a blast)."}},"type":"object","required":["domain_key"],"title":"SolicitFactRequest","description":"Notify SELECTED members to submit their OWN bound fact (the ``solicit_fact`` action).\n\nAdmin-triggered, selected-members-only: ``entity_ids`` is an EXPLICIT list of subject actor ids.\nThere is no \"notify everyone\" path, and an empty list is a no-op (never an unsolicited blast). The\nfact must be bound by the installation and accept ``self`` submission (fail-closed otherwise)."},"SolicitationResponse":{"properties":{"installation_id":{"type":"string","format":"uuid","title":"Installation Id"},"domain_key":{"type":"string","title":"Domain Key"},"live_send":{"type":"boolean","title":"Live Send"},"targets":{"items":{"$ref":"#/components/schemas/SolicitationTargetSummary"},"type":"array","title":"Targets"}},"type":"object","required":["installation_id","domain_key","live_send","targets"],"title":"SolicitationResponse","description":"The result of a fact solicitation: whether it sent live + the per-target outcomes (no PII)."},"SolicitationTargetSummary":{"properties":{"entity_id":{"type":"string","format":"uuid","title":"Entity Id"},"status":{"type":"string","enum":["would_notify","notified","skipped","failed","unknown"],"title":"Status"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"}},"type":"object","required":["entity_id","status"],"title":"SolicitationTargetSummary","description":"One target's solicitation outcome (ids + a stable status only, no PII)."},"SpendingLimitsResponse":{"properties":{"monthly_cap":{"$ref":"#/components/schemas/MonthlyCapView"},"groups":{"items":{"$ref":"#/components/schemas/GroupLimitView"},"type":"array","title":"Groups"},"over_budget":{"$ref":"#/components/schemas/OverBudgetView"},"using_recommended":{"type":"boolean","title":"Using Recommended"}},"type":"object","required":["monthly_cap","groups","over_budget","using_recommended"],"title":"SpendingLimitsResponse","description":"Effective spending limits for the caller's workspace (policy default + override)."},"SpendingLimitsUpdate":{"properties":{"monthly_cap_dollars":{"anyOf":[{"type":"number","maximum":100000.0,"minimum":10.0},{"type":"null"}],"title":"Monthly Cap Dollars","description":"The optional monthly spending cap in dollars. Amounts are in US dollars of usage cost. Usage cost is Patricia's measure of what your work costs to run, not what you paid for your credits."},"groups":{"anyOf":[{"additionalProperties":{"type":"number"},"type":"object"},{"type":"null"}],"title":"Groups","description":"Per-run dollar limits by group: conversations, scheduled_tasks, proactive_replies, and background_work. Amounts are in US dollars of usage cost. Usage cost is Patricia's measure of what your work costs to run, not what you paid for your credits."},"over_budget_behavior":{"anyOf":[{"type":"string","enum":["warn","stop"]},{"type":"null"}],"title":"Over Budget Behavior","description":"What happens when a single run reaches its per-run limit: 'warn' keeps going and tells the owner what it cost (the default; a safety stop still ends any run that reaches four times its limit, or the workspace's remaining spend headroom if that is lower); 'stop' stops the task at the limit. Omitted or null leaves the workspace's current behaviour unchanged."},"reset_to_recommended":{"type":"boolean","title":"Reset To Recommended","default":false}},"additionalProperties":false,"type":"object","title":"SpendingLimitsUpdate","description":"PATCH body: every field optional; only what's provided is written.\n\n``groups`` maps a group key (``conversations`` / ``scheduled_tasks`` /\n``proactive_replies`` / ``background_work``) to a per-run dollar limit that is\nfanned out to every trigger in that group. ``reset_to_recommended`` clears all\noverrides and cannot be combined with an explicit value."},"StaffUserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"is_internal":{"type":"boolean","title":"Is Internal"},"created_at":{"type":"string","format":"date-time","title":"Created At"}},"type":"object","required":["id","email","first_name","last_name","is_internal","created_at"],"title":"StaffUserResponse"},"StatCardSummary":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"value":{"type":"string","title":"Value"},"hint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Hint"}},"type":"object","required":["key","label","value","hint"],"title":"StatCardSummary","description":"One KPI tile on the ``stat_cards`` surface: a label, a value, an optional hint (no PII).\n\nGeneric: the tiles are computed from the installation's bound facts (team size, per-fact coverage,\nnext upcoming), so Celebrations renders \"Birthdays on file / Work anniversaries on file\" and a\nnon-person skill renders its own fact labels through the SAME shape."},"StatsCompare":{"type":"string","enum":["previous","same_last_month","same_last_year"],"title":"StatsCompare","description":"Prior-window selector that populates ``previous_totals`` for period-over-period deltas."},"StatsGranularity":{"type":"string","enum":["day","week","month"],"title":"StatsGranularity","description":"Timeline bucket size. Each bucket's ``date`` is its truncated UTC start\n(``week`` → Monday, ``month`` → the 1st)."},"StreamState":{"type":"string","enum":["complete","partial","masked","unavailable","not_applicable"]},"StuckIngressEvent":{"properties":{"id":{"type":"string","title":"Id"},"platform_code":{"type":"string","title":"Platform Code"},"event_id":{"type":"string","title":"Event Id"},"platform_tenant_id":{"type":"string","title":"Platform Tenant Id"},"received_at":{"type":"string","format":"date-time","title":"Received At"},"redrive_count":{"type":"integer","title":"Redrive Count"},"last_enqueued_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Enqueued At"},"fallback_sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Fallback Sent At"},"assigned_run_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Assigned Run Id"},"assigned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Assigned At"},"parked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Parked At"},"park_count":{"type":"integer","title":"Park Count"},"last_failure_class":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Failure Class"},"refetch_outcome":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Refetch Outcome"},"parked_outage_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Parked Outage Id"},"next_attempt_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Attempt At"},"conversation_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Conversation Id"},"redrive_claimed":{"type":"boolean","title":"Redrive Claimed"}},"type":"object","required":["id","platform_code","event_id","platform_tenant_id","received_at","redrive_count","last_enqueued_at","fallback_sent_at","assigned_run_id","assigned_at","parked_at","park_count","last_failure_class","refetch_outcome","parked_outage_id","next_attempt_at","conversation_id","redrive_claimed"],"title":"StuckIngressEvent","description":"Content-free recovery metadata for one open ingress event."},"StuckIngressResult":{"properties":{"items":{"items":{"$ref":"#/components/schemas/StuckIngressEvent"},"type":"array","title":"Items"},"count":{"type":"integer","title":"Count"}},"type":"object","required":["items","count"],"title":"StuckIngressResult","description":"Bounded content-free stuck ingress report."},"SubmitOwnFactRequest":{"properties":{"domain_key":{"type":"string","title":"Domain Key","description":"The canonical fact key, e.g. person.birthday / person.work_anniversary."},"month":{"anyOf":[{"type":"integer","maximum":12.0,"minimum":1.0},{"type":"null"}],"title":"Month","description":"Birthday month (1–12); no year is collected."},"day":{"anyOf":[{"type":"integer","maximum":31.0,"minimum":1.0},{"type":"null"}],"title":"Day","description":"Birthday day (1–31)."},"on":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"On","description":"Work-anniversary date (ISO). Only month/day recur."},"effective_tz":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Effective Tz","description":"IANA tz for this subject (optional)."}},"type":"object","required":["domain_key"],"title":"SubmitOwnFactRequest","description":"Submit the CALLER's own fact (employee self-submission). NO ``entity_id``: the subject is always\nthe caller's own actor (resolved server-side from the verified JWT email), so a member can never\ntarget another person."},"SupportCaseIn":{"properties":{"candidate_user_id":{"type":"string","format":"uuid","title":"Candidate User Id"},"target_tenant_id":{"type":"string","format":"uuid","title":"Target Tenant Id"},"reason_code":{"$ref":"#/components/schemas/IdentityBindingCaseReason"},"issuer":{"type":"string","maxLength":255,"minLength":1,"title":"Issuer"},"subject":{"type":"string","maxLength":512,"minLength":1,"title":"Subject"},"subject_scope":{"type":"string","maxLength":512,"title":"Subject Scope"},"justification":{"type":"string","maxLength":2000,"minLength":1,"title":"Justification"}},"additionalProperties":false,"type":"object","required":["candidate_user_id","target_tenant_id","reason_code","issuer","subject","subject_scope","justification"],"title":"SupportCaseIn","description":"A staff-opened case names its candidate and exact subject."},"SyncQueuedResponse":{"properties":{"status":{"type":"string","title":"Status"},"account":{"type":"string","format":"uuid","title":"Account"}},"type":"object","required":["status","account"],"title":"SyncQueuedResponse"},"SyncResponse":{"properties":{"status":{"type":"string","title":"Status"},"account":{"type":"string","format":"uuid","title":"Account"},"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"Broker task id for the queued sync, for tracing its worker logs."}},"type":"object","required":["status","account"],"title":"SyncResponse","description":"Receipt for a queued tool-catalog sync. ``queued`` is only ever returned once the broker took it."},"SyncResultResponse":{"properties":{"added":{"type":"integer","title":"Added"},"updated":{"type":"integer","title":"Updated"},"deactivated":{"type":"integer","title":"Deactivated"},"excluded":{"type":"integer","title":"Excluded","default":0},"policy_deactivated":{"type":"integer","title":"Policy Deactivated","default":0},"adopted":{"type":"integer","title":"Adopted","default":0},"teams_outcome":{"$ref":"#/components/schemas/TeamsSyncOutcome","default":"failed"},"teams_unattested":{"type":"integer","title":"Teams Unattested","default":0},"teams_foreign_tenant_refused":{"type":"integer","title":"Teams Foreign Tenant Refused","default":0}},"type":"object","required":["added","updated","deactivated"],"title":"SyncResultResponse","description":"Counters returned from a roster sync run.\n\n``excluded`` is how many members were skipped this run by the roster policy (e.g. guests\nwhen guests are off); ``policy_deactivated`` is how many previously-synced members the policy now\nexcludes were deactivated.\n\n``teams_outcome`` says what the Teams half DID, which the counters cannot. All four of \"no Teams\ninstall\", \"installed but no Entra group bound\", \"read the roster and nobody changed\" and \"the\nrun raised\" produce the same zeros, and only the second is a fault the admin can act on: the\nteam owner reinstalls so resource-specific consent binds the group id. A caller that reads only\nthe counters cannot tell those apart, which is how an install stays broken without anybody\nnoticing."},"TaskDeclaration":{"properties":{"purpose":{"type":"string","maxLength":300,"minLength":1,"title":"Purpose","description":"One plain sentence."},"deliverables":{"items":{"type":"string","maxLength":200,"minLength":1},"type":"array","maxItems":10,"title":"Deliverables","description":"Short plain phrases."},"lines":{"items":{"$ref":"#/components/schemas/DeclaredLine"},"type":"array","minItems":1,"title":"Lines","description":"In order; repeat entries for repeats."}},"additionalProperties":false,"type":"object","required":["purpose","lines"],"title":"TaskDeclaration"},"TaskOfferSelection":{"properties":{"offer_request_id":{"type":"string","format":"uuid","title":"Offer Request Id"},"choice":{"type":"string","enum":["all","chosen","none"],"title":"Choice"},"chosen_line_keys":{"items":{"type":"string"},"type":"array","title":"Chosen Line Keys","default":[]},"offer_digest":{"type":"string","minLength":1,"title":"Offer Digest"},"private_review_tokens":{"anyOf":[{"additionalProperties":{"type":"string"},"type":"object"},{"type":"null"}],"title":"Private Review Tokens"}},"additionalProperties":false,"type":"object","required":["offer_request_id","choice","offer_digest"],"title":"TaskOfferSelection","description":"One answer to one frozen offer.\n\nThe ``all`` choice excludes recipient-pinned lines.\n``all`` and ``none`` carry no chosen keys; ``chosen`` carries at least one key and no key twice."},"TaskPrivateDetailResponse":{"properties":{"offer_request_id":{"type":"string","format":"uuid","title":"Offer Request Id"},"offer_digest":{"type":"string","title":"Offer Digest"},"destinations":{"additionalProperties":{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},"type":"object","title":"Destinations"},"fixed_senders":{"additionalProperties":{"additionalProperties":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"object"},"type":"object","title":"Fixed Senders"},"review_key":{"type":"string","title":"Review Key"}},"type":"object","required":["offer_request_id","offer_digest","destinations","fixed_senders","review_key"],"title":"TaskPrivateDetailResponse"},"TaskPrivateReviewAcknowledgement":{"properties":{"offer_digest":{"type":"string","minLength":1,"title":"Offer Digest"},"review_key":{"type":"string","minLength":1,"title":"Review Key"}},"type":"object","required":["offer_digest","review_key"],"title":"TaskPrivateReviewAcknowledgement"},"TaskPrivateReviewResponse":{"properties":{"offer_request_id":{"type":"string","format":"uuid","title":"Offer Request Id"},"offer_digest":{"type":"string","title":"Offer Digest"},"destinations":{"additionalProperties":{"items":{"items":{"type":"string"},"type":"array"},"type":"array"},"type":"object","title":"Destinations"},"private_review_tokens":{"additionalProperties":{"type":"string"},"type":"object","title":"Private Review Tokens"}},"type":"object","required":["offer_request_id","offer_digest","destinations","private_review_tokens"],"title":"TaskPrivateReviewResponse"},"TaxonomyNode":{"properties":{"path":{"type":"string","title":"Path"},"label":{"type":"string","title":"Label"},"depth":{"type":"integer","title":"Depth"}},"type":"object","required":["path","label","depth"],"title":"TaxonomyNode","description":"One node of the skill taxonomy: where it sits, what to call it, and how deep it is.\n\nThe console needs the tree to draw its browse rail, and it cannot derive the ORDER: the shipped\ntree runs Marketing, Sales, Strategy, Reporting, Documents, Operations, Setup and Context, Other,\nwhich is\nneither alphabetical nor anything a client could reproduce without holding a second copy of\n``taxonomy.yaml``. So the server publishes the order and the client renders it.\n\n``label`` and ``depth`` are derived from ``path`` and published anyway. Deriving them means\nsplitting on the separator, and the separator is exactly the kind of detail that gets a client\nwritten against ``/`` and then broken the day a node is renamed. One rule, one owner."},"TeamIntroductionExclusion":{"type":"string","enum":["already_met","already_queued","no_chat_dm","attempts_exhausted","guest_excluded","guest_unverified"],"title":"TeamIntroductionExclusion","description":"Why one teammate is listed but cannot be picked."},"TeamIntroductionItem":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"chat_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Chat User Id"},"slack_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slack User Id","deprecated":true},"display_name":{"type":"string","title":"Display Name"},"handle":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Handle"},"role_code":{"type":"string","title":"Role Code"},"eligible":{"type":"boolean","title":"Eligible"},"excluded_reason":{"anyOf":[{"$ref":"#/components/schemas/TeamIntroductionExclusion"},{"type":"null"}]}},"type":"object","required":["membership_id","chat_user_id","slack_user_id","display_name","handle","role_code","eligible","excluded_reason"],"title":"TeamIntroductionItem","description":"One teammate, and whether Patricia may be introduced to them."},"TeamIntroductionListResponse":{"properties":{"roster_state":{"$ref":"#/components/schemas/RosterState"},"can_introduce":{"type":"boolean","title":"Can Introduce"},"blocked_reason":{"anyOf":[{"$ref":"#/components/schemas/IntroductionBlockedReason"},{"type":"null"}]},"roster_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Roster Synced At"},"refresh_recommended":{"type":"boolean","title":"Refresh Recommended"},"teammate_count":{"type":"integer","title":"Teammate Count"},"truncated":{"type":"boolean","title":"Truncated"},"items":{"items":{"$ref":"#/components/schemas/TeamIntroductionItem"},"type":"array","title":"Items"}},"type":"object","required":["roster_state","can_introduce","blocked_reason","roster_synced_at","refresh_recommended","teammate_count","truncated","items"],"title":"TeamIntroductionListResponse","description":"The roster, its freshness, and whether the primary action may fire at all."},"TeamIntroductionOutcome":{"type":"string","enum":["queued","already_met","already_queued","no_chat_dm","actor_changed","guest_excluded","guest_unverified","attempts_exhausted","member_deactivated"],"title":"TeamIntroductionOutcome","description":"The result of one requested introduction."},"TeamIntroductionRequest":{"properties":{"selections":{"items":{"$ref":"#/components/schemas/TeamIntroductionSelection"},"type":"array","maxItems":100,"minItems":1,"title":"Selections"}},"type":"object","required":["selections"],"title":"TeamIntroductionRequest","description":"The exact teammates the caller selected."},"TeamIntroductionResult":{"properties":{"requested":{"type":"integer","title":"Requested"},"sent":{"type":"integer","title":"Sent"},"skipped":{"type":"integer","title":"Skipped"},"results":{"items":{"$ref":"#/components/schemas/TeamIntroductionResultItem"},"type":"array","title":"Results"}},"type":"object","required":["requested","sent","skipped","results"],"title":"TeamIntroductionResult","description":"The authorized and refused counts for the explicit selection."},"TeamIntroductionResultItem":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"outcome":{"$ref":"#/components/schemas/TeamIntroductionOutcome"}},"type":"object","required":["membership_id","outcome"],"title":"TeamIntroductionResultItem","description":"The result for one selected teammate."},"TeamIntroductionSelection":{"properties":{"membership_id":{"type":"string","format":"uuid","title":"Membership Id"},"chat_user_id":{"type":"string","minLength":1,"title":"Chat User Id"}},"type":"object","required":["membership_id","chat_user_id"],"title":"TeamIntroductionSelection","description":"One teammate and the chat identity shown by the picker."},"TeamQuality":{"properties":{"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name","description":"Null when the workspace record could not be resolved."},"scored":{"type":"integer","title":"Scored"},"dimension_averages":{"additionalProperties":{"type":"number"},"type":"object","title":"Dimension Averages"},"band_counts":{"additionalProperties":{"type":"integer"},"type":"object","title":"Band Counts"}},"type":"object","required":["tenant_id","scored","dimension_averages","band_counts"],"title":"TeamQuality","description":"One workspace's quality over the window.\n\n``scored`` is served beside every mean so a two-reply workspace can never be read as a\nranking against a two-thousand-reply one."},"TeamRequestItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"title":{"type":"string","title":"Title","description":"Privacy-validated triage title when sanitized public-copy provenance exists; otherwise a neutral kind-based label."},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description","description":"Deterministically sanitized public description written at triage time; null when unavailable."},"kind":{"type":"string","enum":["bug","feature"],"title":"Kind"},"status":{"$ref":"#/components/schemas/PublicRequestStatus"},"linear_status":{"anyOf":[{"$ref":"#/components/schemas/PublicLinearStatus"},{"type":"null"}],"description":"Mirrored Linear workflow status; null until a known state has been synchronized."},"created_at":{"type":"string","format":"date-time","title":"Created At","description":"UTC submission time; the dashboard renders it in the viewer's local time."}},"additionalProperties":false,"type":"object","required":["id","title","description","kind","status","linear_status","created_at"],"title":"TeamRequestItem","description":"One sanitized, read-only request submitted by the caller's team."},"TeamRequestListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TeamRequestItem"},"type":"array","title":"Items"}},"additionalProperties":false,"type":"object","required":["items"],"title":"TeamRequestListResponse","description":"The sanitized request list for one tenant."},"TeamsInstallUrlRequest":{"properties":{"return_path":{"type":"string","maxLength":2048,"title":"Return Path","description":"App-relative dashboard path to return to after the Microsoft consent screen. Only an exact allowlisted destination is honoured; anything else lands on workspace settings.","default":""}},"type":"object","title":"TeamsInstallUrlRequest","description":"Optional body for the install-URL mint: where to return after Microsoft's consent screen."},"TeamsInstallUrlResponse":{"properties":{"url":{"type":"string","title":"Url","description":"Microsoft admin-consent URL carrying the signed tenant state."}},"type":"object","required":["url"],"title":"TeamsInstallUrlResponse","description":"The Microsoft admin-consent URL for this Patricia tenant."},"TeamsStatusResponse":{"properties":{"connected":{"type":"boolean","title":"Connected","description":"True when consent exists and Patricia can reply in Teams."},"teams_configured":{"type":"boolean","title":"Teams Configured","description":"True when this deployment has the Microsoft application credentials required for Teams."},"consent_granted":{"type":"boolean","title":"Consent Granted","description":"True when an ACTIVE Teams platform installation exists."},"app_reachable":{"type":"boolean","title":"App Reachable","description":"True when an allowed Bot Connector service URL is known for the Microsoft workspace."},"slot_held":{"type":"boolean","title":"Slot Held","description":"True when the tenant cannot connect a different Microsoft workspace."},"platform_tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Tenant Id","description":"The Microsoft Entra tenant ID for the active installation, or null."},"app_install_deep_link":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Install Deep Link","description":"The Teams custom-app install link, or null when Teams is not configured."}},"type":"object","required":["connected","teams_configured","consent_granted","app_reachable","slot_held","platform_tenant_id","app_install_deep_link"],"title":"TeamsStatusResponse","description":"The consent, app reachability, and workspace-slot state for Microsoft Teams."},"TeamsSyncOutcome":{"type":"string","enum":["not_installed","not_configured","synced","failed"],"title":"TeamsSyncOutcome","description":"What one Teams roster sync DID, which zero counters cannot say on their own.\n\nFour states because the world has four, and collapsing them is how the p0 tenant stayed broken\nin silence: a workspace with no Teams install, one whose team was never bound, and one whose\nteam is bound and simply has nobody new all return the same zeros. Only the second is a fault,\nand its remedy is specific — the team owner reinstalls so resource-specific consent binds the\nEntra group id — so it has to be tellable from the other two by the admin who clicks Sync."},"TenantAutoApproveBody":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"Allow eligible standing grants in this workspace. Disabling invalidates existing grants."},"allowlist":{"items":{"type":"string"},"type":"array","title":"Allowlist","description":"The canonical tool references eligible for standing grants, subject to every runtime approval guard."},"bump_epoch":{"type":"boolean","title":"Bump Epoch","default":false}},"additionalProperties":false,"type":"object","required":["enabled"],"title":"TenantAutoApproveBody","description":"Admin request body to set the tenant master switch + allowlist. ``bump_epoch`` is the kill switch."},"TenantAutoApproveResponse":{"properties":{"enabled":{"type":"boolean","title":"Enabled"},"epoch":{"type":"integer","title":"Epoch"},"allowlist":{"items":{"type":"string"},"type":"array","title":"Allowlist"},"floor_tiers":{"items":{"$ref":"#/components/schemas/RiskTier"},"type":"array","title":"Floor Tiers"}},"type":"object","required":["enabled","epoch","allowlist","floor_tiers"],"title":"TenantAutoApproveResponse","description":"The tenant's effective auto-approve controls (admin view)."},"TenantStatus":{"type":"string","enum":["active","suspended","cancelled"],"title":"TenantStatus"},"TenantStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"TenantStatusRefReferenceFullValidator"},"TenantSummary":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"status_code":{"type":"string","title":"Status Code"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed","default":false}},"type":"object","required":["id","display_name","status_code"],"title":"TenantSummary","description":"Lightweight tenant (workspace) summary for membership context."},"ThinkingOption":{"properties":{"value":{"type":"string","title":"Value"},"label":{"type":"string","title":"Label"},"description":{"type":"string","title":"Description"}},"type":"object","required":["value","label","description"],"title":"ThinkingOption","description":"One thinking level a specific model can actually be run at."},"TierDecision":{"type":"string","enum":["always_allow","always_ask"],"title":"TierDecision","description":"A member's explicit choice for one of the three approvals groups (Read / Write / Critical)\non ``/settings/permissions``: exactly two outcomes, because nothing chosen on THIS surface can\nwaive a CRITICAL action (``models.approval_policy.FLOOR_TIERS``), so a third option would offer a\nchoice with no effect. The Critical row here stays a static summary for that reason.\n\nA per-tool integration consent can waive one Critical action on one connection, and it is a\nseparate lane with its own confirmation — not an outcome of this setting."},"TimelineKind":{"type":"string","enum":["tool_call","message","permission_request","artifact","journal_step"]},"TokenResponse":{"properties":{"access_token":{"type":"string","title":"Access Token"},"refresh_token":{"type":"string","title":"Refresh Token"},"token_type":{"type":"string","title":"Token Type","default":"bearer"},"expires_in":{"type":"integer","title":"Expires In"},"landing_hint":{"anyOf":[{"$ref":"#/components/schemas/LandingHint"},{"type":"null"}]},"decision_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Decision Key"}},"type":"object","required":["access_token","refresh_token","expires_in"],"title":"TokenResponse","description":"Access + refresh token pair. ``expires_in`` is the access-token lifetime (seconds)."},"ToolCallStatusRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ToolCallStatusRefReferenceFullValidator"},"ToolKind":{"type":"string","enum":["native","sandbox","integration","custom","mcp"],"title":"ToolKind"},"ToolKindRefReferenceFullValidator":{"properties":{"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"sort_order":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Sort Order"}},"type":"object","title":"ToolKindRefReferenceFullValidator"},"ToolOverrideBatchGrantItem":{"properties":{"tool_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Ref"},"consent_token":{"type":"string","title":"Consent Token"}},"type":"object","required":["tool_ref","consent_token"],"title":"ToolOverrideBatchGrantItem","description":"One item of a grant batch — the same ``(tool_ref, consent_token)`` pair a single mint takes."},"ToolOverrideBatchGrantItemResult":{"properties":{"tool_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Ref"},"override":{"anyOf":[{"$ref":"#/components/schemas/ToolOverrideResponse"},{"type":"null"}]},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"},"message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message"}},"type":"object","required":["tool_ref"],"title":"ToolOverrideBatchGrantItemResult","description":"One item's outcome. ``override`` is set exactly when ``code`` is not — never both, never neither."},"ToolOverrideBatchGrantRequest":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolOverrideBatchGrantItem"},"type":"array","maxItems":5000,"minItems":1,"title":"Items"}},"type":"object","required":["items"],"title":"ToolOverrideBatchGrantRequest"},"ToolOverrideBatchGrantResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolOverrideBatchGrantItemResult"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ToolOverrideBatchGrantResponse"},"ToolOverrideBatchRevokeItemResult":{"properties":{"override_id":{"type":"string","format":"uuid","title":"Override Id"},"revoked":{"type":"boolean","title":"Revoked"}},"type":"object","required":["override_id","revoked"],"title":"ToolOverrideBatchRevokeItemResult"},"ToolOverrideBatchRevokeRequest":{"properties":{"override_ids":{"items":{"type":"string","format":"uuid"},"type":"array","maxItems":5000,"minItems":1,"title":"Override Ids"}},"type":"object","required":["override_ids"],"title":"ToolOverrideBatchRevokeRequest"},"ToolOverrideBatchRevokeResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolOverrideBatchRevokeItemResult"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ToolOverrideBatchRevokeResponse"},"ToolOverrideCreateRequest":{"properties":{"tool_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Ref"},"consent_token":{"type":"string","title":"Consent Token"}},"type":"object","required":["tool_ref","consent_token"],"title":"ToolOverrideCreateRequest","description":"The confirm dialog's payload.\n\n``tool_ref`` is REQUIRED but NULLABLE, matching the account-tools contract which exposes a\ntransient ref-less row as ``tool_ref: null``. A plain required ``str`` would make JSON ``null``\nfail Pydantic validation *before* the service and return a generic ``VALIDATION_ERROR`` instead of\nthe typed ``no_tool_ref`` the acceptance matrix requires — and the refusal has to come AFTER the\naccount-visibility fence, which only the service can do."},"ToolOverrideInventoryItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"integration_account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Integration Account Id"},"tool_ref":{"type":"string","title":"Tool Ref"},"granted_tier":{"type":"string","title":"Granted Tier"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"audience_class":{"$ref":"#/components/schemas/AudienceClass"},"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"account_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Account Label"},"provider":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Provider"},"state":{"$ref":"#/components/schemas/ToolOverrideState"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"audience_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Audience Label"}},"type":"object","required":["id","integration_account_id","tool_ref","granted_tier","created_at","audience_class","display_name","account_label","provider","state","last_used_at","audience_label"],"title":"ToolOverrideInventoryItem","description":"One consent as the settings list shows it: the stored row plus what it means right now.\n\n``state`` is computed per read, never stored, so this list can never say \"running without asking\"\nabout an action the runtime has already gone back to asking about."},"ToolOverrideInventoryResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ToolOverrideInventoryItem"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"ToolOverrideInventoryResponse"},"ToolOverrideResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"integration_account_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Integration Account Id"},"tool_ref":{"type":"string","title":"Tool Ref"},"granted_tier":{"type":"string","title":"Granted Tier"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"audience_class":{"$ref":"#/components/schemas/AudienceClass"}},"type":"object","required":["id","integration_account_id","tool_ref","granted_tier","created_at","audience_class"],"title":"ToolOverrideResponse","description":"One consent row, in the shape a client may see.\n\nDeliberately NOT the ORM row: that carries both account generations and the execution\nfingerprint, which are internal bindings and would hand a client the ingredients of the consent\ntoken it is not supposed to be able to forge."},"ToolOverrideState":{"type":"string","enum":["tool_missing","account_inactive","tool_disabled_on_account","inactive_tenant_master_disabled","inactive_policy_always","floor_blocked","epoch_stale","contract_stale","needs_reconfirmation","active"],"title":"ToolOverrideState","description":"The computed state of a stored override — ONE precedence, FOUR readers.\n\nThe runtime gate, the Tools-tab pill, the settings inventory and dispatch's own revalidation all\nresolve this, so an override can never read \"active\" in the dashboard while the gateway is\nasking. Not a code table: it is derived per read from live state, never persisted.\n\nThe fourth is the one to keep in mind when changing the ordering or a field's meaning: it is not\na display surface. ``gateway._override_live_state_denial`` asks this question again under row\nlocks, and its answer is what authorizes an unattended provider write with no card and no\n``PermissionRequest`` behind it."},"ToolTierGenerationReport":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"True only when no account is stale. Read it with ``checked``."},"generation":{"type":"string","title":"Generation","description":"The classifier generation the running image stamps."},"checked":{"type":"integer","title":"Checked","description":"ACTIVE accounts scanned. ``ok: true`` with 0 verifies nothing."},"visited":{"type":"integer","title":"Visited","description":"Accounts whose every enabled row carries the current generation."},"stale":{"type":"integer","title":"Stale","description":"Accounts with at least one row at another generation, or none."},"empty":{"type":"integer","title":"Empty","description":"Accounts with no enabled tool rows at all. Reported, never a failure."},"stale_accounts":{"items":{"$ref":"#/components/schemas/ToolTierStaleAccount"},"type":"array","title":"Stale Accounts","description":"A capped sample of the stale accounts, for diagnosis."},"stale_accounts_truncated":{"type":"boolean","title":"Stale Accounts Truncated","description":"True when more accounts are stale than the sample lists."}},"type":"object","required":["ok","generation","checked","visited","stale","empty","stale_accounts_truncated"],"title":"ToolTierGenerationReport","description":"Whether every ACTIVE Composio account's tool rows carry the running classifier's generation."},"ToolTierResyncResult":{"properties":{"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"Broker task id, for tracing the sweep's logs."}},"type":"object","title":"ToolTierResyncResult","description":"Ack that the fleet Composio tool-tier re-sync was enqueued."},"ToolTierStaleAccount":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"integration_account_id":{"type":"string","title":"Integration Account Id"},"enabled_rows":{"type":"integer","title":"Enabled Rows","description":"Enabled integration tool rows backed by this account."},"rows_at_generation":{"type":"integer","title":"Rows At Generation","description":"How many of them carry the current classifier generation."}},"type":"object","required":["tenant_id","integration_account_id","enabled_rows","rows_at_generation"],"title":"ToolTierStaleAccount","description":"One ACTIVE account whose enabled tool rows were not all tiered by the running classifier."},"TopupTier":{"type":"string","enum":["10k","25k","50k","100k","300k","750k","2m"],"title":"TopupTier","description":"A rung of the 7-tier one-time top-up ladder (plan §1.3).\n\nThe value is the settings suffix (``stripe_price_topup_<value>``) so the API name,\nthe catalog key, and the settings field stay same-same."},"TrashPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TrashedAsset"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total","description":"Restorable files across all pages."},"limit":{"type":"integer","title":"Limit"},"offset":{"type":"integer","title":"Offset"},"retention_days":{"type":"integer","title":"Retention Days","description":"How many days a removed file stays restorable. Server-defined; shown in copy.","default":30}},"additionalProperties":false,"type":"object","required":["items","total","limit","offset"],"title":"TrashPage","description":"One page of the trash plus the TRUE number of restorable files (the AssetPage contract)."},"TrashedAsset":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name","description":"The name the file held when it was removed. UNTRUSTED text: render escaped."},"category":{"type":"string","enum":["document","media","app"],"title":"Category"},"kind":{"type":"string","enum":["app","audio","docx","file","html","image","markdown","pdf","slides","spreadsheet","video"],"title":"Kind"},"content_type":{"type":"string","title":"Content Type"},"byte_size":{"type":"integer","title":"Byte Size"},"deleted_at":{"type":"string","format":"date-time","title":"Deleted At","description":"When the file was moved to the trash (UTC)."},"delete_reason":{"type":"string","title":"Delete Reason","description":"Why it was removed, as whoever removed it wrote it. UNTRUSTED text: render escaped."},"purge_at":{"type":"string","format":"date-time","title":"Purge At","description":"When the file stops being restorable — 30 days after deletion. The trash view's countdown."}},"additionalProperties":false,"type":"object","required":["id","name","category","kind","content_type","byte_size","deleted_at","delete_reason","purge_at"],"title":"TrashedAsset","description":"One file in the trash: what it was, why it went, and when it stops being restorable."},"TriggerCatalogConditionField":{"properties":{"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","title":"Kind"},"choices":{"items":{"type":"string"},"type":"array","title":"Choices"},"example":{"type":"string","title":"Example"}},"type":"object","required":["name","label","kind","choices","example"],"title":"TriggerCatalogConditionField","description":"One reviewed event property offered by the condition builder."},"TriggerCatalogEvent":{"properties":{"source":{"type":"string","title":"Source"},"name":{"type":"string","title":"Name"},"label":{"type":"string","title":"Label"},"default_template":{"type":"string","title":"Default Template"},"filter_field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter Field"},"filter_choices":{"items":{"type":"string"},"type":"array","title":"Filter Choices"},"condition_fields":{"items":{"$ref":"#/components/schemas/TriggerCatalogConditionField"},"type":"array","title":"Condition Fields"}},"type":"object","required":["source","name","label","default_template","filter_field","filter_choices","condition_fields"],"title":"TriggerCatalogEvent","description":"One event offered by the trigger picker."},"TriggerCatalogResponse":{"properties":{"sources":{"items":{"$ref":"#/components/schemas/TriggerCatalogSource"},"type":"array","title":"Sources"},"events":{"items":{"$ref":"#/components/schemas/TriggerCatalogEvent"},"type":"array","title":"Events"}},"type":"object","required":["sources","events"],"title":"TriggerCatalogResponse","description":"The structured source and event catalog."},"TriggerCatalogSource":{"properties":{"code":{"type":"string","title":"Code"},"label":{"type":"string","title":"Label"}},"type":"object","required":["code","label"],"title":"TriggerCatalogSource","description":"One event source offered by the trigger picker."},"TriggerChannel":{"properties":{"external_id":{"type":"string","title":"External Id"},"name":{"type":"string","title":"Name"},"is_private":{"type":"boolean","title":"Is Private"}},"type":"object","required":["external_id","name","is_private"],"title":"TriggerChannel","description":"One verified Slack destination offered by the trigger picker."},"TriggerChannelsResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TriggerChannel"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"TriggerChannelsResponse","description":"The caller's best-effort trigger destinations."},"TriggerConditionInput":{"properties":{"field":{"type":"string","minLength":1,"title":"Field"},"value":{"type":"string","maxLength":60,"title":"Value"}},"type":"object","required":["field","value"],"title":"TriggerConditionInput","description":"One field and value selected in the dashboard condition builder."},"TriggerConditionVerdict":{"properties":{"matched":{"type":"boolean","title":"Matched"},"state":{"type":"string","enum":["no_condition","matched","different","missing"],"title":"State"},"field":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Field"},"label":{"type":"string","title":"Label"},"event_value":{"anyOf":[{},{"type":"null"}],"title":"Event Value"},"wanted_value":{"anyOf":[{},{"type":"null"}],"title":"Wanted Value"}},"type":"object","required":["matched","state","field","label","event_value","wanted_value"],"title":"TriggerConditionVerdict","description":"Why one event matches or does not match the trigger condition."},"TriggerCreateRequest":{"properties":{"source":{"type":"string","minLength":1,"title":"Source"},"event":{"type":"string","minLength":1,"title":"Event"},"channel_external_id":{"type":"string","minLength":1,"title":"Channel External Id"},"action":{"type":"string","enum":["announce","agent"],"title":"Action"},"instruction":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Instruction"},"template":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Template"},"filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"},"conditions":{"anyOf":[{"items":{"$ref":"#/components/schemas/TriggerConditionInput"},"type":"array","maxItems":4},{"type":"null"}],"title":"Conditions"},"replace":{"type":"boolean","title":"Replace","default":false},"declaration":{"anyOf":[{"$ref":"#/components/schemas/CreationDeclaration"},{"type":"null"}]},"status":{"type":"string","enum":["active","stopped"],"title":"Status","default":"active"}},"additionalProperties":false,"type":"object","required":["source","event","channel_external_id","action"],"title":"TriggerCreateRequest","description":"Create or explicitly replace one channel event trigger."},"TriggerCreateResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"action":{"type":"string","enum":["announce","agent"],"title":"Action"},"status":{"type":"string","enum":["active","stopped"],"title":"Status"},"source":{"type":"string","title":"Source"},"source_label":{"type":"string","title":"Source Label"},"source_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Source Connected"},"event":{"type":"string","title":"Event"},"event_label":{"type":"string","title":"Event Label"},"narrowing":{"items":{"$ref":"#/components/schemas/TriggerNarrowing"},"type":"array","title":"Narrowing"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction"},"template":{"type":"string","title":"Template"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"channel_external_id":{"type":"string","title":"Channel External Id"},"platform_code":{"type":"string","title":"Platform Code"},"armed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Armed By"},"runs_as_caller":{"type":"boolean","title":"Runs As Caller"},"armed_at":{"type":"string","format":"date-time","title":"Armed At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"total_fires":{"type":"integer","title":"Total Fires"},"last_fired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fired At"},"failed_fires":{"type":"integer","title":"Failed Fires"},"last_failed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Failed At"},"creation_offer":{"anyOf":[{"$ref":"#/components/schemas/CreationAttemptStatus"},{"type":"null"}]}},"type":"object","required":["id","action","status","source","source_label","event","event_label","narrowing","instruction","template","channel_name","channel_external_id","platform_code","armed_by","runs_as_caller","armed_at","updated_at","total_fires","last_fired_at","failed_fires","last_failed_at"],"title":"TriggerCreateResponse"},"TriggerFire":{"properties":{"event_id":{"type":"string","title":"Event Id"},"status":{"type":"string","title":"Status"},"occurred_at":{"type":"string","format":"date-time","title":"Occurred At"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},"type":"object","required":["event_id","status","occurred_at","error"],"title":"TriggerFire","description":"One recent delivery attempt for a trigger."},"TriggerFireListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TriggerFire"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"TriggerFireListResponse","description":"A bounded recent-delivery list for one trigger."},"TriggerHourlyCeiling":{"properties":{"rate_limited":{"type":"boolean","title":"Rate Limited"},"hourly_limit_notice_resume_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Hourly Limit Notice Resume At"},"max_runs_per_feed_per_hour":{"type":"integer","title":"Max Runs Per Feed Per Hour"}},"type":"object","required":["rate_limited","hourly_limit_notice_resume_at","max_runs_per_feed_per_hour"],"title":"TriggerHourlyCeiling","description":"The current hourly agent-trigger ceiling state."},"TriggerLimitView":{"properties":{"key":{"type":"string","title":"Key"},"label":{"type":"string","title":"Label"},"dollars":{"type":"number","title":"Dollars"},"source":{"type":"string","title":"Source"}},"type":"object","required":["key","label","dollars","source"],"title":"TriggerLimitView","description":"One underlying per-trigger budget inside a group (the advanced-detail rows)."},"TriggerListResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TriggerView"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"TriggerListResponse","description":"The triggers in the caller's selected status view."},"TriggerNarrowing":{"properties":{"field":{"type":"string","title":"Field"},"label":{"type":"string","title":"Label"},"kind":{"type":"string","title":"Kind"},"value":{"type":"string","title":"Value"},"display_value":{"type":"string","title":"Display Value"}},"type":"object","required":["field","label","kind","value","display_value"],"title":"TriggerNarrowing","description":"One equality condition that narrows an event trigger."},"TriggerPatchRequest":{"properties":{"action":{"anyOf":[{"type":"string","enum":["announce","agent"]},{"type":"null"}],"title":"Action"},"instruction":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Instruction"},"template":{"anyOf":[{"type":"string","maxLength":500},{"type":"null"}],"title":"Template"},"filter":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Filter"},"conditions":{"anyOf":[{"items":{"$ref":"#/components/schemas/TriggerConditionInput"},"type":"array","maxItems":4},{"type":"null"}],"title":"Conditions"},"status":{"anyOf":[{"type":"string","enum":["active","stopped"]},{"type":"null"}],"title":"Status"}},"additionalProperties":false,"type":"object","title":"TriggerPatchRequest","description":"Change a trigger's behavior without changing its identity."},"TriggerPeopleResponse":{"properties":{"items":{"items":{"$ref":"#/components/schemas/TriggerPerson"},"type":"array","title":"Items"}},"type":"object","required":["items"],"title":"TriggerPeopleResponse","description":"The tenant's bounded live teammate list."},"TriggerPerson":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"}},"type":"object","required":["id","name"],"title":"TriggerPerson","description":"One live teammate offered by a person condition."},"TriggerPreviewDestination":{"properties":{"platform_code":{"type":"string","title":"Platform Code"},"channel_external_id":{"type":"string","title":"Channel External Id"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"}},"type":"object","required":["platform_code","channel_external_id","channel_name"],"title":"TriggerPreviewDestination","description":"The resolved destination the real trigger uses."},"TriggerPreviewEvent":{"properties":{"event_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Event Id"},"occurred_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Occurred At"},"properties":{"additionalProperties":true,"type":"object","title":"Properties"},"conditions":{"items":{"$ref":"#/components/schemas/TriggerConditionVerdict"},"type":"array","title":"Conditions"},"rendered_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Rendered Message"}},"type":"object","required":["event_id","occurred_at","properties","conditions","rendered_message"],"title":"TriggerPreviewEvent","description":"One event evaluation in a trigger preview."},"TriggerPreviewRequest":{"properties":{"sample_source":{"type":"string","enum":["catalog","recent"],"title":"Sample Source","default":"catalog"},"limit":{"type":"integer","maximum":5.0,"minimum":1.0,"title":"Limit","default":5}},"additionalProperties":false,"type":"object","title":"TriggerPreviewRequest","description":"Select catalog data or recent real events for a side-effect-free preview."},"TriggerPreviewResponse":{"properties":{"trigger_id":{"type":"string","format":"uuid","title":"Trigger Id"},"action":{"type":"string","enum":["announce","agent"],"title":"Action"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction"},"destination":{"$ref":"#/components/schemas/TriggerPreviewDestination"},"sample_source":{"type":"string","enum":["catalog","recent"],"title":"Sample Source"},"events":{"items":{"$ref":"#/components/schemas/TriggerPreviewEvent"},"type":"array","title":"Events"},"no_events_message":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"No Events Message"},"hourly_ceiling":{"anyOf":[{"$ref":"#/components/schemas/TriggerHourlyCeiling"},{"type":"null"}]}},"type":"object","required":["trigger_id","action","instruction","destination","sample_source","events","no_events_message","hourly_ceiling"],"title":"TriggerPreviewResponse","description":"A side-effect-free evaluation of one trigger."},"TriggerView":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"action":{"type":"string","enum":["announce","agent"],"title":"Action"},"status":{"type":"string","enum":["active","stopped"],"title":"Status"},"source":{"type":"string","title":"Source"},"source_label":{"type":"string","title":"Source Label"},"source_connected":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Source Connected"},"event":{"type":"string","title":"Event"},"event_label":{"type":"string","title":"Event Label"},"narrowing":{"items":{"$ref":"#/components/schemas/TriggerNarrowing"},"type":"array","title":"Narrowing"},"instruction":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instruction"},"template":{"type":"string","title":"Template"},"channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Channel Name"},"channel_external_id":{"type":"string","title":"Channel External Id"},"platform_code":{"type":"string","title":"Platform Code"},"armed_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Armed By"},"runs_as_caller":{"type":"boolean","title":"Runs As Caller"},"armed_at":{"type":"string","format":"date-time","title":"Armed At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"total_fires":{"type":"integer","title":"Total Fires"},"last_fired_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Fired At"},"failed_fires":{"type":"integer","title":"Failed Fires"},"last_failed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Failed At"}},"type":"object","required":["id","action","status","source","source_label","event","event_label","narrowing","instruction","template","channel_name","channel_external_id","platform_code","armed_by","runs_as_caller","armed_at","updated_at","total_fires","last_fired_at","failed_fires","last_failed_at"],"title":"TriggerView","description":"One standing trigger as the dashboard displays it."},"UnhappinessLabel":{"type":"string","enum":["none","ignored_request","ignored_instruction","wrong_answer","confusing_reply","missing_explanation","slow_or_no_response","bad_style","other"],"title":"UnhappinessLabel","description":"What a person's reply says about Patricia. The table's CHECK constraint lists exactly these."},"UnresolvedReason":{"type":"string","enum":["actor_not_in_tenant","ambiguous_verified_email","no_principal","team_scope","legacy_row"],"title":"UnresolvedReason","description":"Why a writer could not name an owner. Recorded for the pre-flip inventory, never for control flow.\n\nA reason is an OBSERVATION about one write. It never widens what the row may do: every\nunresolved row lands on the same fail-closed columns whichever reason produced it."},"UpdateBody":{"properties":{"base_url":{"anyOf":[{"type":"string","maxLength":2048},{"type":"null"}],"title":"Base Url"},"token":{"anyOf":[{"type":"string","maxLength":8192},{"type":"null"}],"title":"Token"},"header_name":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"Header Name"},"clear_secret":{"type":"boolean","title":"Clear Secret","default":false}},"additionalProperties":false,"type":"object","title":"UpdateBody","description":"A dial-input change. Every field optional, and **omission is meaningful** — see ``token``."},"UpdateBuiltInTemplateConfigRequest":{"properties":{"config":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Config","description":"The fields to change. A field left out keeps its stored value, and each template decides the rest. Daily Brief and the email sweeps: a field set to null clears that pick, and a null config clears every pick. email_accounts is a list of connected mailbox account ids; null or an empty list means every mailbox. Ad Anomaly Watch: a null config resets every setting to its default and keeps the watch's memory.","examples":[{"email_accounts":["0b6c1a52-8d3e-4f7a-9c21-5e4d7a8b9c10"]}]},"cron_job_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Cron Job Id","description":"The automation row the caller opened. When set, only that row changes."}},"additionalProperties":false,"type":"object","required":["config"],"title":"UpdateBuiltInTemplateConfigRequest"},"UpdateDraftRequest":{"properties":{"manifest":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Manifest"},"title":{"anyOf":[{"type":"string","maxLength":255},{"type":"null"}],"title":"Title"}},"type":"object","title":"UpdateDraftRequest","description":"Replace the draft's working manifest and/or its title."},"UpdateRoleBody":{"properties":{"role_code":{"type":"string","title":"Role Code"}},"additionalProperties":false,"type":"object","required":["role_code"],"title":"UpdateRoleBody","description":"PATCH /members/{id} request body."},"UpgradeInstallationRequest":{"properties":{"expected_version_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Expected Version Id"}},"additionalProperties":false,"type":"object","title":"UpgradeInstallationRequest","description":"Move an installed skill onto the newest published version of that same skill.\n\nThere is no version to choose: the route resolves the skill's currently ACTIVE version inside the\ncaller's tenant. ``expected_version_id`` is a compare-and-set guard over that resolution — the id the\ndashboard showed the person as \"the update\" — so a version published while they were reading the\npage surfaces a conflict instead of silently applying a different upgrade than the one they saw. It\nis never used AS the target, so it cannot pin another skill's or another tenant's version."},"UpstreamRevokeOutcome":{"type":"string","enum":["revoked","unsupported","pending","adapter_error","intent_released_unresolved"],"title":"UpstreamRevokeOutcome","description":"What actually happened at the provider when we tried to revoke a disconnected account.\n\nEvery value except ``REVOKED`` means the provider-side credential may still be LIVE, so they are\nkept apart rather than collapsed into success/failure: they carry different truths for the user and\ndifferent remedies for us.\n\n- ``REVOKED``: the provider confirmed it. The only outcome that may be reported as \"access removed\".\n- ``UNSUPPORTED``: no kill is confirmed and nothing is retried (for example, the adapter raises\n  ``NotImplementedError``, or declares ``revoke_confirms_upstream = False``). Nothing failed. A\n  grant, or part of one, may still be live at the provider.\n- ``PENDING``: a real attempt failed against the provider (outage, timeout, HTTP error). Retrying\n  later can succeed, so the account is flagged for the orphan report.\n- ``ADAPTER_ERROR``: the fault is on OUR side and no provider answer was recorded. Deliberately\n  NOT \"the request never left\" — for the MCP path it never does, but a generic adapter can also\n  die MID-call (``ADAPTER_BUG_EXCEPTIONS`` names that case), which leaves the provider's state\n  unknown rather than untouched. Retrying the same input changes nothing; **a deploy, operator\n  remediation, or configuration** does. Three shapes, and an on-call engineer needs all of them:\n  our adapter is broken (a ``revoke`` whose signature no longer matches the call, a missing\n  attribute, a typo), which a deploy fixes; the debt itself cannot be built into an authenticated\n  request — an OAuth debt written before client identities were recorded, say — which no deploy\n  can repair, because the missing part is data; or a signing key is absent, which is neither, and\n  is repaired by setting it. Reading this as \"only a deploy fixes this\" sends someone hunting for\n  a code bug that does not exist. It is a separate outcome from ``PENDING`` because our own\n  failure, reported as a provider outage, is a failure nobody ever looks for.\n- ``INTENT_RELEASED_UNRESOLVED``: the native released-intent shortcut cannot confirm revocation,\n  or an accountless Billit debt carries no token material. The row is terminal in one attempt\n  and keeps its payload without a page. A tokenless account-backed Billit debt returns\n  ``ADAPTER_ERROR`` and retries instead."},"UpstreamRevokeState":{"type":"string","enum":["attempt_pending","provider_error","adapter_error","revoked","unsupported"],"title":"UpstreamRevokeState","description":"What we know about the provider-side credential after a disconnect cycle.\n\nThe orphan report lists exactly the first three: in each, the credential may still be live at the\nprovider, and so may still be billing. The last two are settled and never appear there, though\na grant, or part of one, may still be live under ``UNSUPPORTED``.\n\n- ``ATTEMPT_PENDING``: no final outcome has been recorded for this disconnect. It does NOT mean\n  nothing was attempted — it also covers a call running right now and one whose result was not\n  saved. Read ``RevokeRetryOwnership`` to tell those apart.\n- ``PROVIDER_ERROR``: the provider call failed (outage, timeout, HTTP error). Retrying can fix it.\n- ``ADAPTER_ERROR``: the fault is on OUR side and no provider answer was recorded, so retrying\n  the same input changes nothing. Not quite the same as \"the request never left\": for the MCP\n  path it never does, but a generic adapter can also die MID-call (``ADAPTER_BUG_EXCEPTIONS``\n  names that case), which leaves the provider's state genuinely unknown rather than untouched.\n  Three shapes: our integration code is broken, which a deploy fixes; the debt cannot be built\n  into an authenticated request, which is operator work because the missing part is data; or a\n  signing key is absent, which is configuration. ``UpstreamRevokeOutcome`` carries the split.\n- ``REVOKED``: the provider confirmed the credential is gone. Carries a revoked-at timestamp.\n- ``UNSUPPORTED``: no kill was confirmed, and nothing is retried. A grant, or part of one, may\n  still be live at the provider."},"UsageCount":{"properties":{"code":{"type":"string","title":"Code"},"count":{"type":"integer","title":"Count"}},"additionalProperties":false,"type":"object","required":["code","count"],"title":"UsageCount","description":"How many times one label was recorded, named by its raw code."},"UsageLimitItem":{"properties":{"key":{"type":"string","title":"Key","description":"Stable machine id for this limit (e.g. 'spend.monthly_cap')."},"label":{"type":"string","title":"Label","description":"Friendly name shown on the card."},"summary":{"type":"string","title":"Summary","description":"Plain-language one-liner explaining what the limit does."},"kind":{"type":"string","enum":["meter","balance","setting"],"title":"Kind","description":"How the item renders: meter, balance, or setting."},"status":{"type":"string","enum":["ok","near","reached","off"],"title":"Status","description":"Honest state: ok, near (80%+), reached, or off."},"used":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Used","description":"Current usage (meters) or remaining amount (balances)."},"limit":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Limit","description":"The cap (meters) or configured value (settings)."},"unit":{"anyOf":[{"type":"string","enum":["usd","credits","minutes","recordings","replies","reports","days","runs"]},{"type":"null"}],"title":"Unit","description":"How to format the numbers."},"period_label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Period Label","description":"When the numbers apply, e.g. 'this month' or 'right now'."},"source":{"anyOf":[{"type":"string","enum":["default","custom"]},{"type":"null"}],"title":"Source","description":"Whether the cap is Patricia's recommended default or a workspace override."},"note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Note","description":"Honest context, e.g. why a feature-off limit has nothing to show."},"detail":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Detail","description":"Technical detail for the advanced reveal."},"manage_tab":{"anyOf":[{"type":"string","enum":["billing","spending","data","model"]},{"type":"null"}],"title":"Manage Tab","description":"The Settings tab where this limit is changed, when one exists."}},"type":"object","required":["key","label","summary","kind","status"],"title":"UsageLimitItem","description":"One limit: what it is, where usage stands against it, and where to change it."},"UsageLimitSection":{"properties":{"key":{"type":"string","title":"Key"},"title":{"type":"string","title":"Title"},"description":{"type":"string","title":"Description"},"items":{"items":{"$ref":"#/components/schemas/UsageLimitItem"},"type":"array","title":"Items"}},"type":"object","required":["key","title","description","items"],"title":"UsageLimitSection","description":"A titled group of related limits (display order = list order)."},"UsageLimitsResponse":{"properties":{"sections":{"items":{"$ref":"#/components/schemas/UsageLimitSection"},"type":"array","title":"Sections"}},"type":"object","required":["sections"],"title":"UsageLimitsResponse","description":"Every limit the caller's workspace has, with current usage, in display order."},"UsageWeek":{"properties":{"week_start":{"type":"string","format":"date-time","title":"Week Start"},"count":{"type":"integer","title":"Count"}},"additionalProperties":false,"type":"object","required":["week_start","count"],"title":"UsageWeek","description":"How many runs started in the week beginning ``week_start``."},"UserResponse":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"email":{"type":"string","title":"Email"},"first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First Name"},"last_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Last Name"},"email_verified_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Email Verified At"},"disabled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Disabled At"},"is_internal":{"type":"boolean","title":"Is Internal"}},"type":"object","required":["id","email","first_name","last_name","email_verified_at","disabled_at","is_internal"],"title":"UserResponse","description":"Public user profile (never exposes ``password_hash``)."},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"},"ValidationResponse":{"properties":{"valid":{"type":"boolean","title":"Valid"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"delivery_mode":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Mode"},"errors":{"items":{"type":"string"},"type":"array","title":"Errors"}},"type":"object","required":["valid"],"title":"ValidationResponse","description":"The result of validating a manifest: friendly errors for the live editor."},"VisibilityBody":{"properties":{"expected_current":{"$ref":"#/components/schemas/IntegrationVisibility"},"target":{"$ref":"#/components/schemas/IntegrationVisibility"}},"additionalProperties":false,"type":"object","required":["expected_current","target"],"title":"VisibilityBody","description":"Switch a connected account between PERSONAL (private) and TEAM (whole company).\n\n``expected_current`` is a compare-and-set guard: the write only lands if the account is still at\nthat scope, so a concurrent flip surfaces a 409 instead of silently clobbering."},"WelcomePreviewResponse":{"properties":{"text":{"type":"string","title":"Text"},"workspace_name":{"type":"string","title":"Workspace Name"},"recipient_first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Recipient First Name"},"admin_first_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Admin First Name"}},"type":"object","required":["text","workspace_name","recipient_first_name","admin_first_name"],"title":"WelcomePreviewResponse","description":"The real welcome DM rendered for the authenticated workspace."},"WireContractBackfillResult":{"properties":{"task_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Task Id","description":"Broker task id, for tracing the sweep's logs."}},"type":"object","title":"WireContractBackfillResult","description":"Ack that the fleet wire-contract-digest backfill was enqueued."},"WireContractDigestFailure":{"properties":{"tenant_id":{"type":"string","title":"Tenant Id"},"tool_definition_id":{"type":"string","title":"Tool Definition Id"},"name":{"type":"string","title":"Name","description":"The tool's dispatch name within its tenant."},"tool_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Ref","description":"Provider action this row dispatches, from its config."},"provider":{"type":"string","title":"Provider"},"reason":{"type":"string","title":"Reason","description":"``missing`` (no digest recorded), ``mismatched`` (the recorded digest no longer describes the row's own stored state), or ``unverifiable`` (the provider publishes no contract for this ref: retired, unknown, or unconfigured)."},"blocked_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Blocked By","description":"Why no usable live digest could be obtained, when that is the reason. Deployment faults: ``provider_not_configured`` (no adapter registered in this process), ``publisher_capability_missing`` (a provider we ship a contract for whose adapter is not offering it), or ``digest_error`` (the capability raised, or returned something that is not a string). Data faults: ``provider_publishes_no_contract`` (this provider has no fixed wire), ``digest_blank`` (it answered with an empty string), or ``no_tool_ref`` (the row's own config carries no usable ref). Null for an ordinary retired or unknown ref, which is the one case the provider answered normally."}},"type":"object","required":["tenant_id","tool_definition_id","name","provider","reason"],"title":"WireContractDigestFailure","description":"One enabled tool row whose recorded wire-contract digest does not hold."},"WireContractDigestReport":{"properties":{"ok":{"type":"boolean","title":"Ok","description":"True only when nothing is missing, mismatched, or unverifiable."},"checked":{"type":"integer","title":"Checked"},"verified":{"type":"integer","title":"Verified"},"missing":{"type":"integer","title":"Missing"},"mismatched":{"type":"integer","title":"Mismatched"},"unverifiable":{"type":"integer","title":"Unverifiable"},"failures":{"items":{"$ref":"#/components/schemas/WireContractDigestFailure"},"type":"array","title":"Failures","description":"A capped sample of the offending rows, for diagnosis."},"failures_truncated":{"type":"boolean","title":"Failures Truncated","description":"True when more rows failed than the sample lists."}},"type":"object","required":["ok","checked","verified","missing","mismatched","unverifiable","failures_truncated"],"title":"WireContractDigestReport","description":"Whether every enabled tool row of a wire-contract publishing provider records a wire contract."},"WorkspaceDefaultRequest":{"properties":{"enabled":{"type":"boolean","title":"Enabled","description":"True gives the skill back to the workspace (deleting any suppressing row); false stops it. Both are idempotent."}},"type":"object","required":["enabled"],"title":"WorkspaceDefaultRequest","description":"Whether this workspace should run a default-on catalog skill."},"WorkspaceDefaultState":{"properties":{"slug":{"type":"string","title":"Slug"},"enabled":{"type":"boolean","title":"Enabled"},"changed":{"type":"boolean","title":"Changed"}},"type":"object","required":["slug","enabled","changed"],"title":"WorkspaceDefaultState","description":"What the workspace's default now is for one skill."},"models__api_key__ApiKey__CreateValidator":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"role_code":{"$ref":"#/components/schemas/Role"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"}},"additionalProperties":false,"type":"object","required":["name","role_code"],"title":"CreateValidator","description":"POST body. ``tenant_id`` + key material are server-assigned."},"models__api_key__ApiKey__CreatedValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"role_code":{"$ref":"#/components/schemas/Role"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"plaintext_key":{"type":"string","title":"Plaintext Key"}},"type":"object","required":["id","tenant_id","name","prefix","role_code","created_at","updated_at","plaintext_key"],"title":"CreatedValidator","description":"POST response: carries the one-time plaintext key."},"models__api_key__ApiKey__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"role_code":{"$ref":"#/components/schemas/Role"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","name","prefix","role_code","created_at","updated_at"],"title":"FullValidator","description":"Response shape: never includes the stored hash or the plaintext key."},"models__api_key__ApiKey__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__api_key__ApiKey__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response ({items, first, next, previous})."},"models__audit__AuditLog__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"action":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Action"},"target":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Target"},"risk_tier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Tier Code"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape.\n\nAll fields optional so ``fields=`` projection validates (runflow audit\npattern). ``metadata_`` reads the ORM attr by name and serializes under\nthe public key ``metadata`` via ``serialization_alias``."},"models__audit__AuditLog__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__audit__AuditLog__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin audit read."},"models__billing__AdminCreditAdjustment__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Amount"},"applied_credits":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Applied Credits"},"applied_retail_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Applied Retail Micro Usd"},"balance_after":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Balance After"},"retail_balance_after_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Retail Balance After Micro Usd"},"reason":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Reason"},"idempotency_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Idempotency Key"},"created_by_principal_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Principal Id"},"created_by_principal_type":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By Principal Type"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__billing__AdminCreditAdjustment__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__billing__AdminCreditAdjustment__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__billing__InvoiceLine__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"invoice_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Invoice Id"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"quantity":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Quantity"},"unit_amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Unit Amount Cents"},"amount_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Amount Cents"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__billing__InvoiceLine__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__billing__InvoiceLine__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__billing__Invoice__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"invoice_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Invoice Number"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"issued_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Issued At"},"currency_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Currency Code"},"subtotal_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Subtotal Cents"},"tax_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tax Cents"},"total_cents":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Total Cents"},"bill_to_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bill To Name"},"bill_to_details":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bill To Details"},"stripe_payment_intent_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Payment Intent Id"},"stripe_checkout_session_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Checkout Session Id"},"stripe_invoice_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Invoice Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__billing__Invoice__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__billing__Invoice__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__billing__Subscription__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"stripe_customer_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Customer Id"},"stripe_subscription_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Stripe Subscription Id"},"tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tier"},"seats":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Seats"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"current_period_end":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Current Period End"},"credit_balance_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Credit Balance Micro Usd"},"cancel_at_period_end":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Cancel At Period End"},"credit_balance":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Credit Balance"},"monthly_credit_grant":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Credit Grant"},"credit_rollover":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Credit Rollover"},"last_grant_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Grant At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__billing__Subscription__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__billing__Subscription__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__billing__UsageRecord__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Date"},"usage_shard_key":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Usage Shard Key"},"run_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Run Count"},"input_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Input Tokens"},"output_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Output Tokens"},"cache_read_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cache Read Tokens"},"cache_write_tokens":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cache Write Tokens"},"tool_calls":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Tool Calls"},"cost_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Cost Micro Usd"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__billing__UsageRecord__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__billing__UsageRecord__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__brain__BrainDocRevision__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"brain_doc_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Brain Doc Id"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"updated_by_run":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Run"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__brain__BrainDocRevision__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__brain__BrainDocRevision__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__brain__BrainDoc__CreateValidator":{"properties":{"path":{"type":"string","title":"Path"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary","default":""},"body":{"type":"string","title":"Body","default":""},"scope_code":{"$ref":"#/components/schemas/BrainDocScope","default":"company"},"status_code":{"$ref":"#/components/schemas/DocStatus","default":"active"},"pinned":{"type":"boolean","title":"Pinned","default":false},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"}},"additionalProperties":false,"type":"object","required":["path","title"],"title":"CreateValidator","description":"POST body. ``tenant_id`` is server-assigned from the request context."},"models__brain__BrainDoc__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"path":{"type":"string","title":"Path"},"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary"},"body":{"type":"string","title":"Body"},"scope_code":{"$ref":"#/components/schemas/BrainDocScope"},"status_code":{"$ref":"#/components/schemas/DocStatus"},"pinned":{"type":"boolean","title":"Pinned"},"version":{"type":"integer","title":"Version"},"token_count":{"type":"integer","title":"Token Count"},"hit_count":{"type":"integer","title":"Hit Count"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"updated_by_run":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Updated By Run"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","path","title","summary","body","scope_code","status_code","pinned","version","token_count","hit_count","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH."},"models__brain__BrainDoc__MergeValidator":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"body":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Body"},"scope_code":{"anyOf":[{"$ref":"#/components/schemas/BrainDocScope"},{"type":"null"}]},"status_code":{"anyOf":[{"$ref":"#/components/schemas/DocStatus"},{"type":"null"}]},"pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pinned"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: every field optional; only those set are written."},"models__brain__BrainDoc__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__brain__BrainDoc__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__brain__BrainDoc__UpdateValidator":{"properties":{"title":{"type":"string","title":"Title"},"summary":{"type":"string","title":"Summary","default":""},"body":{"type":"string","title":"Body","default":""},"scope_code":{"$ref":"#/components/schemas/BrainDocScope"},"status_code":{"$ref":"#/components/schemas/DocStatus"},"pinned":{"type":"boolean","title":"Pinned","default":false},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["title","scope_code","status_code","updated_at"],"title":"UpdateValidator","description":"PUT body: full update of mutable fields (carries ``updated_at`` for the stale check)."},"models__brain__Lesson__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"scope":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/LessonStatus"},{"type":"null"}]},"evidence":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Evidence"},"eval_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eval Score"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__brain__Lesson__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__brain__Lesson__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__brain__MemoryItem__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"scope_code":{"$ref":"#/components/schemas/MemoryScope"},"scope_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Scope Ref"},"kind_code":{"$ref":"#/components/schemas/MemoryKind"},"content":{"type":"string","title":"Content"},"salience":{"type":"number","title":"Salience"},"hit_count":{"type":"integer","title":"Hit Count"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"pruned_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Pruned At"},"pinned":{"type":"boolean","title":"Pinned"},"source":{"type":"string","title":"Source"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","scope_code","kind_code","content","salience","hit_count","pinned","source","created_at","updated_at"],"title":"FullValidator","description":"Response shape for memory reads and pin, unpin and restore. The raw vector is never exposed."},"models__brain__MemoryItem__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__brain__MemoryItem__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__brain__SkillFile__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"skill_id":{"type":"string","format":"uuid","title":"Skill Id"},"kind":{"type":"string","title":"Kind"},"path":{"type":"string","title":"Path"},"content":{"type":"string","title":"Content"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","skill_id","kind","path","content","created_at","updated_at"],"title":"FullValidator","description":"Read-only response shape for the skill-file listing."},"models__brain__Skill__CreateValidator":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"content":{"type":"string","maxLength":100000,"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"version":{"type":"integer","title":"Version","default":1},"status_code":{"$ref":"#/components/schemas/LessonStatus","default":"proposed"},"eval_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eval Score"}},"additionalProperties":false,"type":"object","required":["name","content"],"title":"CreateValidator","description":"POST body. ``tenant_id`` and ``created_by`` are server-assigned.\n\nNo ``created_by``: it is the provenance label, and a body that could set it could stamp a\nworkspace's own skill ``patricia`` and wear the platform's badge. ``extra=\"forbid\"`` turns\nsuch a body into a 422 rather than ignoring the field, so a caller who thinks they are\nchoosing the provenance is told they are not. The repository assigns ``custom``.\n\nThe 422 is a DELIBERATE contract break, chosen against the accept-and-discard bargain\nPUT/PATCH make. Those verbs round-trip GET bodies of existing rows, so silence there keeps\nworking clients working. Create is where a forged label would be minted, and the published\ncreate contract never honoured the field for anyone: every user-principal request 500'd\nfrom the day the route shipped, and an API-key caller's body value was silently overwritten\nby the factory's injection. Refusing loudly beats continuing either of those."},"models__brain__Skill__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"content":{"type":"string","title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"version":{"type":"integer","title":"Version"},"status_code":{"$ref":"#/components/schemas/LessonStatus"},"eval_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eval Score"},"created_by":{"type":"string","title":"Created By"},"hit_count":{"type":"integer","title":"Hit Count"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","content","version","status_code","created_by","hit_count","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH."},"models__brain__Skill__MergeValidator":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"content":{"anyOf":[{"type":"string","maxLength":100000},{"type":"null"}],"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"version":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Version"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/LessonStatus"},{"type":"null"}]},"eval_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eval Score"},"created_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Created By"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: every field optional; only those set are written.\n\n``created_by`` is declared but never written: it is in ``readonly_fields``, so the\nrepository accepts and DISCARDS it, exactly as PUT does. That was the hole this branch\nclosed: PATCH used to write every field it was given, which let a tenant rewrite an\nexisting skill's provenance to ``patricia`` after the fact. The fix belongs in the\nrepository, not here. Forbidding the field instead would 422 every client that round-trips\na GET body back, and read-modify-write is at least as common on PATCH as on PUT."},"models__brain__Skill__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__brain__Skill__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__brain__Skill__UpdateValidator":{"properties":{"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string","maxLength":2000},{"type":"null"}],"title":"Description"},"content":{"type":"string","maxLength":100000,"title":"Content"},"category":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Category"},"version":{"type":"integer","title":"Version","default":1},"status_code":{"$ref":"#/components/schemas/LessonStatus"},"eval_score":{"anyOf":[{"type":"number"},{"type":"null"}],"title":"Eval Score"},"created_by":{"type":"string","title":"Created By"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["name","content","status_code","created_by","updated_at"],"title":"UpdateValidator","description":"PUT body: full update of mutable fields (carries ``updated_at`` for the stale check)."},"models__conversation__Conversation__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"platform_code":{"$ref":"#/components/schemas/Platform"},"kind_code":{"$ref":"#/components/schemas/ConversationKind"},"source_code":{"$ref":"#/components/schemas/ConversationSource"},"external_id":{"type":"string","title":"External Id"},"thread_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Thread Ref"},"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"type":"string","title":"Status"},"locked_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locked By"},"lock_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lock Expires At"},"last_message_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Message At"},"streaming_turn_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Streaming Turn Id"},"streaming_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Streaming Expires At"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","platform_code","kind_code","source_code","external_id","status","metadata","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH.\n\nThe ORM attribute ``metadata_`` dodges the SQLAlchemy-reserved\n``metadata`` attribute; the PUBLIC field is exposed cleanly as\n``metadata`` (runflow alias pattern: ``from_attributes`` reads the ORM\nattr by field name, ``serialization_alias`` is the public/serialized key)."},"models__conversation__Conversation__MergeValidator":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status"},"metadata":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Metadata"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: every field optional; only those set are written."},"models__conversation__Conversation__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__conversation__Conversation__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__conversation__Conversation__UpdateValidator":{"properties":{"title":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Title"},"status":{"type":"string","title":"Status"},"metadata":{"additionalProperties":true,"type":"object","title":"Metadata"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["status","updated_at"],"title":"UpdateValidator","description":"PUT body: full update of mutable fields (carries ``updated_at`` for the stale check)."},"models__conversation__Message__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"role":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Role"},"author_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Author Actor Id"},"content":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Content"},"card":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Card"},"platform_message_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Message Id"},"token_count":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Token Count"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"FullValidator","description":"Read-only response shape for the conversation transcript.\n\nAll fields optional so ``fields=`` projection validates (runflow read\npattern). Append-only, with no Create/Update/Merge validators."},"models__conversation__Message__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__conversation__Message__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated transcript list response."},"models__cron__CronJob__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run At"},"kind_code":{"$ref":"#/components/schemas/CronKind"},"delivery_conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Delivery Conversation Id"},"delivery_channel_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Id"},"delivery_destination_kind":{"anyOf":[{"type":"string","enum":["dm","channel","unknown_channel"]},{"type":"null"}],"title":"Delivery Destination Kind"},"billing_skip_reason":{"anyOf":[{"type":"string","enum":["no_credits","subscription_inactive"]},{"type":"null"}],"title":"Billing Skip Reason"},"delivery_channel_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Channel Name"},"created_by_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Actor Id"},"built_in_template_key":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Built In Template Key"},"auto_approve":{"type":"boolean","title":"Auto Approve","default":false},"summary":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Summary"},"instructions":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Instructions"},"instructions_author_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Instructions Author Actor Id"},"prompt":{"type":"string","title":"Prompt"},"condition_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition Script"},"enabled":{"type":"boolean","title":"Enabled"},"model":{"type":"string","title":"Model"},"cost_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Tier"},"locked_by":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Locked By"},"lease_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Lease Expires At"},"last_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Run At"},"next_run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Next Run At"},"run_count":{"type":"integer","title":"Run Count"},"max_runs":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Max Runs"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","name","kind_code","prompt","enabled","model","run_count","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH."},"models__cron__CronJob__MergeValidator":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run At"},"kind_code":{"anyOf":[{"$ref":"#/components/schemas/CronKind"},{"type":"null"}]},"prompt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Prompt"},"condition_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition Script"},"enabled":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Enabled"},"model":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Model"},"cost_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Tier"},"max_runs":{"anyOf":[{"type":"integer","maximum":2147483647.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Runs"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: every field optional; only those set are written."},"models__cron__CronJob__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__cron__CronJob__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__cron__CronJob__UpdateValidator":{"properties":{"name":{"type":"string","title":"Name"},"schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Schedule"},"local_schedule":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Local Schedule"},"timezone":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Timezone"},"run_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Run At"},"kind_code":{"$ref":"#/components/schemas/CronKind","default":"task"},"prompt":{"type":"string","title":"Prompt"},"condition_script":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Condition Script"},"enabled":{"type":"boolean","title":"Enabled"},"model":{"type":"string","title":"Model"},"cost_tier":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Cost Tier"},"max_runs":{"anyOf":[{"type":"integer","maximum":2147483647.0,"exclusiveMinimum":0.0},{"type":"null"}],"title":"Max Runs"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["name","prompt","enabled","model","updated_at"],"title":"UpdateValidator","description":"PUT body: full update of mutable fields (carries ``updated_at`` for the stale check)."},"models__group__GroupChannel__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"added_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Added By"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"FullValidator","description":"Response shape. All-optional so admin ``fields=`` projection validates."},"models__group__GroupChannel__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__group__GroupChannel__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response (admin browser)."},"models__group__GroupSuggestion__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"kind":{"type":"string","title":"Kind"},"status_code":{"$ref":"#/components/schemas/GroupSuggestionStatus"},"title":{"type":"string","title":"Title"},"rationale":{"type":"string","title":"Rationale"},"payload":{"additionalProperties":true,"type":"object","title":"Payload"},"confidence":{"type":"number","title":"Confidence"},"group_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Group Id"},"created_by_run":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By Run"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","kind","status_code","title","rationale","payload","confidence","created_at","updated_at"],"title":"FullValidator"},"models__group__GroupSuggestion__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__group__GroupSuggestion__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__group__Group__CreateValidator":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"description":{"type":"string","title":"Description","default":""},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"status_code":{"$ref":"#/components/schemas/GroupStatus","default":"active"},"pinned":{"type":"boolean","title":"Pinned","default":false}},"additionalProperties":false,"type":"object","required":["name"],"title":"CreateValidator"},"models__group__Group__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"status_code":{"$ref":"#/components/schemas/GroupStatus"},"pinned":{"type":"boolean","title":"Pinned"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","name","slug","description","status_code","pinned","created_at","updated_at"],"title":"FullValidator"},"models__group__Group__MergeValidator":{"properties":{"name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Name"},"slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Slug"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/GroupStatus"},{"type":"null"}]},"pinned":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Pinned"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator"},"models__group__Group__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__group__Group__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__group__Group__UpdateValidator":{"properties":{"name":{"type":"string","title":"Name"},"slug":{"type":"string","title":"Slug"},"description":{"type":"string","title":"Description","default":""},"kind":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind"},"status_code":{"$ref":"#/components/schemas/GroupStatus"},"pinned":{"type":"boolean","title":"Pinned","default":false},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["name","slug","status_code","updated_at"],"title":"UpdateValidator"},"models__identity__Actor__CreateValidator":{"properties":{"platform_code":{"$ref":"#/components/schemas/Platform"},"external_id":{"type":"string","title":"External Id"},"kind_code":{"$ref":"#/components/schemas/ActorKind","default":"human"},"display_name":{"type":"string","title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"profile":{"additionalProperties":true,"type":"object","title":"Profile"}},"additionalProperties":false,"type":"object","required":["platform_code","external_id","display_name"],"title":"CreateValidator","description":"POST body. ``tenant_id`` is server-assigned from the request context."},"models__identity__Actor__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"platform_code":{"$ref":"#/components/schemas/Platform"},"external_id":{"type":"string","title":"External Id"},"kind_code":{"$ref":"#/components/schemas/ActorKind"},"display_name":{"type":"string","title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"profile":{"additionalProperties":true,"type":"object","title":"Profile"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","platform_code","external_id","kind_code","display_name","profile","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH."},"models__identity__Actor__MergeValidator":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"kind_code":{"anyOf":[{"$ref":"#/components/schemas/ActorKind"},{"type":"null"}]},"profile":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Profile"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: every field optional; only those set are written."},"models__identity__Actor__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__identity__Actor__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response ({items, first, next, previous})."},"models__identity__Actor__UpdateValidator":{"properties":{"display_name":{"type":"string","title":"Display Name"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"kind_code":{"$ref":"#/components/schemas/ActorKind"},"profile":{"additionalProperties":true,"type":"object","title":"Profile"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["display_name","kind_code","updated_at"],"title":"UpdateValidator","description":"PUT body: full update of mutable fields.\n\n``updated_at`` is carried for the engine's optimistic-concurrency check\n(stale value → 409)."},"models__identity__PlatformInstallation__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"platform_code":{"anyOf":[{"$ref":"#/components/schemas/Platform"},{"type":"null"}]},"platform_tenant_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Tenant Id"},"platform_bot_user_id":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Platform Bot User Id"},"token_expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Token Expires At"},"status_code":{"anyOf":[{"$ref":"#/components/schemas/TenantStatus"},{"type":"null"}]},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only shape: NEVER exposes the encrypted ``*_enc`` credentials."},"models__identity__PlatformInstallation__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__identity__PlatformInstallation__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__identity__Tenant__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"display_name":{"type":"string","title":"Display Name"},"status_code":{"$ref":"#/components/schemas/TenantStatus"},"settings":{"additionalProperties":true,"type":"object","title":"Settings"},"monthly_cap_micro_usd":{"type":"integer","title":"Monthly Cap Micro Usd"},"onboarding_completed":{"type":"boolean","title":"Onboarding Completed"},"skill_testing_workspace":{"type":"boolean","title":"Skill Testing Workspace"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","display_name","status_code","settings","monthly_cap_micro_usd","onboarding_completed","skill_testing_workspace","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH."},"models__identity__Tenant__MergeValidator":{"properties":{"display_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Display Name"},"monthly_cap_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Monthly Cap Micro Usd"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: every field optional; only those set are written.\n\nNo ``status_code``, for the reason ``UpdateValidator`` gives."},"models__identity__Tenant__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__identity__Tenant__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__identity__Tenant__UpdateValidator":{"properties":{"display_name":{"type":"string","title":"Display Name"},"monthly_cap_micro_usd":{"type":"integer","title":"Monthly Cap Micro Usd"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"additionalProperties":false,"type":"object","required":["display_name","monthly_cap_micro_usd","updated_at"],"title":"UpdateValidator","description":"PUT body: full update of mutable fields (carries ``updated_at`` for the stale check).\n\nNo ``status_code``: workspace liveness is not a client-writable field. See the column."},"models__integration__IntegrationAccount__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"provider":{"type":"string","title":"Provider"},"app_slug":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Slug"},"app_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"App Name"},"external_account_id":{"type":"string","title":"External Account Id"},"status_code":{"$ref":"#/components/schemas/IntegrationStatus"},"visibility_code":{"$ref":"#/components/schemas/IntegrationVisibility","default":"team"},"label":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Label"},"scopes":{"items":{},"type":"array","title":"Scopes","default":[]},"last_synced_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Synced At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"mcp_endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Mcp Endpoint"}},"type":"object","required":["id","tenant_id","provider","external_account_id","status_code","created_at","updated_at"],"title":"FullValidator","description":"Response shape for GET / POST / PUT / PATCH."},"models__integration__IntegrationAccount__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__integration__IntegrationAccount__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__mcp_personal_token__McpPersonalToken__CreateValidator":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["name"],"title":"CreateValidator","description":"A self-mint request. The server supplies all identity fields."},"models__mcp_personal_token__McpPersonalToken__CreatedValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"plaintext_token":{"type":"string","title":"Plaintext Token"}},"type":"object","required":["id","tenant_id","user_id","name","prefix","expires_at","created_at","updated_at","plaintext_token"],"title":"CreatedValidator","description":"The create response with the one-time plaintext token."},"models__mcp_personal_token__McpPersonalToken__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"user_id":{"type":"string","format":"uuid","title":"User Id"},"name":{"type":"string","title":"Name"},"prefix":{"type":"string","title":"Prefix"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"revoked_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Revoked At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","user_id","name","prefix","expires_at","created_at","updated_at"],"title":"FullValidator","description":"A stored token without its hash or one-time plaintext."},"models__preference__ActorPreference__CreateValidator":{"properties":{"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"source_code":{"$ref":"#/components/schemas/PreferenceSource","default":"explicit"}},"additionalProperties":false,"type":"object","required":["actor_id","key","value"],"title":"CreateValidator","description":"Upsert body: ``POST /actor-preferences`` sets (or overwrites) one key."},"models__preference__ActorPreference__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"actor_id":{"type":"string","format":"uuid","title":"Actor Id"},"key":{"type":"string","title":"Key"},"value":{"type":"string","title":"Value"},"source_code":{"$ref":"#/components/schemas/PreferenceSource"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","actor_id","key","value","source_code","created_at","updated_at"],"title":"FullValidator"},"models__preference__ActorPreference__MergeValidator":{"properties":{"value":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Value"},"source_code":{"anyOf":[{"$ref":"#/components/schemas/PreferenceSource"},{"type":"null"}]},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"additionalProperties":false,"type":"object","title":"MergeValidator","description":"PATCH body: edit an existing preference by id."},"models__preference__ActorPreference__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__preference__ActorPreference__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__rbac__Membership__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"email":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Email"},"role_code":{"anyOf":[{"$ref":"#/components/schemas/Role"},{"type":"null"}]},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__rbac__Membership__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__rbac__Membership__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__reply_review__ReplyScoreReview__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"reply_score_id":{"type":"string","format":"uuid","title":"Reply Score Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"status_code":{"type":"string","title":"Status Code"},"verdict_code":{"type":"string","title":"Verdict Code"},"failure_code":{"type":"string","title":"Failure Code"},"note":{"type":"string","title":"Note"},"reviewed_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Reviewed By"},"reviewed_by_type":{"type":"string","title":"Reviewed By Type"},"reviewed_at":{"type":"string","format":"date-time","title":"Reviewed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","reply_score_id","tenant_id","status_code","verdict_code","failure_code","note","reviewed_by_type","reviewed_at","created_at","updated_at"],"title":"FullValidator","description":"The review as it rides along on an admin scorecard row."},"models__run__AgentRun__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"conversation_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Conversation Id"},"actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Actor Id"},"trigger_code":{"$ref":"#/components/schemas/RunTrigger"},"trigger_context":{"anyOf":[{"$ref":"#/components/schemas/RunTriggerContext"},{"type":"null"}]},"message_excerpt":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Message Excerpt"},"status_code":{"$ref":"#/components/schemas/RunStatus"},"truncated":{"type":"boolean","title":"Truncated","default":false},"no_result":{"type":"boolean","title":"No Result","default":false},"silent":{"type":"boolean","title":"Silent","default":false},"model":{"type":"string","title":"Model"},"input_tokens":{"type":"integer","title":"Input Tokens"},"output_tokens":{"type":"integer","title":"Output Tokens"},"cache_read_tokens":{"type":"integer","title":"Cache Read Tokens"},"cache_write_tokens":{"type":"integer","title":"Cache Write Tokens"},"cost_micro_usd":{"type":"integer","title":"Cost Micro Usd"},"budget_micro_usd":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Budget Micro Usd"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"},"started_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Started At"},"completed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Completed At"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"credits":{"type":"integer","title":"Credits","description":"Credits fixed when the run finished, with live-rate conversion for runs without a snapshot.","readOnly":true}},"type":"object","required":["id","tenant_id","trigger_code","status_code","model","input_tokens","output_tokens","cache_read_tokens","cache_write_tokens","cost_micro_usd","created_at","updated_at","credits"],"title":"FullValidator","description":"Response shape for the read routes (GET detail / list). Runs are read-only to clients.\n\n``credits`` is the customer-facing consumption for the run: the metered\n``cost_micro_usd`` COGS converted to whole credits (half-up, the same\nledger conversion), so a run detail can show credits without the dashboard\ndoing token→cost math. ``input_tokens`` / ``output_tokens`` / ``cost_micro_usd``\nremain on the payload for internal + admin callers (audit precision) but are\nnever rendered on a normal-user screen (per pricing-v2 §8a).\n\nFrozen credits travel through private state, leaving snapshot columns absent from queryable fields.\n\n``checkpoint`` is deliberately NOT here: it is the run's full saved loop\nstate (message history, tool schemas, the pending tool-call vector with raw\narguments), i.e. runtime-internal data, exactly like ``pending_snapshot`` and\n``sandbox_seconds_used``. Exposing it handed every ``runs:read`` holder the raw\npending args the approval surfaces redact per caller. The run timeline is served\nby the nested messages / tool-calls / approval reads instead.\n\n``message_excerpt`` is the first line of the opening message of a DIRECTED run\n(mention/DM/message), so a run list can say what was asked rather than only how it\narrived. It is not a column on this table — the text lives in the run's first user\n``Message`` row — so it is attached by the LIST route alone\n(``routers.runs._attach_message_excerpts``) and is absent from the detail response,\nwhose caller reads the transcript itself. Like ``credits`` it is derived, so it can\nnever be named in ``fields=``. A scheduled run's instruction is NOT carried here:\nthat text is ``trigger_context.prompt``, which stays approver-gated."},"models__run__AgentRun__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__run__AgentRun__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"models__run__PermissionRequest__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"risk_tier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Tier Code"},"input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input"},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"request_hash":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Request Hash"},"approver_actor_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Approver Actor Id"},"repeat_coverage_announced":{"anyOf":[{"type":"boolean"},{"type":"null"}],"title":"Repeat Coverage Announced"},"delivery_ref":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Delivery Ref"},"expires_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Expires At"},"resolved_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Resolved At"},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"},"updated_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Updated At"}},"type":"object","title":"FullValidator","description":"Admin read-only response shape (all-optional so ``fields=`` projection validates)."},"models__run__PermissionRequest__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__run__PermissionRequest__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response for the admin read."},"models__run__ToolCall__FullValidator":{"properties":{"id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Id"},"tenant_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Tenant Id"},"run_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Run Id"},"tool_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tool Name"},"kind_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Kind Code"},"risk_tier_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Risk Tier Code"},"input":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Input","description":"Tool arguments, sanitized. Present only for callers holding runs:execute; null for read-only callers, which receive input_summary instead. Null with no input_summary means the call had no stored arguments."},"input_summary":{"anyOf":[{"items":{"$ref":"#/components/schemas/ArgSummaryEntry"},"type":"array"},{"type":"null"}],"title":"Input Summary","description":"Value-free per-argument summary, populated in place of input for callers without runs:execute."},"output":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Output","description":"Tool result, sanitized like input: visible (control-token-stripped, size-capped) only for callers holding runs:execute, null for read-only callers. Results often echo the arguments, so they follow the same visibility rule."},"status_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Status Code"},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms"},"error":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error","description":"Failure diagnostic, sanitized like input: visible only for callers holding runs:execute, null for read-only callers. Error messages routinely quote the failing call's arguments, so they follow the same visibility rule."},"created_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Created At"}},"type":"object","title":"FullValidator","description":"Read-only response shape for the run's tool-call timeline.\n\nAll fields optional so ``fields=`` projection validates (runflow read\npattern). ``input_`` reads the ORM attr by name and serializes under the\npublic key ``input`` via ``serialization_alias``. Append-only, with no\nCreate/Update/Merge validators.\n\n``input`` values are shaped per caller by the route's post-serialize hook\n(``routers/run_tool_calls_nested.py``): sanitized for approval-scope callers,\nnulled with ``input_summary`` populated for plain ``runs:read`` callers."},"models__run__ToolCall__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__run__ToolCall__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated tool-call list response."},"models__service_api_key__ServiceApiKey__CreateValidator":{"properties":{"name":{"type":"string","maxLength":255,"minLength":1,"title":"Name"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"}},"additionalProperties":false,"type":"object","required":["name","expires_at"],"title":"CreateValidator","description":"POST body. Key material is server-assigned; ``expires_at`` is REQUIRED."},"models__service_api_key__ServiceApiKey__CreatedValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"disabled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Disabled At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"},"plaintext_key":{"type":"string","title":"Plaintext Key"}},"type":"object","required":["id","name","key_prefix","expires_at","created_at","updated_at","plaintext_key"],"title":"CreatedValidator","description":"POST response: carries the one-time plaintext key."},"models__service_api_key__ServiceApiKey__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"name":{"type":"string","title":"Name"},"key_prefix":{"type":"string","title":"Key Prefix"},"disabled_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Disabled At"},"expires_at":{"type":"string","format":"date-time","title":"Expires At"},"last_used_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Last Used At"},"created_by":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Created By"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","name","key_prefix","expires_at","created_at","updated_at"],"title":"FullValidator","description":"Response shape: never includes the stored hash or the plaintext key."},"models__service_api_key__ServiceApiKey__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__service_api_key__ServiceApiKey__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response ({items, first, next, previous})."},"models__tool__ToolDefinition__FullValidator":{"properties":{"id":{"type":"string","format":"uuid","title":"Id"},"tenant_id":{"type":"string","format":"uuid","title":"Tenant Id"},"name":{"type":"string","title":"Name"},"description":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Description"},"kind_code":{"$ref":"#/components/schemas/ToolKind"},"risk_tier_code":{"$ref":"#/components/schemas/RiskTier"},"schema":{"additionalProperties":true,"type":"object","title":"Schema"},"endpoint":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Endpoint"},"enabled":{"type":"boolean","title":"Enabled"},"config":{"additionalProperties":true,"type":"object","title":"Config"},"created_at":{"type":"string","format":"date-time","title":"Created At"},"updated_at":{"type":"string","format":"date-time","title":"Updated At"}},"type":"object","required":["id","tenant_id","name","kind_code","risk_tier_code","schema","enabled","config","created_at","updated_at"],"title":"FullValidator","description":"Response shape for tenant-scoped list and detail reads."},"models__tool__ToolDefinition__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/models__tool__ToolDefinition__FullValidator"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated list response."},"queries__actor_directory__ActorDirectoryQuery__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ActorDirectoryRow"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated response envelope for the actor directory."},"queries__approvals_feed__ApprovalsFeedQuery__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ApprovalsFeedRow"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated response envelope for the unified approvals feed."},"queries__conversation_directory__ConversationDirectoryQuery__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/ConversationDirectoryRow"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated response envelope for the conversation directory."},"queries__permission_request_queue__PermissionRequestQueueQuery__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/PermissionRequestRow"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated response envelope for the approval queue."},"queries__run_history__RunHistoryQuery__SearchValidator":{"properties":{"items":{"items":{"$ref":"#/components/schemas/RunHistoryRow"},"type":"array","title":"Items"},"first":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"First"},"next":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Next"},"previous":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Previous"}},"type":"object","required":["items"],"title":"SearchValidator","description":"Typed cursor-paginated response envelope for the run history."}},"securitySchemes":{"HTTPBearer":{"type":"http","scheme":"bearer"}}}}