a3s 0.10.5

a3s — A3S coding agent CLI; `a3s code` launches the interactive TUI
Documentation
use serde::{Deserialize, Serialize};

use a3s_boot::ilink::SecretValue;

const WEIXIN_CAPABILITY_SCHEMA_VERSION: u32 = 2;

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) enum WeixinCapabilityState {
    Unavailable,
    Unbound,
    Binding,
    Active,
    Paused,
    Degraded,
    StaleCredential,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) enum WeixinProtocolMode {
    Disabled,
    Mock,
    Tencent,
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
pub(super) enum RemoteScope {
    #[serde(rename = "agents.read")]
    AgentsRead,
    #[serde(rename = "sessions.read")]
    SessionsRead,
    #[serde(rename = "sessions.content.read")]
    SessionsContentRead,
    #[serde(rename = "sessions.message.write")]
    SessionsMessageWrite,
    #[serde(rename = "sessions.create")]
    SessionsCreate,
    #[serde(rename = "sessions.archive")]
    SessionsArchive,
}

#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct SafeBlocker {
    pub(super) code: String,
    pub(super) message: String,
}

#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct WeixinCapabilityResponse {
    pub(super) schema_version: u32,
    pub(super) state: WeixinCapabilityState,
    pub(super) protocol_mode: WeixinProtocolMode,
    pub(super) supported_scopes: Vec<RemoteScope>,
    pub(super) release_blockers: Vec<SafeBlocker>,
}

impl WeixinCapabilityResponse {
    pub(super) fn unavailable() -> Self {
        Self {
            schema_version: WEIXIN_CAPABILITY_SCHEMA_VERSION,
            state: WeixinCapabilityState::Unavailable,
            protocol_mode: WeixinProtocolMode::Disabled,
            supported_scopes: Vec::new(),
            release_blockers: vec![SafeBlocker {
                code: "ilink_channel_unavailable".to_string(),
                message: "The Weixin iLink channel is not enabled in this runtime.".to_string(),
            }],
        }
    }

    pub(super) fn mock(state: WeixinCapabilityState) -> Self {
        Self {
            schema_version: WEIXIN_CAPABILITY_SCHEMA_VERSION,
            state,
            protocol_mode: WeixinProtocolMode::Mock,
            supported_scopes: vec![RemoteScope::AgentsRead, RemoteScope::SessionsRead],
            release_blockers: vec![SafeBlocker {
                code: "mock_runtime_only".to_string(),
                message: "The WeChat integration is using a local mock runtime.".to_string(),
            }],
        }
    }

    pub(super) fn unavailable_with(blocker: SafeBlocker) -> Self {
        Self {
            schema_version: WEIXIN_CAPABILITY_SCHEMA_VERSION,
            state: WeixinCapabilityState::Unavailable,
            protocol_mode: WeixinProtocolMode::Disabled,
            supported_scopes: Vec::new(),
            release_blockers: vec![blocker],
        }
    }

    pub(super) fn production(state: WeixinCapabilityState) -> Self {
        Self {
            schema_version: WEIXIN_CAPABILITY_SCHEMA_VERSION,
            state,
            protocol_mode: WeixinProtocolMode::Tencent,
            supported_scopes: vec![RemoteScope::AgentsRead, RemoteScope::SessionsRead],
            release_blockers: Vec::new(),
        }
    }

    pub(super) fn production_unavailable(blocker: SafeBlocker) -> Self {
        Self {
            schema_version: WEIXIN_CAPABILITY_SCHEMA_VERSION,
            state: WeixinCapabilityState::Unavailable,
            protocol_mode: WeixinProtocolMode::Tencent,
            supported_scopes: vec![RemoteScope::AgentsRead, RemoteScope::SessionsRead],
            release_blockers: vec![blocker],
        }
    }
}

#[derive(Clone, Copy, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) enum WeixinMonitorState {
    Disabled,
    Stopped,
    Starting,
    Paused,
    Running,
    Degraded,
    StaleCredential,
}

#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub(super) struct WeixinAccountResponse {
    pub(super) schema_version: u32,
    pub(super) state: WeixinCapabilityState,
    pub(super) protocol_mode: WeixinProtocolMode,
    pub(super) bound: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub(super) owner_label: Option<String>,
    pub(super) monitor_state: WeixinMonitorState,
    pub(super) mutations_enabled: bool,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub(super) last_update_at: Option<String>,
    #[serde(default, skip_serializing_if = "Option::is_none")]
    pub(super) last_error: Option<SafeBlocker>,
}

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize)]
#[serde(default, rename_all = "camelCase", deny_unknown_fields)]
pub(super) struct StartWeixinLoginRequest {
    pub(super) force: bool,
}

#[derive(Clone, Deserialize)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub(super) struct SubmitWeixinVerificationRequest {
    pub(super) code: SecretValue,
}

#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Deserialize)]
#[serde(default, rename_all = "camelCase", deny_unknown_fields)]
pub(super) struct WeixinAccountActionRequest {}