code: def _shell_commands(self) -> List[str]:
      commands = []
      commands += self.ide.get_install_commands()
      commands.append(INSTALL_IPYKERNEL)
      commands += self.run_spec.configuration.setup
      commands.append("echo ''")
      commands += self.ide.get_print_readme_commands()
      commands += [
          f"echo 'To connect via SSH, use: `ssh {self.run_spec.run_name}`'",
          "echo ''",
          "echo -n 'To exit, press Ctrl+C.'",
      ]
      commands += self.run_spec.configuration.init
      commands += ["tail -f /dev/null"]  # idle
      return commands
  
file_path: dstack/src/dstack/_internal/server/services/jobs/configurators/dev.py
imports: from typing import List, Optional
  from dstack._internal.core.models.configurations import ConfigurationType, PortMapping
  from dstack._internal.core.models.profiles import ProfileRetryPolicy, SpotPolicy
  from dstack._internal.core.models.runs import RetryPolicy, RunSpec
  from dstack._internal.server.services.jobs.configurators.base import JobConfigurator
  from dstack._internal.server.services.jobs.configurators.extensions.vscode import VSCodeDesktop
label_desc: Use image node_id 2 for calling the DevEnvironmentJobConfigurator obj's underlying member method code with example usage: obj._shell_commands() and returns: commands