| import type { MarketplacePlugin } from "#/api/plugins-service"; | |
| import type { PluginSpec } from "#/api/conversation-service/agent-server-conversation-service.types"; | |
| /** | |
| * Stable identity for a plugin reference. Two references are "the same" when | |
| * their attachable coordinates (source / ref / repo_path) match — `name`, | |
| * `description`, install state, and parameters are intentionally excluded, | |
| * since the start-conversation payload only carries coordinates. | |
| * | |
| * `null` and `undefined` collapse to "" so a catalog entry (`ref?: null`) and a | |
| * stored spec (`ref: null`) compare equal. | |
| */ | |
| export function pluginSpecKey( | |
| plugin: Pick<PluginSpec, "source" | "ref" | "repo_path">, | |
| ): string { | |
| return [plugin.source, plugin.ref ?? "", plugin.repo_path ?? ""].join(" |