mirror of
https://github.com/pchuan98/codex.git
synced 2026-07-01 00:31:56 +08:00
Add app-server marketplace upgrade RPC (#19074)
## Summary - add a v2 `marketplace/upgrade` app-server RPC that mirrors the existing configured Git marketplace upgrade path - expose typed request/response/error payloads and regenerate JSON/TypeScript schema fixtures - add app-server integration coverage for all, named, already up-to-date, and invalid marketplace upgrade requests ## Tests - `just write-app-server-schema` - `cargo test -p codex-app-server-protocol` - `cargo test -p codex-app-server marketplace_upgrade` - `just fix -p codex-app-server-protocol` - `just fix -p codex-app-server` - `just fmt`
This commit is contained in:
committed by
GitHub
Unverified
parent
491a3058f6
commit
0d6a90cd6b
@@ -1721,6 +1721,17 @@
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeParams": {
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"type": "object"
|
||||
},
|
||||
"McpResourceReadParams": {
|
||||
"properties": {
|
||||
"server": {
|
||||
@@ -4904,6 +4915,30 @@
|
||||
"title": "Marketplace/removeRequest",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"id": {
|
||||
"$ref": "#/definitions/RequestId"
|
||||
},
|
||||
"method": {
|
||||
"enum": [
|
||||
"marketplace/upgrade"
|
||||
],
|
||||
"title": "Marketplace/upgradeRequestMethod",
|
||||
"type": "string"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/MarketplaceUpgradeParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"method",
|
||||
"params"
|
||||
],
|
||||
"title": "Marketplace/upgradeRequest",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"id": {
|
||||
|
||||
+82
@@ -689,6 +689,30 @@
|
||||
"title": "Marketplace/removeRequest",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"id": {
|
||||
"$ref": "#/definitions/v2/RequestId"
|
||||
},
|
||||
"method": {
|
||||
"enum": [
|
||||
"marketplace/upgrade"
|
||||
],
|
||||
"title": "Marketplace/upgradeRequestMethod",
|
||||
"type": "string"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/v2/MarketplaceUpgradeParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"method",
|
||||
"params"
|
||||
],
|
||||
"title": "Marketplace/upgradeRequest",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"id": {
|
||||
@@ -10318,6 +10342,64 @@
|
||||
"title": "MarketplaceRemoveResponse",
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeErrorInfo": {
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": "string"
|
||||
},
|
||||
"message": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"marketplaceName",
|
||||
"message"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeParams": {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"title": "MarketplaceUpgradeParams",
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeResponse": {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"errors": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/v2/MarketplaceUpgradeErrorInfo"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"selectedMarketplaces": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"upgradedRoots": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/v2/AbsolutePathBuf"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"errors",
|
||||
"selectedMarketplaces",
|
||||
"upgradedRoots"
|
||||
],
|
||||
"title": "MarketplaceUpgradeResponse",
|
||||
"type": "object"
|
||||
},
|
||||
"McpAuthStatus": {
|
||||
"enum": [
|
||||
"unsupported",
|
||||
|
||||
+82
@@ -1380,6 +1380,30 @@
|
||||
"title": "Marketplace/removeRequest",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"id": {
|
||||
"$ref": "#/definitions/RequestId"
|
||||
},
|
||||
"method": {
|
||||
"enum": [
|
||||
"marketplace/upgrade"
|
||||
],
|
||||
"title": "Marketplace/upgradeRequestMethod",
|
||||
"type": "string"
|
||||
},
|
||||
"params": {
|
||||
"$ref": "#/definitions/MarketplaceUpgradeParams"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"id",
|
||||
"method",
|
||||
"params"
|
||||
],
|
||||
"title": "Marketplace/upgradeRequest",
|
||||
"type": "object"
|
||||
},
|
||||
{
|
||||
"properties": {
|
||||
"id": {
|
||||
@@ -7033,6 +7057,64 @@
|
||||
"title": "MarketplaceRemoveResponse",
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeErrorInfo": {
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": "string"
|
||||
},
|
||||
"message": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"marketplaceName",
|
||||
"message"
|
||||
],
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeParams": {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"title": "MarketplaceUpgradeParams",
|
||||
"type": "object"
|
||||
},
|
||||
"MarketplaceUpgradeResponse": {
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"errors": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/MarketplaceUpgradeErrorInfo"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"selectedMarketplaces": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"upgradedRoots": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/AbsolutePathBuf"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"errors",
|
||||
"selectedMarketplaces",
|
||||
"upgradedRoots"
|
||||
],
|
||||
"title": "MarketplaceUpgradeResponse",
|
||||
"type": "object"
|
||||
},
|
||||
"McpAuthStatus": {
|
||||
"enum": [
|
||||
"unsupported",
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": [
|
||||
"string",
|
||||
"null"
|
||||
]
|
||||
}
|
||||
},
|
||||
"title": "MarketplaceUpgradeParams",
|
||||
"type": "object"
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
{
|
||||
"$schema": "http://json-schema.org/draft-07/schema#",
|
||||
"definitions": {
|
||||
"AbsolutePathBuf": {
|
||||
"description": "A path that is guaranteed to be absolute and normalized (though it is not guaranteed to be canonicalized or exist on the filesystem).\n\nIMPORTANT: When deserializing an `AbsolutePathBuf`, a base path must be set using [AbsolutePathBufGuard::new]. If no base path is set, the deserialization will fail unless the path being deserialized is already absolute.",
|
||||
"type": "string"
|
||||
},
|
||||
"MarketplaceUpgradeErrorInfo": {
|
||||
"properties": {
|
||||
"marketplaceName": {
|
||||
"type": "string"
|
||||
},
|
||||
"message": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"marketplaceName",
|
||||
"message"
|
||||
],
|
||||
"type": "object"
|
||||
}
|
||||
},
|
||||
"properties": {
|
||||
"errors": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/MarketplaceUpgradeErrorInfo"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"selectedMarketplaces": {
|
||||
"items": {
|
||||
"type": "string"
|
||||
},
|
||||
"type": "array"
|
||||
},
|
||||
"upgradedRoots": {
|
||||
"items": {
|
||||
"$ref": "#/definitions/AbsolutePathBuf"
|
||||
},
|
||||
"type": "array"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"errors",
|
||||
"selectedMarketplaces",
|
||||
"upgradedRoots"
|
||||
],
|
||||
"title": "MarketplaceUpgradeResponse",
|
||||
"type": "object"
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
+5
@@ -0,0 +1,5 @@
|
||||
// GENERATED CODE! DO NOT MODIFY BY HAND!
|
||||
|
||||
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||
|
||||
export type MarketplaceUpgradeErrorInfo = { marketplaceName: string, message: string, };
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
// GENERATED CODE! DO NOT MODIFY BY HAND!
|
||||
|
||||
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||
|
||||
export type MarketplaceUpgradeParams = { marketplaceName?: string | null, };
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
// GENERATED CODE! DO NOT MODIFY BY HAND!
|
||||
|
||||
// This file was generated by [ts-rs](https://github.com/Aleph-Alpha/ts-rs). Do not edit this file manually.
|
||||
import type { AbsolutePathBuf } from "../AbsolutePathBuf";
|
||||
import type { MarketplaceUpgradeErrorInfo } from "./MarketplaceUpgradeErrorInfo";
|
||||
|
||||
export type MarketplaceUpgradeResponse = { selectedMarketplaces: Array<string>, upgradedRoots: Array<AbsolutePathBuf>, errors: Array<MarketplaceUpgradeErrorInfo>, };
|
||||
@@ -178,6 +178,9 @@ export type { MarketplaceInterface } from "./MarketplaceInterface";
|
||||
export type { MarketplaceLoadErrorInfo } from "./MarketplaceLoadErrorInfo";
|
||||
export type { MarketplaceRemoveParams } from "./MarketplaceRemoveParams";
|
||||
export type { MarketplaceRemoveResponse } from "./MarketplaceRemoveResponse";
|
||||
export type { MarketplaceUpgradeErrorInfo } from "./MarketplaceUpgradeErrorInfo";
|
||||
export type { MarketplaceUpgradeParams } from "./MarketplaceUpgradeParams";
|
||||
export type { MarketplaceUpgradeResponse } from "./MarketplaceUpgradeResponse";
|
||||
export type { McpAuthStatus } from "./McpAuthStatus";
|
||||
export type { McpElicitationArrayType } from "./McpElicitationArrayType";
|
||||
export type { McpElicitationBooleanSchema } from "./McpElicitationBooleanSchema";
|
||||
|
||||
@@ -357,6 +357,10 @@ client_request_definitions! {
|
||||
params: v2::MarketplaceRemoveParams,
|
||||
response: v2::MarketplaceRemoveResponse,
|
||||
},
|
||||
MarketplaceUpgrade => "marketplace/upgrade" {
|
||||
params: v2::MarketplaceUpgradeParams,
|
||||
response: v2::MarketplaceUpgradeResponse,
|
||||
},
|
||||
PluginList => "plugin/list" {
|
||||
params: v2::PluginListParams,
|
||||
response: v2::PluginListResponse,
|
||||
|
||||
@@ -4104,6 +4104,31 @@ pub struct MarketplaceRemoveResponse {
|
||||
pub installed_root: Option<AbsolutePathBuf>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(export_to = "v2/")]
|
||||
pub struct MarketplaceUpgradeParams {
|
||||
#[ts(optional = nullable)]
|
||||
pub marketplace_name: Option<String>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(export_to = "v2/")]
|
||||
pub struct MarketplaceUpgradeResponse {
|
||||
pub selected_marketplaces: Vec<String>,
|
||||
pub upgraded_roots: Vec<AbsolutePathBuf>,
|
||||
pub errors: Vec<MarketplaceUpgradeErrorInfo>,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq, JsonSchema, TS)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(export_to = "v2/")]
|
||||
pub struct MarketplaceUpgradeErrorInfo {
|
||||
pub marketplace_name: String,
|
||||
pub message: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
#[ts(export_to = "v2/")]
|
||||
@@ -9790,6 +9815,36 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn marketplace_upgrade_params_serialization_uses_optional_marketplace_name() {
|
||||
assert_eq!(
|
||||
serde_json::to_value(MarketplaceUpgradeParams {
|
||||
marketplace_name: None,
|
||||
})
|
||||
.unwrap(),
|
||||
json!({
|
||||
"marketplaceName": null,
|
||||
}),
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
serde_json::from_value::<MarketplaceUpgradeParams>(json!({})).unwrap(),
|
||||
MarketplaceUpgradeParams {
|
||||
marketplace_name: None,
|
||||
},
|
||||
);
|
||||
|
||||
assert_eq!(
|
||||
serde_json::to_value(MarketplaceUpgradeParams {
|
||||
marketplace_name: Some("debug".to_string()),
|
||||
})
|
||||
.unwrap(),
|
||||
json!({
|
||||
"marketplaceName": "debug",
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn plugin_marketplace_entry_serializes_remote_only_path_as_null() {
|
||||
assert_eq!(
|
||||
@@ -10036,6 +10091,37 @@ mod tests {
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn marketplace_upgrade_response_serializes_camel_case_fields() {
|
||||
let upgraded_root = if cfg!(windows) {
|
||||
r"C:\marketplaces\debug"
|
||||
} else {
|
||||
"/tmp/marketplaces/debug"
|
||||
};
|
||||
let upgraded_root = AbsolutePathBuf::try_from(PathBuf::from(upgraded_root)).unwrap();
|
||||
let upgraded_root_json = upgraded_root.as_path().display().to_string();
|
||||
|
||||
assert_eq!(
|
||||
serde_json::to_value(MarketplaceUpgradeResponse {
|
||||
selected_marketplaces: vec!["debug".to_string()],
|
||||
upgraded_roots: vec![upgraded_root],
|
||||
errors: vec![MarketplaceUpgradeErrorInfo {
|
||||
marketplace_name: "broken".to_string(),
|
||||
message: "failed to clone".to_string(),
|
||||
}],
|
||||
})
|
||||
.unwrap(),
|
||||
json!({
|
||||
"selectedMarketplaces": ["debug"],
|
||||
"upgradedRoots": [upgraded_root_json],
|
||||
"errors": [{
|
||||
"marketplaceName": "broken",
|
||||
"message": "failed to clone",
|
||||
}],
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn codex_error_info_serializes_http_status_code_in_camel_case() {
|
||||
let value = CodexErrorInfo::ResponseTooManyFailedAttempts {
|
||||
|
||||
Reference in New Issue
Block a user