Remove plugin extension metadata from discovery and summaries (#48035)

## What changed

- Stop sending `includeExtensions=true` when fetching installed plugins and remove extension metadata from remote plugin models.
- Remove `PluginSummary.extensions` and the associated extension declaration types from the app-server protocol.
- Update generated JSON schemas, TypeScript and Python bindings, and precomputed protocol exports to match.

GitOrigin-RevId: 56509437b6bdf58d99badff68e86bcf7f09fe036
This commit is contained in:
victor-openai
2026-09-25 08:25:37 +00:00
committed by copyberry
parent d7b07d4551
commit 4b1c0c30da
35 changed files with 7 additions and 2901 deletions
@@ -16377,241 +16377,6 @@
],
"type": "string"
},
"PluginEntrypoint": {
"oneOf": [
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/v2/PluginIcon"
},
"type": "array"
},
"quickAction": {
"anyOf": [
{
"$ref": "#/definitions/v2/PluginQuickAction"
},
{
"type": "null"
}
],
"default": null
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"global"
],
"title": "GlobalPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "GlobalPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/v2/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"searchTerms": {
"default": [],
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"settings"
],
"title": "SettingsPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "SettingsPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/v2/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"thread"
],
"title": "ThreadPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "ThreadPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"extensions": {
"items": {
"type": "string"
},
"type": "array"
},
"icons": {
"items": {
"$ref": "#/definitions/v2/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"file"
],
"title": "FilePluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"extensions",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "FilePluginEntrypoint",
"type": "object"
}
]
},
"PluginExtensions": {
"properties": {
"entrypoints": {
"default": null,
"items": {
"$ref": "#/definitions/v2/PluginEntrypoint"
},
"type": [
"array",
"null"
]
},
"fileHandlers": {
"default": [],
"items": {
"$ref": "#/definitions/v2/PluginEntrypoint"
},
"type": "array"
},
"searchMentionProviders": {
"default": [],
"items": {
"$ref": "#/definitions/v2/PluginSearchProvider"
},
"type": "array"
},
"settings": {
"default": [],
"items": {
"$ref": "#/definitions/v2/PluginSettings"
},
"type": "array"
},
"settingsEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/v2/PluginEntrypoint"
},
"type": "array"
},
"threadEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/v2/PluginEntrypoint"
},
"type": "array"
}
},
"type": "object"
},
"PluginHookSummary": {
"properties": {
"eventName": {
@@ -16627,38 +16392,6 @@
],
"type": "object"
},
"PluginIcon": {
"properties": {
"mimeType": {
"type": [
"string",
"null"
]
},
"sizes": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"src": {
"type": "string"
},
"theme": {
"type": [
"string",
"null"
]
}
},
"required": [
"src"
],
"type": "object"
},
"PluginInstallParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -17038,53 +16771,6 @@
],
"type": "object"
},
"PluginQuickAction": {
"properties": {
"icons": {
"items": {
"$ref": "#/definitions/v2/PluginIcon"
},
"type": "array"
},
"target": {
"$ref": "#/definitions/v2/PluginQuickActionTarget"
},
"title": {
"type": "string"
}
},
"required": [
"icons",
"target",
"title"
],
"type": "object"
},
"PluginQuickActionTarget": {
"oneOf": [
{
"properties": {
"arguments": true,
"name": {
"type": "string"
},
"type": {
"enum": [
"tool"
],
"title": "ToolPluginQuickActionTargetType",
"type": "string"
}
},
"required": [
"name",
"type"
],
"title": "ToolPluginQuickActionTarget",
"type": "object"
}
]
},
"PluginReadParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -17205,54 +16891,6 @@
"title": "PluginReconcileResponse",
"type": "object"
},
"PluginSearchProvider": {
"properties": {
"appId": {
"type": "string"
},
"call": {
"anyOf": [
{
"$ref": "#/definitions/v2/PluginSearchProviderCall"
},
{
"type": "null"
}
]
},
"linkId": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
}
},
"required": [
"appId",
"linkId",
"title",
"toolName"
],
"type": "object"
},
"PluginSearchProviderCall": {
"properties": {
"_meta": true,
"arguments": true,
"name": {
"type": "string"
}
},
"required": [
"_meta",
"arguments",
"name"
],
"type": "object"
},
"PluginSearchResult": {
"properties": {
"marketplaceName": {
@@ -17286,25 +16924,6 @@
],
"type": "string"
},
"PluginSettings": {
"properties": {
"appId": {
"type": "string"
},
"readToolName": {
"type": "string"
},
"updateToolName": {
"type": "string"
}
},
"required": [
"appId",
"readToolName",
"updateToolName"
],
"type": "object"
},
"PluginShareCheckoutParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -17854,17 +17473,6 @@
"enabled": {
"type": "boolean"
},
"extensions": {
"anyOf": [
{
"$ref": "#/definitions/v2/PluginExtensions"
},
{
"type": "null"
}
],
"default": null
},
"id": {
"type": "string"
},
@@ -12409,241 +12409,6 @@
],
"type": "string"
},
"PluginEntrypoint": {
"oneOf": [
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"quickAction": {
"anyOf": [
{
"$ref": "#/definitions/PluginQuickAction"
},
{
"type": "null"
}
],
"default": null
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"global"
],
"title": "GlobalPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "GlobalPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"searchTerms": {
"default": [],
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"settings"
],
"title": "SettingsPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "SettingsPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"thread"
],
"title": "ThreadPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "ThreadPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"extensions": {
"items": {
"type": "string"
},
"type": "array"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"file"
],
"title": "FilePluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"extensions",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "FilePluginEntrypoint",
"type": "object"
}
]
},
"PluginExtensions": {
"properties": {
"entrypoints": {
"default": null,
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": [
"array",
"null"
]
},
"fileHandlers": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"searchMentionProviders": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSearchProvider"
},
"type": "array"
},
"settings": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSettings"
},
"type": "array"
},
"settingsEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"threadEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
}
},
"type": "object"
},
"PluginHookSummary": {
"properties": {
"eventName": {
@@ -12659,38 +12424,6 @@
],
"type": "object"
},
"PluginIcon": {
"properties": {
"mimeType": {
"type": [
"string",
"null"
]
},
"sizes": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"src": {
"type": "string"
},
"theme": {
"type": [
"string",
"null"
]
}
},
"required": [
"src"
],
"type": "object"
},
"PluginInstallParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -13070,53 +12803,6 @@
],
"type": "object"
},
"PluginQuickAction": {
"properties": {
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"target": {
"$ref": "#/definitions/PluginQuickActionTarget"
},
"title": {
"type": "string"
}
},
"required": [
"icons",
"target",
"title"
],
"type": "object"
},
"PluginQuickActionTarget": {
"oneOf": [
{
"properties": {
"arguments": true,
"name": {
"type": "string"
},
"type": {
"enum": [
"tool"
],
"title": "ToolPluginQuickActionTargetType",
"type": "string"
}
},
"required": [
"name",
"type"
],
"title": "ToolPluginQuickActionTarget",
"type": "object"
}
]
},
"PluginReadParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -13237,54 +12923,6 @@
"title": "PluginReconcileResponse",
"type": "object"
},
"PluginSearchProvider": {
"properties": {
"appId": {
"type": "string"
},
"call": {
"anyOf": [
{
"$ref": "#/definitions/PluginSearchProviderCall"
},
{
"type": "null"
}
]
},
"linkId": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
}
},
"required": [
"appId",
"linkId",
"title",
"toolName"
],
"type": "object"
},
"PluginSearchProviderCall": {
"properties": {
"_meta": true,
"arguments": true,
"name": {
"type": "string"
}
},
"required": [
"_meta",
"arguments",
"name"
],
"type": "object"
},
"PluginSearchResult": {
"properties": {
"marketplaceName": {
@@ -13318,25 +12956,6 @@
],
"type": "string"
},
"PluginSettings": {
"properties": {
"appId": {
"type": "string"
},
"readToolName": {
"type": "string"
},
"updateToolName": {
"type": "string"
}
},
"required": [
"appId",
"readToolName",
"updateToolName"
],
"type": "object"
},
"PluginShareCheckoutParams": {
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
@@ -13886,17 +13505,6 @@
"enabled": {
"type": "boolean"
},
"extensions": {
"anyOf": [
{
"$ref": "#/definitions/PluginExtensions"
},
{
"type": "null"
}
],
"default": null
},
"id": {
"type": "string"
},
@@ -64,273 +64,6 @@
],
"type": "string"
},
"PluginEntrypoint": {
"oneOf": [
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"quickAction": {
"anyOf": [
{
"$ref": "#/definitions/PluginQuickAction"
},
{
"type": "null"
}
],
"default": null
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"global"
],
"title": "GlobalPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "GlobalPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"searchTerms": {
"default": [],
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"settings"
],
"title": "SettingsPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "SettingsPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"thread"
],
"title": "ThreadPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "ThreadPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"extensions": {
"items": {
"type": "string"
},
"type": "array"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"file"
],
"title": "FilePluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"extensions",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "FilePluginEntrypoint",
"type": "object"
}
]
},
"PluginExtensions": {
"properties": {
"entrypoints": {
"default": null,
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": [
"array",
"null"
]
},
"fileHandlers": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"searchMentionProviders": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSearchProvider"
},
"type": "array"
},
"settings": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSettings"
},
"type": "array"
},
"settingsEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"threadEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
}
},
"type": "object"
},
"PluginIcon": {
"properties": {
"mimeType": {
"type": [
"string",
"null"
]
},
"sizes": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"src": {
"type": "string"
},
"theme": {
"type": [
"string",
"null"
]
}
},
"required": [
"src"
],
"type": "object"
},
"PluginInstallPolicy": {
"enum": [
"NOT_AVAILABLE",
@@ -533,120 +266,6 @@
],
"type": "object"
},
"PluginQuickAction": {
"properties": {
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"target": {
"$ref": "#/definitions/PluginQuickActionTarget"
},
"title": {
"type": "string"
}
},
"required": [
"icons",
"target",
"title"
],
"type": "object"
},
"PluginQuickActionTarget": {
"oneOf": [
{
"properties": {
"arguments": true,
"name": {
"type": "string"
},
"type": {
"enum": [
"tool"
],
"title": "ToolPluginQuickActionTargetType",
"type": "string"
}
},
"required": [
"name",
"type"
],
"title": "ToolPluginQuickActionTarget",
"type": "object"
}
]
},
"PluginSearchProvider": {
"properties": {
"appId": {
"type": "string"
},
"call": {
"anyOf": [
{
"$ref": "#/definitions/PluginSearchProviderCall"
},
{
"type": "null"
}
]
},
"linkId": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
}
},
"required": [
"appId",
"linkId",
"title",
"toolName"
],
"type": "object"
},
"PluginSearchProviderCall": {
"properties": {
"_meta": true,
"arguments": true,
"name": {
"type": "string"
}
},
"required": [
"_meta",
"arguments",
"name"
],
"type": "object"
},
"PluginSettings": {
"properties": {
"appId": {
"type": "string"
},
"readToolName": {
"type": "string"
},
"updateToolName": {
"type": "string"
}
},
"required": [
"appId",
"readToolName",
"updateToolName"
],
"type": "object"
},
"PluginShareContext": {
"properties": {
"canPublishToWorkspace": {
@@ -910,17 +529,6 @@
"enabled": {
"type": "boolean"
},
"extensions": {
"anyOf": [
{
"$ref": "#/definitions/PluginExtensions"
},
{
"type": "null"
}
],
"default": null
},
"id": {
"type": "string"
},
@@ -64,273 +64,6 @@
],
"type": "string"
},
"PluginEntrypoint": {
"oneOf": [
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"quickAction": {
"anyOf": [
{
"$ref": "#/definitions/PluginQuickAction"
},
{
"type": "null"
}
],
"default": null
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"global"
],
"title": "GlobalPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "GlobalPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"searchTerms": {
"default": [],
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"settings"
],
"title": "SettingsPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "SettingsPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"thread"
],
"title": "ThreadPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "ThreadPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"extensions": {
"items": {
"type": "string"
},
"type": "array"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"file"
],
"title": "FilePluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"extensions",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "FilePluginEntrypoint",
"type": "object"
}
]
},
"PluginExtensions": {
"properties": {
"entrypoints": {
"default": null,
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": [
"array",
"null"
]
},
"fileHandlers": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"searchMentionProviders": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSearchProvider"
},
"type": "array"
},
"settings": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSettings"
},
"type": "array"
},
"settingsEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"threadEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
}
},
"type": "object"
},
"PluginIcon": {
"properties": {
"mimeType": {
"type": [
"string",
"null"
]
},
"sizes": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"src": {
"type": "string"
},
"theme": {
"type": [
"string",
"null"
]
}
},
"required": [
"src"
],
"type": "object"
},
"PluginInstallPolicy": {
"enum": [
"NOT_AVAILABLE",
@@ -533,120 +266,6 @@
],
"type": "object"
},
"PluginQuickAction": {
"properties": {
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"target": {
"$ref": "#/definitions/PluginQuickActionTarget"
},
"title": {
"type": "string"
}
},
"required": [
"icons",
"target",
"title"
],
"type": "object"
},
"PluginQuickActionTarget": {
"oneOf": [
{
"properties": {
"arguments": true,
"name": {
"type": "string"
},
"type": {
"enum": [
"tool"
],
"title": "ToolPluginQuickActionTargetType",
"type": "string"
}
},
"required": [
"name",
"type"
],
"title": "ToolPluginQuickActionTarget",
"type": "object"
}
]
},
"PluginSearchProvider": {
"properties": {
"appId": {
"type": "string"
},
"call": {
"anyOf": [
{
"$ref": "#/definitions/PluginSearchProviderCall"
},
{
"type": "null"
}
]
},
"linkId": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
}
},
"required": [
"appId",
"linkId",
"title",
"toolName"
],
"type": "object"
},
"PluginSearchProviderCall": {
"properties": {
"_meta": true,
"arguments": true,
"name": {
"type": "string"
}
},
"required": [
"_meta",
"arguments",
"name"
],
"type": "object"
},
"PluginSettings": {
"properties": {
"appId": {
"type": "string"
},
"readToolName": {
"type": "string"
},
"updateToolName": {
"type": "string"
}
},
"required": [
"appId",
"readToolName",
"updateToolName"
],
"type": "object"
},
"PluginShareContext": {
"properties": {
"canPublishToWorkspace": {
@@ -910,17 +529,6 @@
"enabled": {
"type": "boolean"
},
"extensions": {
"anyOf": [
{
"$ref": "#/definitions/PluginExtensions"
},
{
"type": "null"
}
],
"default": null
},
"id": {
"type": "string"
},
@@ -251,241 +251,6 @@
],
"type": "string"
},
"PluginEntrypoint": {
"oneOf": [
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"quickAction": {
"anyOf": [
{
"$ref": "#/definitions/PluginQuickAction"
},
{
"type": "null"
}
],
"default": null
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"global"
],
"title": "GlobalPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "GlobalPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"searchTerms": {
"default": [],
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"settings"
],
"title": "SettingsPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "SettingsPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"thread"
],
"title": "ThreadPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "ThreadPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"extensions": {
"items": {
"type": "string"
},
"type": "array"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"file"
],
"title": "FilePluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"extensions",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "FilePluginEntrypoint",
"type": "object"
}
]
},
"PluginExtensions": {
"properties": {
"entrypoints": {
"default": null,
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": [
"array",
"null"
]
},
"fileHandlers": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"searchMentionProviders": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSearchProvider"
},
"type": "array"
},
"settings": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSettings"
},
"type": "array"
},
"settingsEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"threadEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
}
},
"type": "object"
},
"PluginHookSummary": {
"properties": {
"eventName": {
@@ -501,38 +266,6 @@
],
"type": "object"
},
"PluginIcon": {
"properties": {
"mimeType": {
"type": [
"string",
"null"
]
},
"sizes": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"src": {
"type": "string"
},
"theme": {
"type": [
"string",
"null"
]
}
},
"required": [
"src"
],
"type": "object"
},
"PluginInstallPolicy": {
"enum": [
"NOT_AVAILABLE",
@@ -696,120 +429,6 @@
],
"type": "object"
},
"PluginQuickAction": {
"properties": {
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"target": {
"$ref": "#/definitions/PluginQuickActionTarget"
},
"title": {
"type": "string"
}
},
"required": [
"icons",
"target",
"title"
],
"type": "object"
},
"PluginQuickActionTarget": {
"oneOf": [
{
"properties": {
"arguments": true,
"name": {
"type": "string"
},
"type": {
"enum": [
"tool"
],
"title": "ToolPluginQuickActionTargetType",
"type": "string"
}
},
"required": [
"name",
"type"
],
"title": "ToolPluginQuickActionTarget",
"type": "object"
}
]
},
"PluginSearchProvider": {
"properties": {
"appId": {
"type": "string"
},
"call": {
"anyOf": [
{
"$ref": "#/definitions/PluginSearchProviderCall"
},
{
"type": "null"
}
]
},
"linkId": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
}
},
"required": [
"appId",
"linkId",
"title",
"toolName"
],
"type": "object"
},
"PluginSearchProviderCall": {
"properties": {
"_meta": true,
"arguments": true,
"name": {
"type": "string"
}
},
"required": [
"_meta",
"arguments",
"name"
],
"type": "object"
},
"PluginSettings": {
"properties": {
"appId": {
"type": "string"
},
"readToolName": {
"type": "string"
},
"updateToolName": {
"type": "string"
}
},
"required": [
"appId",
"readToolName",
"updateToolName"
],
"type": "object"
},
"PluginShareContext": {
"properties": {
"canPublishToWorkspace": {
@@ -1073,17 +692,6 @@
"enabled": {
"type": "boolean"
},
"extensions": {
"anyOf": [
{
"$ref": "#/definitions/PluginExtensions"
},
{
"type": "null"
}
],
"default": null
},
"id": {
"type": "string"
},
@@ -38,273 +38,6 @@
],
"type": "string"
},
"PluginEntrypoint": {
"oneOf": [
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"quickAction": {
"anyOf": [
{
"$ref": "#/definitions/PluginQuickAction"
},
{
"type": "null"
}
],
"default": null
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"global"
],
"title": "GlobalPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "GlobalPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"searchTerms": {
"default": [],
"items": {
"type": "string"
},
"type": "array"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"settings"
],
"title": "SettingsPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "SettingsPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"thread"
],
"title": "ThreadPluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "ThreadPluginEntrypoint",
"type": "object"
},
{
"properties": {
"appId": {
"type": "string"
},
"extensions": {
"items": {
"type": "string"
},
"type": "array"
},
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"resourceUri": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
},
"type": {
"enum": [
"file"
],
"title": "FilePluginEntrypointType",
"type": "string"
}
},
"required": [
"appId",
"extensions",
"icons",
"resourceUri",
"title",
"toolName",
"type"
],
"title": "FilePluginEntrypoint",
"type": "object"
}
]
},
"PluginExtensions": {
"properties": {
"entrypoints": {
"default": null,
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": [
"array",
"null"
]
},
"fileHandlers": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"searchMentionProviders": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSearchProvider"
},
"type": "array"
},
"settings": {
"default": [],
"items": {
"$ref": "#/definitions/PluginSettings"
},
"type": "array"
},
"settingsEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
},
"threadEntrypoints": {
"default": [],
"items": {
"$ref": "#/definitions/PluginEntrypoint"
},
"type": "array"
}
},
"type": "object"
},
"PluginIcon": {
"properties": {
"mimeType": {
"type": [
"string",
"null"
]
},
"sizes": {
"items": {
"type": "string"
},
"type": [
"array",
"null"
]
},
"src": {
"type": "string"
},
"theme": {
"type": [
"string",
"null"
]
}
},
"required": [
"src"
],
"type": "object"
},
"PluginInstallPolicy": {
"enum": [
"NOT_AVAILABLE",
@@ -468,120 +201,6 @@
],
"type": "object"
},
"PluginQuickAction": {
"properties": {
"icons": {
"items": {
"$ref": "#/definitions/PluginIcon"
},
"type": "array"
},
"target": {
"$ref": "#/definitions/PluginQuickActionTarget"
},
"title": {
"type": "string"
}
},
"required": [
"icons",
"target",
"title"
],
"type": "object"
},
"PluginQuickActionTarget": {
"oneOf": [
{
"properties": {
"arguments": true,
"name": {
"type": "string"
},
"type": {
"enum": [
"tool"
],
"title": "ToolPluginQuickActionTargetType",
"type": "string"
}
},
"required": [
"name",
"type"
],
"title": "ToolPluginQuickActionTarget",
"type": "object"
}
]
},
"PluginSearchProvider": {
"properties": {
"appId": {
"type": "string"
},
"call": {
"anyOf": [
{
"$ref": "#/definitions/PluginSearchProviderCall"
},
{
"type": "null"
}
]
},
"linkId": {
"type": "string"
},
"title": {
"type": "string"
},
"toolName": {
"type": "string"
}
},
"required": [
"appId",
"linkId",
"title",
"toolName"
],
"type": "object"
},
"PluginSearchProviderCall": {
"properties": {
"_meta": true,
"arguments": true,
"name": {
"type": "string"
}
},
"required": [
"_meta",
"arguments",
"name"
],
"type": "object"
},
"PluginSettings": {
"properties": {
"appId": {
"type": "string"
},
"readToolName": {
"type": "string"
},
"updateToolName": {
"type": "string"
}
},
"required": [
"appId",
"readToolName",
"updateToolName"
],
"type": "object"
},
"PluginShareContext": {
"properties": {
"canPublishToWorkspace": {
@@ -866,17 +485,6 @@
"enabled": {
"type": "boolean"
},
"extensions": {
"anyOf": [
{
"$ref": "#/definitions/PluginExtensions"
},
{
"type": "null"
}
],
"default": null
},
"id": {
"type": "string"
},
@@ -1,7 +0,0 @@
// 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 { PluginIcon } from "./PluginIcon";
import type { PluginQuickAction } from "./PluginQuickAction";
export type PluginEntrypoint = { "type": "global", quickAction: PluginQuickAction | null, appId: string, toolName: string, title: string, resourceUri: string, icons: Array<PluginIcon>, } | { "type": "settings", searchTerms: Array<string>, appId: string, toolName: string, title: string, resourceUri: string, icons: Array<PluginIcon>, } | { "type": "thread", appId: string, toolName: string, title: string, resourceUri: string, icons: Array<PluginIcon>, } | { "type": "file", extensions: Array<string>, appId: string, toolName: string, title: string, resourceUri: string, icons: Array<PluginIcon>, };
@@ -1,8 +0,0 @@
// 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 { PluginEntrypoint } from "./PluginEntrypoint";
import type { PluginSearchProvider } from "./PluginSearchProvider";
import type { PluginSettings } from "./PluginSettings";
export type PluginExtensions = { entrypoints: Array<PluginEntrypoint> | null, settingsEntrypoints: Array<PluginEntrypoint>, settings: Array<PluginSettings>, threadEntrypoints: Array<PluginEntrypoint>, fileHandlers: Array<PluginEntrypoint>, searchMentionProviders: Array<PluginSearchProvider>, };
@@ -1,5 +0,0 @@
// 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 PluginIcon = { src: string, mimeType: string | null, sizes: Array<string> | null, theme: string | null, };
@@ -1,7 +0,0 @@
// 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 { PluginIcon } from "./PluginIcon";
import type { PluginQuickActionTarget } from "./PluginQuickActionTarget";
export type PluginQuickAction = { title: string, icons: Array<PluginIcon>, target: PluginQuickActionTarget, };
@@ -1,6 +0,0 @@
// 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 { JsonValue } from "../serde_json/JsonValue";
export type PluginQuickActionTarget = { "type": "tool", name: string, arguments: JsonValue | null, };
@@ -1,6 +0,0 @@
// 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 { PluginSearchProviderCall } from "./PluginSearchProviderCall";
export type PluginSearchProvider = { appId: string, toolName: string, linkId: string, title: string, call: PluginSearchProviderCall | null, };
@@ -1,6 +0,0 @@
// 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 { JsonValue } from "../serde_json/JsonValue";
export type PluginSearchProviderCall = { name: string, arguments: JsonValue, _meta: JsonValue, };
@@ -1,5 +0,0 @@
// 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 PluginSettings = { appId: string, readToolName: string, updateToolName: string, };
@@ -4,14 +4,13 @@
import type { PluginAuthPolicy } from "./PluginAuthPolicy";
import type { PluginAvailability } from "./PluginAvailability";
import type { PluginDisabledReason } from "./PluginDisabledReason";
import type { PluginExtensions } from "./PluginExtensions";
import type { PluginInstallPolicy } from "./PluginInstallPolicy";
import type { PluginInstallPolicySource } from "./PluginInstallPolicySource";
import type { PluginInterface } from "./PluginInterface";
import type { PluginShareContext } from "./PluginShareContext";
import type { PluginSource } from "./PluginSource";
export type PluginSummary = { extensions: PluginExtensions | null, id: string,
export type PluginSummary = { id: string,
/**
* Backend remote plugin identifier when available.
*/
@@ -354,10 +354,7 @@ export type { PluginAuthPolicy } from "./PluginAuthPolicy";
export type { PluginAvailability } from "./PluginAvailability";
export type { PluginDetail } from "./PluginDetail";
export type { PluginDisabledReason } from "./PluginDisabledReason";
export type { PluginEntrypoint } from "./PluginEntrypoint";
export type { PluginExtensions } from "./PluginExtensions";
export type { PluginHookSummary } from "./PluginHookSummary";
export type { PluginIcon } from "./PluginIcon";
export type { PluginInstallParams } from "./PluginInstallParams";
export type { PluginInstallPolicy } from "./PluginInstallPolicy";
export type { PluginInstallPolicySource } from "./PluginInstallPolicySource";
@@ -369,18 +366,13 @@ export type { PluginListMarketplaceKind } from "./PluginListMarketplaceKind";
export type { PluginListParams } from "./PluginListParams";
export type { PluginListResponse } from "./PluginListResponse";
export type { PluginMarketplaceEntry } from "./PluginMarketplaceEntry";
export type { PluginQuickAction } from "./PluginQuickAction";
export type { PluginQuickActionTarget } from "./PluginQuickActionTarget";
export type { PluginReadParams } from "./PluginReadParams";
export type { PluginReadResponse } from "./PluginReadResponse";
export type { PluginReconcileChangedPlugin } from "./PluginReconcileChangedPlugin";
export type { PluginReconcileParams } from "./PluginReconcileParams";
export type { PluginReconcileResponse } from "./PluginReconcileResponse";
export type { PluginSearchProvider } from "./PluginSearchProvider";
export type { PluginSearchProviderCall } from "./PluginSearchProviderCall";
export type { PluginSearchResult } from "./PluginSearchResult";
export type { PluginSearchScope } from "./PluginSearchScope";
export type { PluginSettings } from "./PluginSettings";
export type { PluginShareCheckoutParams } from "./PluginShareCheckoutParams";
export type { PluginShareCheckoutResponse } from "./PluginShareCheckoutResponse";
export type { PluginShareContext } from "./PluginShareContext";
@@ -24,7 +24,6 @@ mod model;
mod notification;
mod permissions;
mod plugin;
mod plugin_extensions;
mod plugin_search;
mod process;
mod project;
@@ -64,7 +63,6 @@ pub use model::*;
pub use notification::*;
pub use permissions::*;
pub use plugin::*;
pub use plugin_extensions::*;
pub use plugin_search::*;
pub use process::*;
pub use project::*;
@@ -696,8 +696,6 @@ pub enum PluginDisabledReason {
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginSummary {
#[serde(default)]
pub extensions: Option<super::PluginExtensions>,
pub id: String,
/// Backend remote plugin identifier when available.
pub remote_plugin_id: Option<String>,
@@ -1,133 +0,0 @@
//! Hosted plugin extension declarations carried by installed-plugin discovery.
use crate::JsonSchema;
use crate::TS;
use serde::Deserialize;
use serde::Serialize;
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginExtensions {
#[serde(default)]
pub entrypoints: Option<Vec<PluginEntrypoint>>,
#[serde(default, alias = "settings_entrypoints")]
pub settings_entrypoints: Vec<PluginEntrypoint>,
#[serde(default)]
pub settings: Vec<PluginSettings>,
#[serde(default, alias = "thread_entrypoints")]
pub thread_entrypoints: Vec<PluginEntrypoint>,
#[serde(default, alias = "file_handlers")]
pub file_handlers: Vec<PluginEntrypoint>,
#[serde(default, alias = "search_mention_providers")]
pub search_mention_providers: Vec<PluginSearchProvider>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(tag = "type", rename_all = "camelCase")]
#[ts(tag = "type", rename_all = "camelCase", export_to = "v2/")]
pub enum PluginEntrypoint {
Global {
#[serde(flatten)]
presentation: PluginEntrypointPresentation,
#[serde(default, rename = "quickAction", alias = "quick_action")]
#[ts(rename = "quickAction")]
quick_action: Option<PluginQuickAction>,
},
Settings {
#[serde(flatten)]
presentation: PluginEntrypointPresentation,
#[serde(default, rename = "searchTerms", alias = "search_terms")]
#[ts(rename = "searchTerms")]
search_terms: Vec<String>,
},
Thread {
#[serde(flatten)]
presentation: PluginEntrypointPresentation,
},
File {
#[serde(flatten)]
presentation: PluginEntrypointPresentation,
extensions: Vec<String>,
},
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginEntrypointPresentation {
#[serde(alias = "app_id")]
pub app_id: String,
#[serde(alias = "tool_name")]
pub tool_name: String,
pub title: String,
#[serde(alias = "resource_uri")]
pub resource_uri: String,
pub icons: Vec<PluginIcon>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginIcon {
pub src: String,
pub mime_type: Option<String>,
pub sizes: Option<Vec<String>>,
pub theme: Option<String>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginQuickAction {
pub title: String,
pub icons: Vec<PluginIcon>,
pub target: PluginQuickActionTarget,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(tag = "type", rename_all = "camelCase")]
#[ts(tag = "type", rename_all = "camelCase", export_to = "v2/")]
pub enum PluginQuickActionTarget {
Tool {
name: String,
arguments: Option<serde_json::Value>,
},
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginSettings {
#[serde(alias = "app_id")]
pub app_id: String,
#[serde(alias = "read_tool_name")]
pub read_tool_name: String,
#[serde(alias = "update_tool_name")]
pub update_tool_name: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginSearchProvider {
#[serde(alias = "app_id")]
pub app_id: String,
#[serde(alias = "tool_name")]
pub tool_name: String,
#[serde(alias = "link_id")]
pub link_id: String,
pub title: String,
pub call: Option<PluginSearchProviderCall>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, JsonSchema, TS)]
#[serde(rename_all = "camelCase")]
#[ts(export_to = "v2/")]
pub struct PluginSearchProviderCall {
pub name: String,
pub arguments: serde_json::Value,
#[serde(rename = "_meta")]
#[ts(rename = "_meta")]
pub meta: serde_json::Value,
}
@@ -4472,7 +4472,6 @@ fn plugin_share_list_response_serializes_share_items() {
serde_json::to_value(PluginShareListResponse {
data: vec![PluginShareListItem {
plugin: PluginSummary {
extensions: None,
id: "gmail@openai-curated-remote".to_string(),
remote_plugin_id: Some(
"plugins~Plugin_00000000000000000000000000000000".to_string(),
@@ -4502,7 +4501,6 @@ fn plugin_share_list_response_serializes_share_items() {
json!({
"data": [{
"plugin": {
"extensions": null,
"id": "gmail@openai-curated-remote",
"remotePluginId": "plugins~Plugin_00000000000000000000000000000000",
"version": null,
@@ -4555,7 +4553,6 @@ fn plugin_summary_defaults_missing_availability_to_available() {
#[test]
fn plugin_summary_round_trips_plan_eligibility_metadata() {
let value = json!({
"extensions": null,
"id": "gmail@openai-curated-remote",
"remotePluginId": "plugins~Plugin_00000000000000000000000000000000",
"version": null,
@@ -188,7 +188,6 @@ fn convert_configured_marketplace_plugin_to_plugin_summary(
) -> PluginSummary {
let share_context = share_context_for_source(&plugin.source, shared_plugin_ids_by_local_path);
PluginSummary {
extensions: None,
id: plugin.id,
remote_plugin_id: None,
version: None,
@@ -1123,7 +1122,6 @@ impl PluginRequestProcessor {
marketplace_name: outcome.marketplace_name,
marketplace_path: outcome.marketplace_path,
summary: PluginSummary {
extensions: None,
id: outcome.plugin.id,
remote_plugin_id: None,
version: None,
@@ -2181,7 +2179,6 @@ fn remote_marketplace_to_info(marketplace: RemoteMarketplace) -> PluginMarketpla
fn remote_plugin_summary_to_info(summary: RemoteCatalogPluginSummary) -> PluginSummary {
PluginSummary {
extensions: summary.extensions,
id: summary.id,
remote_plugin_id: Some(summary.remote_plugin_id),
version: summary.version,
@@ -639,7 +639,6 @@ async fn plugin_list_keeps_valid_marketplaces_when_another_marketplace_fails_to_
path: Some(valid_marketplace_path),
interface: None,
plugins: vec![PluginSummary {
extensions: None,
id: "valid-plugin@valid-marketplace".to_string(),
remote_plugin_id: None,
version: None,
@@ -761,7 +760,6 @@ async fn plugin_list_uses_alternate_discoverable_manifest_and_keeps_undiscoverab
interface: None,
plugins: vec![
PluginSummary {
extensions: None,
id: "valid-plugin@alternate-marketplace".to_string(),
remote_plugin_id: None,
version: None,
@@ -805,7 +803,6 @@ async fn plugin_list_uses_alternate_discoverable_manifest_and_keeps_undiscoverab
keywords: Vec::new(),
},
PluginSummary {
extensions: None,
id: "missing-plugin@alternate-marketplace".to_string(),
remote_plugin_id: None,
version: None,
@@ -3493,161 +3490,6 @@ async fn plugin_list_does_not_append_global_remote_when_marketplace_kinds_are_ex
Ok(())
}
#[tokio::test]
async fn plugin_installed_preserves_extensions_and_ignores_incompatible_metadata() -> Result<()> {
let codex_home = TempDir::new()?;
let server = MockServer::start().await;
write_plugins_enabled_config_with_base_url(
codex_home.path(),
&format!("{}/backend-api", server.uri()),
)?;
write_chatgpt_auth(
codex_home.path(),
ChatGptAuthFixture::new("chatgpt-token")
.account_id("account-123")
.chatgpt_user_id("user-123")
.chatgpt_account_id("account-123"),
AuthCredentialsStoreMode::File,
)?;
let icon = serde_json::json!({
"src": "https://example.com/parts.svg",
"mimeType": "image/svg+xml",
"sizes": ["any"],
"theme": "light",
});
let quick_action = serde_json::json!({
"title": "Add part",
"icons": [icon.clone()],
"target": {"type": "tool", "name": "parts.add", "arguments": {}},
});
let extensions = serde_json::json!({
"entrypoints": [{
"type": "global",
"app_id": "parts-app",
"tool_name": "parts.open",
"title": "Parts",
"resource_uri": "ui://parts/library",
"icons": [icon.clone()],
"quick_action": quick_action.clone(),
}],
"settings": [{
"app_id": "parts-app",
"read_tool_name": "settings.read",
"update_tool_name": "settings.update",
}],
});
let mut unknown_entrypoint = extensions.clone();
unknown_entrypoint["entrypoints"][0]["type"] = serde_json::json!("futurePlacement");
let mut unknown_action = extensions.clone();
unknown_action["entrypoints"][0]["quick_action"]["target"]["type"] =
serde_json::json!("futureAction");
let mut body: serde_json::Value = serde_json::from_str(&remote_installed_plugin_body(
"", "1.2.3", /*enabled*/ true,
))?;
let template = body["plugins"][0].clone();
body["plugins"][0]["extensions"] = extensions;
for (id, name, extensions) in [
(
"plugins~Plugin_11111111111111111111111111111111",
"future-placement",
unknown_entrypoint,
),
(
"plugins~Plugin_22222222222222222222222222222222",
"future-action",
unknown_action,
),
] {
let mut plugin = template.clone();
plugin["id"] = serde_json::json!(id);
plugin["name"] = serde_json::json!(name);
plugin["extensions"] = extensions;
body["plugins"].as_array_mut().unwrap().push(plugin);
}
mount_remote_installed_plugins(&server, "GLOBAL", &serde_json::to_string(&body)?).await;
mount_remote_installed_plugins(&server, "WORKSPACE", empty_remote_installed_plugins_body())
.await;
mount_empty_user_installed_plugins(&server).await;
let mut mcp = TestAppServer::builder()
.with_codex_home(codex_home.path())
.build_initialized_with_timeout(DEFAULT_TIMEOUT)
.await?;
let expected = BTreeMap::from([
(
"linear@openai-curated-remote".to_string(),
serde_json::json!({
"entrypoints": [{
"type": "global",
"appId": "parts-app",
"toolName": "parts.open",
"title": "Parts",
"resourceUri": "ui://parts/library",
"icons": [icon],
"quickAction": quick_action,
}],
"settingsEntrypoints": [],
"settings": [{
"appId": "parts-app",
"readToolName": "settings.read",
"updateToolName": "settings.update",
}],
"threadEntrypoints": [],
"fileHandlers": [],
"searchMentionProviders": [],
}),
),
(
"future-placement@openai-curated-remote".to_string(),
serde_json::Value::Null,
),
(
"future-action@openai-curated-remote".to_string(),
serde_json::Value::Null,
),
]);
for read in 0..2 {
let request_id = mcp
.send_plugin_installed_request(PluginInstalledParams {
cwds: None,
install_suggestion_plugin_names: None,
})
.await?;
let response: serde_json::Value =
timeout(DEFAULT_TIMEOUT, mcp.read_response(request_id)).await??;
let marketplace = response["marketplaces"]
.as_array()
.unwrap()
.iter()
.find(|marketplace| marketplace["name"] == "openai-curated-remote")
.expect("remote inventory should survive incompatible extension metadata");
let actual = marketplace["plugins"]
.as_array()
.unwrap()
.iter()
.map(|plugin| {
(
plugin["id"].as_str().unwrap().to_string(),
plugin.get("extensions").unwrap().clone(),
)
})
.collect::<BTreeMap<_, _>>();
assert_eq!(actual, expected);
if read == 0 {
let request_id = mcp
.send_raw_request(
"plugin/reconcile",
Some(serde_json::json!({"reason": "tooling_changed"})),
)
.await?;
let _: serde_json::Value =
timeout(DEFAULT_TIMEOUT, mcp.read_response(request_id)).await??;
// Reconciliation publishes the cache before the backend becomes unavailable.
server.reset().await;
}
}
Ok(())
}
#[tokio::test]
async fn plugin_installed_includes_remote_shared_with_me_plugins_when_remote_plugin_disabled()
-> Result<()> {
@@ -164,7 +164,6 @@ async fn plugin_share_save_uploads_local_plugin() -> Result<()> {
PluginShareListResponse {
data: vec![PluginShareListItem {
plugin: PluginSummary {
extensions: None,
id: "demo-plugin@workspace-shared-with-me".to_string(),
remote_plugin_id: Some("plugins_123".to_string()),
version: Some("0.1.0".to_string()),
@@ -586,7 +585,6 @@ async fn plugin_share_list_returns_created_workspace_plugins() -> Result<()> {
PluginShareListResponse {
data: vec![PluginShareListItem {
plugin: PluginSummary {
extensions: None,
id: "demo-plugin@workspace-shared-with-me".to_string(),
remote_plugin_id: Some("plugins_123".to_string()),
version: Some("0.1.0".to_string()),
@@ -1250,7 +1248,6 @@ async fn plugin_share_delete_removes_created_workspace_plugin() -> Result<()> {
PluginShareListResponse {
data: vec![PluginShareListItem {
plugin: PluginSummary {
extensions: None,
id: "demo-plugin@workspace-shared-with-me".to_string(),
remote_plugin_id: Some("plugins_123".to_string()),
version: Some("0.1.0".to_string()),
@@ -857,7 +857,6 @@ fn remote_installed_plugin_in_marketplace(
marketplace_name: &str,
) -> RemoteInstalledPlugin {
RemoteInstalledPlugin {
extensions: None,
canonical_app_id: None,
marketplace_name: marketplace_name.to_string(),
id: format!("plugins~Plugin_{name}"),
+2 -16
View File
@@ -14,7 +14,6 @@ use codex_app_server_protocol::JSONRPCErrorError;
use codex_app_server_protocol::PluginAuthPolicy;
use codex_app_server_protocol::PluginAvailability;
use codex_app_server_protocol::PluginDisabledReason;
use codex_app_server_protocol::PluginExtensions;
use codex_app_server_protocol::PluginInstallPolicy;
use codex_app_server_protocol::PluginInstallPolicySource;
use codex_app_server_protocol::PluginInterface;
@@ -39,7 +38,6 @@ use http::StatusCode;
use serde::Deserialize;
use serde::Serialize;
use serde_json::Value as JsonValue;
use serde_with::serde_as;
use std::collections::BTreeMap;
use std::collections::BTreeSet;
use std::collections::HashMap;
@@ -244,7 +242,6 @@ pub struct RemoteInstalledPlugin {
pub version: Option<String>,
pub name: String,
pub canonical_app_id: Option<String>,
pub extensions: Option<PluginExtensions>,
pub installed_at: Option<DateTime<Utc>>,
pub enabled: bool,
pub install_policy: PluginInstallPolicy,
@@ -260,7 +257,6 @@ pub struct RemoteInstalledPlugin {
#[derive(Debug, Clone, PartialEq)]
pub struct RemotePluginSummary {
pub extensions: Option<PluginExtensions>,
pub id: String,
pub remote_plugin_id: String,
pub version: Option<String>,
@@ -765,15 +761,10 @@ struct RemotePluginDirectorySharePrincipal {
name: String,
}
#[serde_as]
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
struct RemotePluginInstalledItem {
#[serde(flatten)]
plugin: RemotePluginDirectoryItem,
// Unsupported optional declarations must not invalidate the installed inventory.
#[serde_as(deserialize_as = "serde_with::DefaultOnError")]
#[serde(default)]
extensions: Option<PluginExtensions>,
#[serde(default)]
installed_at: Option<DateTime<Utc>>,
enabled: bool,
@@ -800,7 +791,7 @@ struct RecommendedPluginItem {
display_name: String,
}
#[derive(Debug, Clone, PartialEq, Deserialize)]
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
struct RemotePluginInstalledResponse {
plugins: Vec<RemotePluginInstalledItem>,
pagination: RemotePluginPagination,
@@ -1321,7 +1312,6 @@ pub fn group_remote_installed_plugins_by_marketplaces(
continue;
};
let plugin_summary = RemotePluginSummary {
extensions: plugin.extensions.clone(),
id: plugin_id.as_key(),
remote_plugin_id: plugin.id.clone(),
version: plugin.version.clone(),
@@ -1821,7 +1811,6 @@ fn build_remote_plugin_summary(
))
})?;
Ok(RemotePluginSummary {
extensions: installed_plugin.and_then(|plugin| plugin.extensions.clone()),
id: plugin_id.as_key(),
remote_plugin_id: plugin.id.clone(),
version: plugin.release.version.clone(),
@@ -1925,7 +1914,6 @@ fn remote_installed_plugin_to_cache_entry(
version: plugin.release.version.clone(),
name: plugin.name.clone(),
canonical_app_id: plugin.canonical_app_id.clone(),
extensions: installed_plugin.extensions.clone(),
installed_at: installed_plugin.installed_at,
enabled: installed_plugin.enabled,
install_policy: plugin.installation_policy,
@@ -2269,8 +2257,6 @@ async fn get_remote_plugin_installed_page(
let base_url = config.chatgpt_base_url.trim_end_matches('/');
let mut url = Url::parse(&format!("{base_url}/ps/plugins/installed"))
.map_err(RemotePluginCatalogError::InvalidBaseUrl)?;
url.query_pairs_mut()
.append_pair("includeExtensions", "true");
match scope {
RemoteInstalledPluginScope::All => {
url.query_pairs_mut()
@@ -757,11 +757,11 @@ mod tests {
crate::test_support::recorded_http_client_urls(&selected_urls),
vec![
format!(
"{}/backend-api/ps/plugins/installed?includeExtensions=true&limit=200&includeDownloadUrls=true",
"{}/backend-api/ps/plugins/installed?limit=200&includeDownloadUrls=true",
server.uri()
),
format!(
"{}/backend-api/ps/plugins/installed?includeExtensions=true&limit=200&includeDownloadUrls=true&pageToken=page-2",
"{}/backend-api/ps/plugins/installed?limit=200&includeDownloadUrls=true&pageToken=page-2",
server.uri()
),
]
@@ -108,7 +108,6 @@ async fn search_remote_plugins_forwards_parameters_and_converts_results() {
result,
RemotePluginSearchPage {
plugins: vec![RemotePluginSummary {
extensions: None,
id: format!("linear@{REMOTE_GLOBAL_MARKETPLACE_NAME}"),
remote_plugin_id: "plugins~Plugin_linear".to_string(),
version: Some("1.2.3".to_string()),
@@ -635,7 +635,6 @@ async fn list_remote_plugin_shares_fetches_created_workspace_plugins() {
vec![
RemotePluginShareSummary {
summary: RemotePluginSummary {
extensions: None,
id: "demo-plugin@workspace-shared-with-me".to_string(),
remote_plugin_id: "plugins_123".to_string(),
version: Some("0.1.0".to_string()),
@@ -683,7 +682,6 @@ async fn list_remote_plugin_shares_fetches_created_workspace_plugins() {
},
RemotePluginShareSummary {
summary: RemotePluginSummary {
extensions: None,
id: "demo-plugin@workspace-shared-with-me".to_string(),
remote_plugin_id: "plugins_456".to_string(),
version: Some("0.1.0".to_string()),
@@ -14,7 +14,6 @@ fn image_url(renewal: &str) -> String {
fn plugin(renewal: &str) -> RemoteInstalledPlugin {
RemoteInstalledPlugin {
extensions: None,
marketplace_name: REMOTE_GLOBAL_MARKETPLACE_NAME.to_string(),
id: "plugin-test".to_string(),
version: Some("1.0.0".to_string()),
+2 -6
View File
@@ -151,11 +151,11 @@ async fn remote_installed_plugins_paginate_across_all_scopes_without_download_ur
recorded_http_client_urls(&selected_urls),
vec![
format!(
"{}/backend-api/ps/plugins/installed?includeExtensions=true&limit=200",
"{}/backend-api/ps/plugins/installed?limit=200",
server.uri()
),
format!(
"{}/backend-api/ps/plugins/installed?includeExtensions=true&limit=200&pageToken=next+page%2F%2B",
"{}/backend-api/ps/plugins/installed?limit=200&pageToken=next+page%2F%2B",
server.uri()
),
]
@@ -333,7 +333,6 @@ fn build_remote_marketplace_preserves_directory_order_and_appends_installed_only
directory_plugin("plugin-m", "mike"),
];
let installed_plugins = vec![RemotePluginInstalledItem {
extensions: None,
plugin: directory_plugin("plugin-a", "alpha"),
installed_at: None,
enabled: true,
@@ -366,7 +365,6 @@ fn installation_policy_source_is_preserved_across_remote_summary_paths() {
directory_plugin.installation_policy_source =
Some(RemotePluginInstallPolicySource::ImplicitCanonicalApp);
let installed_plugin = RemotePluginInstalledItem {
extensions: None,
plugin: directory_plugin.clone(),
installed_at: None,
enabled: true,
@@ -422,7 +420,6 @@ fn plan_eligibility_is_preserved_across_remote_summary_paths() {
"enterprise_cbp_automation".to_string(),
]);
let installed_plugin = RemotePluginInstalledItem {
extensions: None,
plugin: directory_plugin.clone(),
installed_at: None,
enabled: false,
@@ -516,7 +513,6 @@ fn installation_interstitial_requirement_is_preserved_across_remote_summary_path
directory_plugin.must_show_installation_interstitial = Some(false);
let installed_plugin = remote_installed_plugin_to_cache_entry(&RemotePluginInstalledItem {
extensions: None,
plugin: directory_plugin,
installed_at: None,
enabled: true,
-1
View File
@@ -167,7 +167,6 @@ mod tests {
fn plugin_summary(name: &str) -> PluginSummary {
PluginSummary {
extensions: None,
id: format!("{name}@server-marketplace"),
remote_plugin_id: Some(format!("plugins~{name}")),
version: None,
@@ -1451,7 +1451,6 @@ pub(super) fn plugins_test_summary(
install_policy: PluginInstallPolicy,
) -> PluginSummary {
PluginSummary {
extensions: None,
id: id.to_string(),
remote_plugin_id: None,
version: None,
@@ -1488,7 +1487,6 @@ pub(super) fn plugins_test_remote_summary(
installed: bool,
) -> PluginSummary {
PluginSummary {
extensions: None,
id: remote_plugin_id.to_string(),
remote_plugin_id: Some(remote_plugin_id.to_string()),
version: None,
@@ -3145,16 +3145,6 @@ class PluginHookSummary(BaseModel):
key: str
class PluginIcon(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
mime_type: Annotated[str | None, Field(alias="mimeType")] = None
sizes: list[str] | None = None
src: str
theme: str | None = None
class PluginInstallParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -3307,22 +3297,6 @@ class PluginListParams(BaseModel):
] = None
class ToolPluginQuickActionTarget(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
arguments: Any | None = None
name: str
type: Annotated[Literal["tool"], Field(title="ToolPluginQuickActionTargetType")]
class PluginQuickActionTarget(RootModel[ToolPluginQuickActionTarget]):
model_config = ConfigDict(
populate_by_name=True,
)
root: ToolPluginQuickActionTarget
class PluginReadParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -3390,30 +3364,12 @@ class PluginReconcileResponse(BaseModel):
]
class PluginSearchProviderCall(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
field_meta: Annotated[Any, Field(alias="_meta")]
arguments: Any
name: str
class PluginSearchScope(Enum):
global_ = "global"
workspace = "workspace"
personal = "personal"
class PluginSettings(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
app_id: Annotated[str, Field(alias="appId")]
read_tool_name: Annotated[str, Field(alias="readToolName")]
update_tool_name: Annotated[str, Field(alias="updateToolName")]
class PluginShareCheckoutParams(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -8753,64 +8709,6 @@ class PermissionProfileListResponse(BaseModel):
] = None
class SettingsPluginEntrypoint(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
app_id: Annotated[str, Field(alias="appId")]
icons: list[PluginIcon]
resource_uri: Annotated[str, Field(alias="resourceUri")]
search_terms: Annotated[list[str] | None, Field(alias="searchTerms")] = []
title: str
tool_name: Annotated[str, Field(alias="toolName")]
type: Annotated[Literal["settings"], Field(title="SettingsPluginEntrypointType")]
class ThreadPluginEntrypoint(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
app_id: Annotated[str, Field(alias="appId")]
icons: list[PluginIcon]
resource_uri: Annotated[str, Field(alias="resourceUri")]
title: str
tool_name: Annotated[str, Field(alias="toolName")]
type: Annotated[Literal["thread"], Field(title="ThreadPluginEntrypointType")]
class FilePluginEntrypoint(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
app_id: Annotated[str, Field(alias="appId")]
extensions: list[str]
icons: list[PluginIcon]
resource_uri: Annotated[str, Field(alias="resourceUri")]
title: str
tool_name: Annotated[str, Field(alias="toolName")]
type: Annotated[Literal["file"], Field(title="FilePluginEntrypointType")]
class PluginQuickAction(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
icons: list[PluginIcon]
target: PluginQuickActionTarget
title: str
class PluginSearchProvider(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
app_id: Annotated[str, Field(alias="appId")]
call: PluginSearchProviderCall | None = None
link_id: Annotated[str, Field(alias="linkId")]
title: str
tool_name: Annotated[str, Field(alias="toolName")]
class PluginSharePrincipal(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -10942,56 +10840,6 @@ class ModelsRequirements(BaseModel):
new_thread: Annotated[NewThreadModelDefaults | None, Field(alias="newThread")] = None
class GlobalPluginEntrypoint(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
app_id: Annotated[str, Field(alias="appId")]
icons: list[PluginIcon]
quick_action: Annotated[PluginQuickAction | None, Field(alias="quickAction")] = None
resource_uri: Annotated[str, Field(alias="resourceUri")]
title: str
tool_name: Annotated[str, Field(alias="toolName")]
type: Annotated[Literal["global"], Field(title="GlobalPluginEntrypointType")]
class PluginEntrypoint(
RootModel[
GlobalPluginEntrypoint
| SettingsPluginEntrypoint
| ThreadPluginEntrypoint
| FilePluginEntrypoint
]
):
model_config = ConfigDict(
populate_by_name=True,
)
root: (
GlobalPluginEntrypoint
| SettingsPluginEntrypoint
| ThreadPluginEntrypoint
| FilePluginEntrypoint
)
class PluginExtensions(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
)
entrypoints: list[PluginEntrypoint] | None = None
file_handlers: Annotated[list[PluginEntrypoint] | None, Field(alias="fileHandlers")] = []
search_mention_providers: Annotated[
list[PluginSearchProvider] | None, Field(alias="searchMentionProviders")
] = []
settings: list[PluginSettings] | None = []
settings_entrypoints: Annotated[
list[PluginEntrypoint] | None, Field(alias="settingsEntrypoints")
] = []
thread_entrypoints: Annotated[
list[PluginEntrypoint] | None, Field(alias="threadEntrypoints")
] = []
class PluginShareContext(BaseModel):
model_config = ConfigDict(
populate_by_name=True,
@@ -11048,7 +10896,6 @@ class PluginSummary(BaseModel):
),
] = None
enabled: bool
extensions: PluginExtensions | None = None
id: str
install_policy: Annotated[PluginInstallPolicy, Field(alias="installPolicy")]
install_policy_source: Annotated[