| /* | |
| * Licensed to the Apache Software Foundation (ASF) under one | |
| * or more contributor license agreements. See the NOTICE file | |
| * distributed with this work for additional information | |
| * regarding copyright ownership. The ASF licenses this file | |
| * to you under the Apache License, Version 2.0 (the | |
| * "License"); you may not use this file except in compliance | |
| * with the License. You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, | |
| * software distributed under the License is distributed on an | |
| * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | |
| * KIND, either express or implied. See the License for the | |
| * specific language governing permissions and limitations | |
| * under the License. | |
| */ | |
| use maka_agent_facts::configuration::CatalogMutationResult; | |
| use maka_agent_facts::configuration::ModelSelection; | |
| use maka_agent_facts::configuration::SetDefaultConnectionTargetInput; | |
| use maka_plugin_core::contract::{Contract, Interface, Method, MethodMode, Transport}; | |
| use schemars::JsonSchema; | |
| use serde::{Deserialize, Serialize}; | |
| use std::collections::BTreeMap; | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelsRead")] | |
| pub enum ModelsRead { | |
| Start { | |
| #[serde(default)] | |
| query: String, | |
| }, | |
| Continue { | |
| #[schemars(range(max = 9_007_199_254_740_991u64))] | |
| revision: u64, | |
| cursor: ModelCursor, | |
| }, | |
| } | |
| #[derive(Clone, Serialize, Deserialize, JsonSchema)] | |
| #[serde(deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelCursor")] | |
| pub struct ModelCursor { | |
| pub query: String, | |
| pub connection: usize, | |
| pub model: usize, | |
| } | |
| #[derive(Serialize, JsonSchema, Deserialize)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelChoice")] | |
| pub struct ModelChoice { | |
| #[serde(default, skip_serializing_if = "Option::is_none")] | |
| pub tools: Option<ModelToolPreferences>, | |
| #[serde(default, skip_serializing_if = "Option::is_none")] | |
| pub limits: Option<ModelLimitSettings>, | |
| pub selection: ModelSelection, | |
| pub connection_name: String, | |
| pub label: String, | |
| #[schemars(length(max = 8))] | |
| pub thinking_levels: Vec<maka_agent_facts::execution::ThinkingLevel>, | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<maka_agent_facts::execution::ThinkingLevel>" | |
| )] | |
| pub default_thinking_level: Option<maka_agent_facts::execution::ThinkingLevel>, | |
| } | |
| #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelToolPreferences")] | |
| pub struct ModelToolPreferences { | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<bool>")] | |
| pub code_mode: Option<bool>, | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<maka_agent_facts::execution::CodeLanguage>" | |
| )] | |
| pub code_mode_language: Option<maka_agent_facts::execution::CodeLanguage>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<bool>")] | |
| pub apply_patch: Option<bool>, | |
| } | |
| #[derive(Clone, Default, Serialize, Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelLimits")] | |
| pub struct ModelLimits { | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub context_window: Option<u64>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub input_limit: Option<u64>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub max_output_tokens: Option<u64>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub compaction_threshold: Option<u64>, | |
| } | |
| #[derive(Serialize, Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelLimitSettings")] | |
| pub struct ModelLimitSettings { | |
| pub overrides: ModelLimits, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub context_window: Option<u64>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub input_limit: Option<u64>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<u64>")] | |
| pub max_output_tokens: Option<u64>, | |
| } | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsUpdateModelSettings")] | |
| pub struct UpdateModelSettings { | |
| pub selection: ModelSelection, | |
| pub tools: ModelToolPreferences, | |
| pub limits: ModelLimits, | |
| } | |
| #[derive(Serialize, JsonSchema, Deserialize)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsDefaultModel")] | |
| pub enum DefaultModel { | |
| None, | |
| Unavailable { | |
| target: maka_agent_facts::configuration::ConnectionTarget, | |
| }, | |
| Ready { | |
| choice: ModelChoice, | |
| }, | |
| } | |
| #[derive(Serialize, JsonSchema, Deserialize)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsModelsPage")] | |
| pub enum ModelsPage { | |
| Changed { | |
| revision: u64, | |
| }, | |
| Ready { | |
| revision: u64, | |
| #[schemars(length(max = 16))] | |
| choices: Vec<ModelChoice>, | |
| #[serde(rename = "defaultModel")] | |
| default_model: Box<DefaultModel>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<ModelCursor>")] | |
| next: Option<ModelCursor>, | |
| }, | |
| } | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsConnectionsRead")] | |
| pub enum ConnectionsRead { | |
| Start, | |
| Continue { revision: u64, offset: usize }, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsConnectionSummary")] | |
| pub struct ConnectionSummary { | |
| /// Editing controls implemented by this Settings service for the provider. | |
| pub editable: bool, | |
| pub basis: maka_agent_facts::configuration::ConnectionVersionBasis, | |
| pub slug: String, | |
| pub name: String, | |
| pub provider: maka_agent_facts::provider::Identity, | |
| pub enabled: bool, | |
| pub enabled_model_count: usize, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde( | |
| tag = "kind", | |
| rename_all = "snake_case", | |
| rename_all_fields = "camelCase", | |
| deny_unknown_fields | |
| )] | |
| #[schemars(rename = "SettingsConnectionsPage")] | |
| pub enum ConnectionsPage { | |
| Changed { | |
| revision: u64, | |
| }, | |
| Ready { | |
| revision: u64, | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<maka_agent_facts::configuration::ConnectionTarget>" | |
| )] | |
| default_target: Option<maka_agent_facts::configuration::ConnectionTarget>, | |
| #[schemars(length(max = 16))] | |
| connections: Vec<ConnectionSummary>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<usize>")] | |
| next: Option<usize>, | |
| }, | |
| } | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsConnectionRead")] | |
| pub struct ConnectionRead { | |
| pub connection_id: String, | |
| pub revision: u64, | |
| /// Opt in to the complete editing projection; credential reads stay narrow. | |
| #[serde(default)] | |
| pub include_editing_facts: bool, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsConnectionEditingFacts")] | |
| pub struct ConnectionEditingFacts { | |
| pub enabled_model_ids: Vec<String>, | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<BTreeMap<String, maka_agent_facts::configuration::ModelOverride>>" | |
| )] | |
| pub model_overrides: Option<BTreeMap<String, maka_agent_facts::configuration::ModelOverride>>, | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<BTreeMap<String, serde_json::Value>>" | |
| )] | |
| pub request_body_overlay: Option<serde_json::Value>, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde( | |
| tag = "kind", | |
| rename_all = "snake_case", | |
| rename_all_fields = "camelCase", | |
| deny_unknown_fields | |
| )] | |
| #[schemars(rename = "SettingsConnectionDetail")] | |
| pub enum ConnectionDetail { | |
| Stale { | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<maka_agent_facts::configuration::ConnectionVersionBasis>" | |
| )] | |
| actual: Option<maka_agent_facts::configuration::ConnectionVersionBasis>, | |
| }, | |
| Ready { | |
| target: Box<maka_agent_facts::configuration::ConnectionCredentialTarget>, | |
| name: String, | |
| enabled: bool, | |
| enabled_model_count: usize, | |
| #[serde(default, skip_serializing_if = "Option::is_none")] | |
| #[schemars(with = "ConnectionEditingFacts")] | |
| editing: Option<ConnectionEditingFacts>, | |
| }, | |
| } | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(deny_unknown_fields)] | |
| #[schemars(rename = "SettingsProvidersRead")] | |
| pub struct ProvidersRead { | |
| pub offset: usize, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(deny_unknown_fields)] | |
| #[schemars(rename = "SettingsProvider")] | |
| pub struct Provider { | |
| pub identity: maka_agent_facts::provider::Identity, | |
| pub descriptor: maka_agent_ports::provider::Descriptor, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(deny_unknown_fields)] | |
| #[schemars(rename = "SettingsProviderAuthenticationSummary")] | |
| pub struct ProviderAuthenticationSummary { | |
| pub label: String, | |
| pub interactive: bool, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(deny_unknown_fields)] | |
| #[schemars(rename = "SettingsProviderSummary")] | |
| pub struct ProviderSummary { | |
| pub identity: maka_agent_facts::provider::Identity, | |
| pub label: String, | |
| pub authentication: Vec<ProviderAuthenticationSummary>, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(deny_unknown_fields)] | |
| #[schemars(rename = "SettingsProvidersPage")] | |
| pub struct ProvidersPage { | |
| pub providers: Vec<ProviderSummary>, | |
| #[schemars(with = "maka_plugin_core::wire_schema::RequiredNullable<usize>")] | |
| pub next: Option<usize>, | |
| } | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsSaveCredential")] | |
| pub struct SaveCredential { | |
| pub expected: maka_agent_facts::configuration::ConnectionCredentialTarget, | |
| #[serde(deserialize_with = "Option::deserialize")] | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<maka_agent_facts::configuration::CredentialVersionBasis>" | |
| )] | |
| pub expected_credential: Option<maka_agent_facts::configuration::CredentialVersionBasis>, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsCredentialSaveResult")] | |
| pub enum CredentialSaveResult { | |
| Saved { | |
| connection: maka_agent_facts::oauth::ConnectionIdentity, | |
| }, | |
| Rejected { | |
| reason: CredentialRejection, | |
| }, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(rename_all = "snake_case")] | |
| #[schemars(rename = "SettingsCredentialRejection")] | |
| pub enum CredentialRejection { | |
| InvalidInput, | |
| InvalidSecret, | |
| SecretUnavailable, | |
| ProviderUnavailable, | |
| AuthenticationUnavailable, | |
| AttemptConflict, | |
| ConnectionChanged, | |
| CredentialChanged, | |
| SlugTaken, | |
| Authentication, | |
| } | |
| #[derive(Deserialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsCredentialLogin")] | |
| pub struct LoginCredential { | |
| pub expected: maka_agent_facts::configuration::ConnectionCredentialTarget, | |
| #[serde(deserialize_with = "Option::deserialize")] | |
| #[schemars( | |
| with = "maka_plugin_core::wire_schema::RequiredNullable<maka_agent_facts::configuration::CredentialVersionBasis>" | |
| )] | |
| pub expected_credential: Option<maka_agent_facts::configuration::CredentialVersionBasis>, | |
| pub method: String, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(rename_all = "camelCase", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsLoginPrompt")] | |
| pub struct LoginPrompt { | |
| pub url: String, | |
| pub user_code: String, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsCredentialLoginResult")] | |
| pub enum CredentialLoginResult { | |
| Saved { | |
| connection: maka_agent_facts::oauth::ConnectionIdentity, | |
| }, | |
| Rejected { | |
| reason: CredentialRejection, | |
| }, | |
| Failed { | |
| reason: LoginFailure, | |
| message: String, | |
| }, | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(rename_all = "snake_case")] | |
| #[schemars(rename = "SettingsLoginFailure")] | |
| pub enum LoginFailure { | |
| Cancelled, | |
| Expired, | |
| Transport, | |
| Authentication, | |
| } | |
| fn schema<T: JsonSchema>(contract: schemars::generate::Contract) -> serde_json::Value { | |
| let settings = | |
| schemars::generate::SchemaSettings::default().with(|settings| settings.contract = contract); | |
| serde_json::to_value(settings.into_generator().into_root_schema_for::<T>()) | |
| .expect("settings schema") | |
| } | |
| fn method<I: JsonSchema, O: JsonSchema>(mode: MethodMode) -> Method { | |
| Method { | |
| progress: None, | |
| mode, | |
| input: schema::<I>(schemars::generate::Contract::Deserialize).into(), | |
| output: schema::<O>(schemars::generate::Contract::Serialize).into(), | |
| resources: BTreeMap::new(), | |
| } | |
| } | |
| pub fn authentication_contract() -> Contract { | |
| Contract { | |
| name: "maka.settings.Authentication".into(), | |
| version: 1, | |
| transport: Transport::Remote, | |
| interface: Interface::Service { | |
| methods: BTreeMap::from([ | |
| ( | |
| "provider".into(), | |
| method::<maka_agent_facts::provider::Identity, Provider>(MethodMode::Query), | |
| ), | |
| ( | |
| "loginCredential".into(), | |
| Method { | |
| progress: Some( | |
| schema::<LoginPrompt>(schemars::generate::Contract::Serialize).into(), | |
| ), | |
| ..method::<LoginCredential, CredentialLoginResult>(MethodMode::Mutation) | |
| }, | |
| ), | |
| ]), | |
| }, | |
| } | |
| } | |
| pub fn contract() -> Contract { | |
| Contract { | |
| name: "maka.settings.Settings".into(), | |
| version: 1, | |
| transport: Transport::Remote, | |
| interface: Interface::Service { | |
| methods: BTreeMap::from([ | |
| ( | |
| "network".into(), | |
| method::<crate::network::Read, crate::network::Snapshot>(MethodMode::Query), | |
| ), | |
| ( | |
| "updateNetwork".into(), | |
| Method { | |
| resources: BTreeMap::from([( | |
| "secret".into(), | |
| maka_plugin_core::contract::ResourceType { | |
| name: "maka.text.utf8".into(), | |
| version: 1, | |
| } | |
| .optional(), | |
| )]), | |
| ..method::<crate::network::Update, crate::network::Updated>( | |
| MethodMode::Mutation, | |
| ) | |
| }, | |
| ), | |
| ( | |
| "usage".into(), | |
| method::<crate::usage::Read, crate::usage::Page>(MethodMode::Query), | |
| ), | |
| ( | |
| "usageSummary".into(), | |
| method::<crate::usage::SummaryRead, crate::usage::Report>(MethodMode::Query), | |
| ), | |
| ( | |
| "prices".into(), | |
| method::<maka_agent_facts::pricing::Query, maka_agent_facts::pricing::Page>( | |
| MethodMode::Query, | |
| ), | |
| ), | |
| ( | |
| "updatePrice".into(), | |
| method::<maka_agent_facts::pricing::Update, crate::usage::PricingResult>( | |
| MethodMode::Mutation, | |
| ), | |
| ), | |
| ( | |
| "assistantPreferences".into(), | |
| method::<crate::preferences::Read, crate::preferences::Preferences>( | |
| MethodMode::Query, | |
| ), | |
| ), | |
| ( | |
| "updateAssistantPreferences".into(), | |
| method::<crate::preferences::Update, crate::preferences::Updated>( | |
| MethodMode::Mutation, | |
| ), | |
| ), | |
| ( | |
| "connections".into(), | |
| method::<ConnectionsRead, ConnectionsPage>(MethodMode::Query), | |
| ), | |
| ( | |
| "connection".into(), | |
| method::<ConnectionRead, ConnectionDetail>(MethodMode::Query), | |
| ), | |
| ( | |
| "providers".into(), | |
| method::<ProvidersRead, ProvidersPage>(MethodMode::Query), | |
| ), | |
| ( | |
| "create".into(), | |
| method::< | |
| maka_agent_facts::configuration::CreateCatalogConnectionInput, | |
| CatalogMutationResult, | |
| >(MethodMode::Mutation), | |
| ), | |
| ( | |
| "update".into(), | |
| method::< | |
| maka_agent_facts::configuration::UpdateCatalogConnectionInput, | |
| CatalogMutationResult, | |
| >(MethodMode::Mutation), | |
| ), | |
| ( | |
| "remove".into(), | |
| method::< | |
| maka_agent_facts::configuration::RemoveCatalogConnectionInput, | |
| CatalogMutationResult, | |
| >(MethodMode::Mutation), | |
| ), | |
| ( | |
| "credentialStatus".into(), | |
| method::< | |
| maka_agent_facts::configuration::CredentialVaultQueryInput, | |
| maka_agent_facts::configuration::CredentialVaultQueryResult, | |
| >(MethodMode::Query), | |
| ), | |
| ( | |
| "deleteCredential".into(), | |
| method::< | |
| maka_agent_facts::configuration::DeleteCredentialInput, | |
| maka_agent_facts::configuration::CredentialMutationResult, | |
| >(MethodMode::Mutation), | |
| ), | |
| ( | |
| "saveCredential".into(), | |
| Method { | |
| progress: None, | |
| resources: BTreeMap::from([( | |
| "secret".into(), | |
| maka_plugin_core::contract::ResourceType { | |
| name: "maka.text.utf8".into(), | |
| version: 1, | |
| } | |
| .required(), | |
| )]), | |
| ..method::<SaveCredential, CredentialSaveResult>(MethodMode::Mutation) | |
| }, | |
| ), | |
| ( | |
| "models".into(), | |
| method::<ModelsRead, ModelsPage>(MethodMode::Query), | |
| ), | |
| ( | |
| "updateModelSettings".into(), | |
| method::<UpdateModelSettings, CatalogMutationResult>(MethodMode::Mutation), | |
| ), | |
| ( | |
| "resolveModel".into(), | |
| method::<maka_agent_facts::configuration::ConnectionTarget, DefaultModel>( | |
| MethodMode::Query, | |
| ), | |
| ), | |
| ( | |
| "setDefault".into(), | |
| method::<SetDefaultConnectionTargetInput, CatalogMutationResult>( | |
| MethodMode::Mutation, | |
| ), | |
| ), | |
| ]), | |
| }, | |
| } | |
| } | |
| #[derive(Serialize, JsonSchema)] | |
| #[serde(tag = "kind", rename_all = "snake_case", deny_unknown_fields)] | |
| #[schemars(rename = "SettingsSetupResult")] | |
| pub enum SetupResult { | |
| Ready { | |
| connection: maka_agent_facts::configuration::ConnectionVersionBasis, | |
| }, | |
| Failed, | |
| Superseded, | |
| } | |
| pub fn setup_contract() -> Contract { | |
| Contract { | |
| name: "maka.settings.Setup".into(), | |
| version: 1, | |
| transport: Transport::Remote, | |
| interface: Interface::Service { | |
| methods: BTreeMap::from([( | |
| "discoverModels".into(), | |
| method::<maka_agent_facts::configuration::ConnectionCredentialTarget, SetupResult>( | |
| MethodMode::Mutation, | |
| ), | |
| )]), | |
| }, | |
| } | |
| } |