integration = $integration; parent::__construct(); } /** * @since 0.0.34 * @return string */ protected function group(): string { return $this->integration->group(); } /** * @since 0.0.34 * @return string */ protected function slug(): string { return 'toolset/' . $this->integration->group(); } /** * @since 0.0.34 * @return string */ protected function toolset_label(): string { return $this->integration->toolset_label(); } /** * @since 0.0.34 * @return string */ protected function toolset_description(): string { return $this->integration->toolset_description(); } /** * Integrations are not part of the server type's default set. * * Every dispatcher here exists because a PLUGIN is installed, so including * them would make the default set differ per site and change whenever a * plugin is activated or this add-on ships another integration. A connected * MCP client caches `tools/list` and cannot be told it changed, so a moving * default set is one that connected clients are quietly wrong about. * * They remain fully registered tools — still in the picker, still addable by * hand, still callable. `toolset/integrations` also lists and runs every one * of them, so a client whose cached list predates the plugin can still reach * it. * * **The catch-all is the exception.** `other` is an integration in the * mechanical sense — it is declared through the same registry * ({@see AcrossAI_Toolset_Integrations::CATCH_ALL_GROUP}) — but it is present * on every site and holds abilities belonging to no group. It is stable, so * it stays a default. A blanket `false` here would drop it silently. * * @since 0.0.34 * @return bool */ protected function is_server_type_default(): bool { if ( AcrossAI_Toolset_Integrations::CATCH_ALL_GROUP === $this->group() ) { return parent::is_server_type_default(); } return false; } /** * Every dispatcher built from a declaration follows a plugin. * * True for the catch-all too, and most of all: what falls through to `other` * is decided by which prefixes the installed plugins claim, so it can gain * and lose abilities without anything being installed that is obviously * "its" plugin. * * @since 0.0.38 * @return bool */ protected function is_volatile(): bool { return true; } }