//! Generated by `trust-tasks-codegen` — do not edit by hand.
//!
//! Spec slug: `vault/usage`. Version: `0.1`.
#[allow(unused_imports)]
use serde::{Deserialize, Serialize};
/// Error types.
pub mod error {
/// Error from a `TryFrom` or `FromStr` implementation.
pub struct ConversionError(::std::borrow::Cow<'static, str>);
impl ::std::error::Error for ConversionError {}
impl ::std::fmt::Display for ConversionError {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> Result<(), ::std::fmt::Error> {
::std::fmt::Display::fmt(&self.0, f)
}
}
impl ::std::fmt::Debug for ConversionError {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> Result<(), ::std::fmt::Error> {
::std::fmt::Debug::fmt(&self.0, f)
}
}
impl From<&'static str> for ConversionError {
fn from(value: &'static str) -> Self {
Self(value.into())
}
}
impl From<String> for ConversionError {
fn from(value: String) -> Self {
Self(value.into())
}
}
}
///Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "title": "Ext",
/// "description": "Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.",
/// "type": "object",
/// "minProperties": 1,
/// "additionalProperties": true,
/// "propertyNames": {
/// "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
/// }
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(transparent)]
pub struct Ext(pub ::std::collections::HashMap<ExtKey, ::serde_json::Value>);
impl ::std::ops::Deref for Ext {
type Target = ::std::collections::HashMap<ExtKey, ::serde_json::Value>;
fn deref(&self) -> &::std::collections::HashMap<ExtKey, ::serde_json::Value> {
&self.0
}
}
impl ::std::convert::From<Ext> for ::std::collections::HashMap<ExtKey, ::serde_json::Value> {
fn from(value: Ext) -> Self {
value.0
}
}
impl ::std::convert::From<&Ext> for Ext {
fn from(value: &Ext) -> Self {
value.clone()
}
}
impl ::std::convert::From<::std::collections::HashMap<ExtKey, ::serde_json::Value>> for Ext {
fn from(value: ::std::collections::HashMap<ExtKey, ::serde_json::Value>) -> Self {
Self(value)
}
}
///`ExtKey`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "pattern": "^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$"
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct ExtKey(::std::string::String);
impl ::std::ops::Deref for ExtKey {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<ExtKey> for ::std::string::String {
fn from(value: ExtKey) -> Self {
value.0
}
}
impl ::std::convert::From<&ExtKey> for ExtKey {
fn from(value: &ExtKey) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for ExtKey {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
static PATTERN: ::std::sync::LazyLock<::regress::Regex> =
::std::sync::LazyLock::new(|| {
::regress::Regex::new("^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$").unwrap()
});
if PATTERN.find(value).is_none() {
return Err("doesn't match pattern \"^[a-z][a-z0-9-]*(\\.[a-z0-9-]+)+$\"".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for ExtKey {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for ExtKey {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for ExtKey {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for ExtKey {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///Consumer queries the maintainer's audit log of recent vault uses (proxy-logins, releases). Drives UIs like "recent activity" and "which AI agent has been using my GitHub credential". Read-only.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "$id": "https://trusttasks.org/spec/vault/usage/0.1",
/// "title": "Payload",
/// "description": "Consumer queries the maintainer's audit log of recent vault uses (proxy-logins, releases). Drives UIs like \"recent activity\" and \"which AI agent has been using my GitHub credential\". Read-only.",
/// "type": "object",
/// "properties": {
/// "byConsumer": {
/// "description": "Optional filter — usage by this consumer DID only. Useful for \"what has AI agent X been doing on my behalf\".",
/// "type": "string",
/// "minLength": 1
/// },
/// "contextId": {
/// "description": "Optional filter — usage within this trust context only.",
/// "type": "string",
/// "minLength": 1
/// },
/// "cursor": {
/// "type": "string"
/// },
/// "entryId": {
/// "description": "Optional filter — usage for this entry only.",
/// "type": "string",
/// "minLength": 1
/// },
/// "ext": {
/// "$ref": "#/definitions/Ext"
/// },
/// "kindFilter": {
/// "type": "array",
/// "items": {
/// "type": "string",
/// "enum": [
/// "proxy-login",
/// "release"
/// ]
/// },
/// "uniqueItems": true
/// },
/// "pageSize": {
/// "type": "integer",
/// "maximum": 1000.0,
/// "minimum": 1.0
/// },
/// "since": {
/// "type": "string",
/// "format": "date-time"
/// },
/// "until": {
/// "type": "string",
/// "format": "date-time"
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
pub struct Payload {
///Optional filter — usage by this consumer DID only. Useful for "what has AI agent X been doing on my behalf".
#[serde(
rename = "byConsumer",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub by_consumer: ::std::option::Option<PayloadByConsumer>,
///Optional filter — usage within this trust context only.
#[serde(
rename = "contextId",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub context_id: ::std::option::Option<PayloadContextId>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub cursor: ::std::option::Option<::std::string::String>,
///Optional filter — usage for this entry only.
#[serde(
rename = "entryId",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub entry_id: ::std::option::Option<PayloadEntryId>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub ext: ::std::option::Option<Ext>,
#[serde(
rename = "kindFilter",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub kind_filter: ::std::option::Option<Vec<PayloadKindFilterItem>>,
#[serde(
rename = "pageSize",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub page_size: ::std::option::Option<::std::num::NonZeroU64>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub since: ::std::option::Option<::chrono::DateTime<::chrono::offset::Utc>>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub until: ::std::option::Option<::chrono::DateTime<::chrono::offset::Utc>>,
}
impl ::std::convert::From<&Payload> for Payload {
fn from(value: &Payload) -> Self {
value.clone()
}
}
impl ::std::default::Default for Payload {
fn default() -> Self {
Self {
by_consumer: Default::default(),
context_id: Default::default(),
cursor: Default::default(),
entry_id: Default::default(),
ext: Default::default(),
kind_filter: Default::default(),
page_size: Default::default(),
since: Default::default(),
until: Default::default(),
}
}
}
///Optional filter — usage by this consumer DID only. Useful for "what has AI agent X been doing on my behalf".
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Optional filter — usage by this consumer DID only. Useful for \"what has AI agent X been doing on my behalf\".",
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct PayloadByConsumer(::std::string::String);
impl ::std::ops::Deref for PayloadByConsumer {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<PayloadByConsumer> for ::std::string::String {
fn from(value: PayloadByConsumer) -> Self {
value.0
}
}
impl ::std::convert::From<&PayloadByConsumer> for PayloadByConsumer {
fn from(value: &PayloadByConsumer) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for PayloadByConsumer {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for PayloadByConsumer {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for PayloadByConsumer {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for PayloadByConsumer {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for PayloadByConsumer {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///Optional filter — usage within this trust context only.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Optional filter — usage within this trust context only.",
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct PayloadContextId(::std::string::String);
impl ::std::ops::Deref for PayloadContextId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<PayloadContextId> for ::std::string::String {
fn from(value: PayloadContextId) -> Self {
value.0
}
}
impl ::std::convert::From<&PayloadContextId> for PayloadContextId {
fn from(value: &PayloadContextId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for PayloadContextId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for PayloadContextId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for PayloadContextId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for PayloadContextId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for PayloadContextId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///Optional filter — usage for this entry only.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "Optional filter — usage for this entry only.",
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct PayloadEntryId(::std::string::String);
impl ::std::ops::Deref for PayloadEntryId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<PayloadEntryId> for ::std::string::String {
fn from(value: PayloadEntryId) -> Self {
value.0
}
}
impl ::std::convert::From<&PayloadEntryId> for PayloadEntryId {
fn from(value: &PayloadEntryId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for PayloadEntryId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for PayloadEntryId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for PayloadEntryId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for PayloadEntryId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for PayloadEntryId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`PayloadKindFilterItem`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "enum": [
/// "proxy-login",
/// "release"
/// ]
///}
/// ```
/// </details>
#[derive(
::serde::Deserialize,
::serde::Serialize,
Clone,
Copy,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
)]
pub enum PayloadKindFilterItem {
#[serde(rename = "proxy-login")]
ProxyLogin,
#[serde(rename = "release")]
Release,
}
impl ::std::convert::From<&Self> for PayloadKindFilterItem {
fn from(value: &PayloadKindFilterItem) -> Self {
value.clone()
}
}
impl ::std::fmt::Display for PayloadKindFilterItem {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
match *self {
Self::ProxyLogin => f.write_str("proxy-login"),
Self::Release => f.write_str("release"),
}
}
}
impl ::std::str::FromStr for PayloadKindFilterItem {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
match value {
"proxy-login" => Ok(Self::ProxyLogin),
"release" => Ok(Self::Release),
_ => Err("invalid value".into()),
}
}
}
impl ::std::convert::TryFrom<&str> for PayloadKindFilterItem {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for PayloadKindFilterItem {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for PayloadKindFilterItem {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
///`Response`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "title": "Response",
/// "type": "object",
/// "required": [
/// "truncated",
/// "uses"
/// ],
/// "properties": {
/// "cursor": {
/// "type": "string"
/// },
/// "ext": {
/// "$ref": "#/definitions/Ext"
/// },
/// "truncated": {
/// "type": "boolean"
/// },
/// "uses": {
/// "type": "array",
/// "items": {
/// "$ref": "#/definitions/UsageRecord"
/// }
/// }
/// },
/// "additionalProperties": false,
/// "$anchor": "response"
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
pub struct Response {
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub cursor: ::std::option::Option<::std::string::String>,
#[serde(default, skip_serializing_if = "::std::option::Option::is_none")]
pub ext: ::std::option::Option<Ext>,
pub truncated: bool,
pub uses: ::std::vec::Vec<UsageRecord>,
}
impl ::std::convert::From<&Response> for Response {
fn from(value: &Response) -> Self {
value.clone()
}
}
///`UsageRecord`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "title": "UsageRecord",
/// "type": "object",
/// "required": [
/// "consumerDid",
/// "contextId",
/// "entryId",
/// "id",
/// "kind",
/// "occurredAt",
/// "outcome"
/// ],
/// "properties": {
/// "consumerDid": {
/// "description": "DID of the Companion/Service that initiated the use.",
/// "type": "string",
/// "minLength": 1
/// },
/// "contextId": {
/// "type": "string",
/// "minLength": 1
/// },
/// "deviceId": {
/// "type": "string",
/// "minLength": 1
/// },
/// "entryId": {
/// "type": "string",
/// "minLength": 1
/// },
/// "errorCode": {
/// "description": "Trust Task error code when outcome is a failure.",
/// "type": "string"
/// },
/// "id": {
/// "type": "string",
/// "minLength": 1
/// },
/// "kind": {
/// "type": "string",
/// "enum": [
/// "proxy-login",
/// "release"
/// ]
/// },
/// "occurredAt": {
/// "type": "string",
/// "format": "date-time"
/// },
/// "outcome": {
/// "type": "string",
/// "enum": [
/// "allowed",
/// "denied",
/// "step_up_required",
/// "step_up_satisfied",
/// "target_unreachable",
/// "credential_rejected",
/// "policy_deny"
/// ]
/// },
/// "policyDecisionId": {
/// "description": "Pointer to the policy evaluation record for forensic detail.",
/// "type": "string"
/// },
/// "sessionId": {
/// "description": "For successful proxy-logins, the maintainer-assigned session id; absent for releases and for failures.",
/// "type": "string",
/// "minLength": 1
/// }
/// },
/// "additionalProperties": false
///}
/// ```
/// </details>
#[derive(::serde::Deserialize, ::serde::Serialize, Clone, Debug)]
#[serde(deny_unknown_fields)]
pub struct UsageRecord {
///DID of the Companion/Service that initiated the use.
#[serde(rename = "consumerDid")]
pub consumer_did: UsageRecordConsumerDid,
#[serde(rename = "contextId")]
pub context_id: UsageRecordContextId,
#[serde(
rename = "deviceId",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub device_id: ::std::option::Option<UsageRecordDeviceId>,
#[serde(rename = "entryId")]
pub entry_id: UsageRecordEntryId,
///Trust Task error code when outcome is a failure.
#[serde(
rename = "errorCode",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub error_code: ::std::option::Option<::std::string::String>,
pub id: UsageRecordId,
pub kind: UsageRecordKind,
#[serde(rename = "occurredAt")]
pub occurred_at: ::chrono::DateTime<::chrono::offset::Utc>,
pub outcome: UsageRecordOutcome,
///Pointer to the policy evaluation record for forensic detail.
#[serde(
rename = "policyDecisionId",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub policy_decision_id: ::std::option::Option<::std::string::String>,
///For successful proxy-logins, the maintainer-assigned session id; absent for releases and for failures.
#[serde(
rename = "sessionId",
default,
skip_serializing_if = "::std::option::Option::is_none"
)]
pub session_id: ::std::option::Option<UsageRecordSessionId>,
}
impl ::std::convert::From<&UsageRecord> for UsageRecord {
fn from(value: &UsageRecord) -> Self {
value.clone()
}
}
///DID of the Companion/Service that initiated the use.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "DID of the Companion/Service that initiated the use.",
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UsageRecordConsumerDid(::std::string::String);
impl ::std::ops::Deref for UsageRecordConsumerDid {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<UsageRecordConsumerDid> for ::std::string::String {
fn from(value: UsageRecordConsumerDid) -> Self {
value.0
}
}
impl ::std::convert::From<&UsageRecordConsumerDid> for UsageRecordConsumerDid {
fn from(value: &UsageRecordConsumerDid) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for UsageRecordConsumerDid {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordConsumerDid {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordConsumerDid {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordConsumerDid {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for UsageRecordConsumerDid {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`UsageRecordContextId`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UsageRecordContextId(::std::string::String);
impl ::std::ops::Deref for UsageRecordContextId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<UsageRecordContextId> for ::std::string::String {
fn from(value: UsageRecordContextId) -> Self {
value.0
}
}
impl ::std::convert::From<&UsageRecordContextId> for UsageRecordContextId {
fn from(value: &UsageRecordContextId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for UsageRecordContextId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordContextId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordContextId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordContextId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for UsageRecordContextId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`UsageRecordDeviceId`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UsageRecordDeviceId(::std::string::String);
impl ::std::ops::Deref for UsageRecordDeviceId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<UsageRecordDeviceId> for ::std::string::String {
fn from(value: UsageRecordDeviceId) -> Self {
value.0
}
}
impl ::std::convert::From<&UsageRecordDeviceId> for UsageRecordDeviceId {
fn from(value: &UsageRecordDeviceId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for UsageRecordDeviceId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordDeviceId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordDeviceId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordDeviceId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for UsageRecordDeviceId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`UsageRecordEntryId`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UsageRecordEntryId(::std::string::String);
impl ::std::ops::Deref for UsageRecordEntryId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<UsageRecordEntryId> for ::std::string::String {
fn from(value: UsageRecordEntryId) -> Self {
value.0
}
}
impl ::std::convert::From<&UsageRecordEntryId> for UsageRecordEntryId {
fn from(value: &UsageRecordEntryId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for UsageRecordEntryId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordEntryId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordEntryId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordEntryId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for UsageRecordEntryId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`UsageRecordId`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UsageRecordId(::std::string::String);
impl ::std::ops::Deref for UsageRecordId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<UsageRecordId> for ::std::string::String {
fn from(value: UsageRecordId) -> Self {
value.0
}
}
impl ::std::convert::From<&UsageRecordId> for UsageRecordId {
fn from(value: &UsageRecordId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for UsageRecordId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for UsageRecordId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
///`UsageRecordKind`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "enum": [
/// "proxy-login",
/// "release"
/// ]
///}
/// ```
/// </details>
#[derive(
::serde::Deserialize,
::serde::Serialize,
Clone,
Copy,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
)]
pub enum UsageRecordKind {
#[serde(rename = "proxy-login")]
ProxyLogin,
#[serde(rename = "release")]
Release,
}
impl ::std::convert::From<&Self> for UsageRecordKind {
fn from(value: &UsageRecordKind) -> Self {
value.clone()
}
}
impl ::std::fmt::Display for UsageRecordKind {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
match *self {
Self::ProxyLogin => f.write_str("proxy-login"),
Self::Release => f.write_str("release"),
}
}
}
impl ::std::str::FromStr for UsageRecordKind {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
match value {
"proxy-login" => Ok(Self::ProxyLogin),
"release" => Ok(Self::Release),
_ => Err("invalid value".into()),
}
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordKind {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordKind {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordKind {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
///`UsageRecordOutcome`
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "type": "string",
/// "enum": [
/// "allowed",
/// "denied",
/// "step_up_required",
/// "step_up_satisfied",
/// "target_unreachable",
/// "credential_rejected",
/// "policy_deny"
/// ]
///}
/// ```
/// </details>
#[derive(
::serde::Deserialize,
::serde::Serialize,
Clone,
Copy,
Debug,
Eq,
Hash,
Ord,
PartialEq,
PartialOrd,
)]
pub enum UsageRecordOutcome {
#[serde(rename = "allowed")]
Allowed,
#[serde(rename = "denied")]
Denied,
#[serde(rename = "step_up_required")]
StepUpRequired,
#[serde(rename = "step_up_satisfied")]
StepUpSatisfied,
#[serde(rename = "target_unreachable")]
TargetUnreachable,
#[serde(rename = "credential_rejected")]
CredentialRejected,
#[serde(rename = "policy_deny")]
PolicyDeny,
}
impl ::std::convert::From<&Self> for UsageRecordOutcome {
fn from(value: &UsageRecordOutcome) -> Self {
value.clone()
}
}
impl ::std::fmt::Display for UsageRecordOutcome {
fn fmt(&self, f: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result {
match *self {
Self::Allowed => f.write_str("allowed"),
Self::Denied => f.write_str("denied"),
Self::StepUpRequired => f.write_str("step_up_required"),
Self::StepUpSatisfied => f.write_str("step_up_satisfied"),
Self::TargetUnreachable => f.write_str("target_unreachable"),
Self::CredentialRejected => f.write_str("credential_rejected"),
Self::PolicyDeny => f.write_str("policy_deny"),
}
}
}
impl ::std::str::FromStr for UsageRecordOutcome {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
match value {
"allowed" => Ok(Self::Allowed),
"denied" => Ok(Self::Denied),
"step_up_required" => Ok(Self::StepUpRequired),
"step_up_satisfied" => Ok(Self::StepUpSatisfied),
"target_unreachable" => Ok(Self::TargetUnreachable),
"credential_rejected" => Ok(Self::CredentialRejected),
"policy_deny" => Ok(Self::PolicyDeny),
_ => Err("invalid value".into()),
}
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordOutcome {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordOutcome {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordOutcome {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
///For successful proxy-logins, the maintainer-assigned session id; absent for releases and for failures.
///
/// <details><summary>JSON schema</summary>
///
/// ```json
///{
/// "description": "For successful proxy-logins, the maintainer-assigned session id; absent for releases and for failures.",
/// "type": "string",
/// "minLength": 1
///}
/// ```
/// </details>
#[derive(::serde::Serialize, Clone, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
#[serde(transparent)]
pub struct UsageRecordSessionId(::std::string::String);
impl ::std::ops::Deref for UsageRecordSessionId {
type Target = ::std::string::String;
fn deref(&self) -> &::std::string::String {
&self.0
}
}
impl ::std::convert::From<UsageRecordSessionId> for ::std::string::String {
fn from(value: UsageRecordSessionId) -> Self {
value.0
}
}
impl ::std::convert::From<&UsageRecordSessionId> for UsageRecordSessionId {
fn from(value: &UsageRecordSessionId) -> Self {
value.clone()
}
}
impl ::std::str::FromStr for UsageRecordSessionId {
type Err = self::error::ConversionError;
fn from_str(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
if value.chars().count() < 1usize {
return Err("shorter than 1 characters".into());
}
Ok(Self(value.to_string()))
}
}
impl ::std::convert::TryFrom<&str> for UsageRecordSessionId {
type Error = self::error::ConversionError;
fn try_from(value: &str) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<&::std::string::String> for UsageRecordSessionId {
type Error = self::error::ConversionError;
fn try_from(
value: &::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl ::std::convert::TryFrom<::std::string::String> for UsageRecordSessionId {
type Error = self::error::ConversionError;
fn try_from(
value: ::std::string::String,
) -> ::std::result::Result<Self, self::error::ConversionError> {
value.parse()
}
}
impl<'de> ::serde::Deserialize<'de> for UsageRecordSessionId {
fn deserialize<D>(deserializer: D) -> ::std::result::Result<Self, D::Error>
where
D: ::serde::Deserializer<'de>,
{
::std::string::String::deserialize(deserializer)?
.parse()
.map_err(|e: self::error::ConversionError| {
<D::Error as ::serde::de::Error>::custom(e.to_string())
})
}
}
impl crate::Payload for Payload {
const TYPE_URI: &'static str = "https://trusttasks.org/spec/vault/usage/0.1";
}
impl crate::Payload for Response {
const TYPE_URI: &'static str = "https://trusttasks.org/spec/vault/usage/0.1#response";
}
#[cfg(feature = "validate")]
impl crate::validate::ValidatedPayload for Payload {
const SCHEMA_JSON: &'static str = "{\n \"$defs\": {\n \"Ext\": {\n \"additionalProperties\": true,\n \"description\": \"Vendor-namespaced extension object per SPEC.md §4.5.1. Each immediate key MUST be a reverse-DNS namespace; structure under each namespace is opaque to the framework.\",\n \"minProperties\": 1,\n \"propertyNames\": {\n \"pattern\": \"^[a-z][a-z0-9-]*(\\\\.[a-z0-9-]+)+$\"\n },\n \"title\": \"Ext\",\n \"type\": \"object\"\n },\n \"Response\": {\n \"$anchor\": \"response\",\n \"additionalProperties\": false,\n \"properties\": {\n \"cursor\": {\n \"type\": \"string\"\n },\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n },\n \"truncated\": {\n \"type\": \"boolean\"\n },\n \"uses\": {\n \"items\": {\n \"$ref\": \"#/$defs/UsageRecord\"\n },\n \"type\": \"array\"\n }\n },\n \"required\": [\n \"uses\",\n \"truncated\"\n ],\n \"title\": \"Vault Usage — response payload\",\n \"type\": \"object\"\n },\n \"UsageRecord\": {\n \"additionalProperties\": false,\n \"properties\": {\n \"consumerDid\": {\n \"description\": \"DID of the Companion/Service that initiated the use.\",\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"contextId\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"deviceId\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"entryId\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"errorCode\": {\n \"description\": \"Trust Task error code when outcome is a failure.\",\n \"type\": \"string\"\n },\n \"id\": {\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"kind\": {\n \"enum\": [\n \"proxy-login\",\n \"release\"\n ],\n \"type\": \"string\"\n },\n \"occurredAt\": {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n \"outcome\": {\n \"enum\": [\n \"allowed\",\n \"denied\",\n \"step_up_required\",\n \"step_up_satisfied\",\n \"target_unreachable\",\n \"credential_rejected\",\n \"policy_deny\"\n ],\n \"type\": \"string\"\n },\n \"policyDecisionId\": {\n \"description\": \"Pointer to the policy evaluation record for forensic detail.\",\n \"type\": \"string\"\n },\n \"sessionId\": {\n \"description\": \"For successful proxy-logins, the maintainer-assigned session id; absent for releases and for failures.\",\n \"minLength\": 1,\n \"type\": \"string\"\n }\n },\n \"required\": [\n \"id\",\n \"entryId\",\n \"contextId\",\n \"consumerDid\",\n \"kind\",\n \"outcome\",\n \"occurredAt\"\n ],\n \"title\": \"UsageRecord\",\n \"type\": \"object\"\n }\n },\n \"$id\": \"https://trusttasks.org/spec/vault/usage/0.1\",\n \"$schema\": \"https://json-schema.org/draft/2020-12/schema\",\n \"additionalProperties\": false,\n \"description\": \"Consumer queries the maintainer's audit log of recent vault uses (proxy-logins, releases). Drives UIs like \\\"recent activity\\\" and \\\"which AI agent has been using my GitHub credential\\\". Read-only.\",\n \"properties\": {\n \"byConsumer\": {\n \"description\": \"Optional filter — usage by this consumer DID only. Useful for \\\"what has AI agent X been doing on my behalf\\\".\",\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"contextId\": {\n \"description\": \"Optional filter — usage within this trust context only.\",\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"cursor\": {\n \"type\": \"string\"\n },\n \"entryId\": {\n \"description\": \"Optional filter — usage for this entry only.\",\n \"minLength\": 1,\n \"type\": \"string\"\n },\n \"ext\": {\n \"$ref\": \"#/$defs/Ext\"\n },\n \"kindFilter\": {\n \"items\": {\n \"enum\": [\n \"proxy-login\",\n \"release\"\n ],\n \"type\": \"string\"\n },\n \"type\": \"array\",\n \"uniqueItems\": true\n },\n \"pageSize\": {\n \"maximum\": 1000,\n \"minimum\": 1,\n \"type\": \"integer\"\n },\n \"since\": {\n \"format\": \"date-time\",\n \"type\": \"string\"\n },\n \"until\": {\n \"format\": \"date-time\",\n \"type\": \"string\"\n }\n },\n \"title\": \"Vault Usage — payload\",\n \"type\": \"object\"\n}\n";
}