Copy disabled (too large)
Download .txt
Showing preview only (18,914K chars total). Download the full file to get everything.
Repository: loft-sh/devpod
Branch: main
Commit: 5a0efcbff661
Files: 13349
Total size: 104.8 MB
Directory structure:
gitextract_ynafywdj/
├── .devcontainer/
│ ├── devcontainer.json
│ └── post_create.sh
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ └── feature-request.md
│ ├── devcontainer/
│ │ ├── Dockerfile
│ │ └── devcontainer.json
│ ├── licenses.tmpl
│ └── workflows/
│ ├── build-devcontainer-image.yaml
│ ├── e2e-tests.yaml
│ ├── e2e-win-full-tests.yaml
│ ├── go-licenses-check.yaml
│ ├── go-licenses.yaml
│ ├── golangci-lint.yaml
│ ├── release.yaml
│ ├── stale.yaml
│ ├── ui-ci.yaml
│ └── unit-tests.yaml
├── .gitignore
├── .golangci.yaml
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── COMMUNITY.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── cmd/
│ ├── agent/
│ │ ├── agent.go
│ │ ├── container/
│ │ │ ├── container.go
│ │ │ ├── credentials_server.go
│ │ │ ├── daemon.go
│ │ │ ├── openvscode_async.go
│ │ │ ├── setup.go
│ │ │ ├── setup_loft_platform_access.go
│ │ │ ├── setup_windows.go
│ │ │ ├── ssh_server.go
│ │ │ └── vscode_async.go
│ │ ├── container_tunnel.go
│ │ ├── daemon.go
│ │ ├── docker_credentials.go
│ │ ├── git_credentials.go
│ │ ├── git_ssh_signature.go
│ │ ├── git_ssh_signature_helper.go
│ │ └── workspace/
│ │ ├── build.go
│ │ ├── delete.go
│ │ ├── install_dotfiles.go
│ │ ├── logs.go
│ │ ├── logs_daemon.go
│ │ ├── setup_gpg.go
│ │ ├── status.go
│ │ ├── stop.go
│ │ ├── up.go
│ │ ├── update_config.go
│ │ └── workspace.go
│ ├── build.go
│ ├── completion/
│ │ └── suggestions.go
│ ├── context/
│ │ ├── context.go
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── list.go
│ │ ├── options.go
│ │ ├── set_options.go
│ │ └── use.go
│ ├── delete.go
│ ├── export.go
│ ├── flags/
│ │ └── flags.go
│ ├── helper/
│ │ ├── check_provider_update.go
│ │ ├── docker_credentials.go
│ │ ├── fleet_helper.go
│ │ ├── get_image.go
│ │ ├── get_provider_name.go
│ │ ├── get_workspace_config.go
│ │ ├── get_workspace_name.go
│ │ ├── get_workspace_uid.go
│ │ ├── helper.go
│ │ ├── http/
│ │ │ ├── http.go
│ │ │ └── request.go
│ │ ├── json/
│ │ │ ├── get.go
│ │ │ └── json.go
│ │ ├── sh.go
│ │ ├── ssh_client.go
│ │ ├── ssh_git_clone.go
│ │ ├── ssh_server.go
│ │ └── strings/
│ │ └── strings.go
│ ├── ide/
│ │ ├── ide.go
│ │ ├── list.go
│ │ ├── options.go
│ │ ├── set_options.go
│ │ └── use.go
│ ├── import.go
│ ├── list.go
│ ├── logs.go
│ ├── logs_daemon.go
│ ├── machine/
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── inspect.go
│ │ ├── list.go
│ │ ├── machine.go
│ │ ├── ssh.go
│ │ ├── start.go
│ │ ├── status.go
│ │ └── stop.go
│ ├── ping.go
│ ├── pro/
│ │ ├── add/
│ │ │ ├── add.go
│ │ │ └── cluster.go
│ │ ├── check_health.go
│ │ ├── check_update.go
│ │ ├── completion/
│ │ │ └── suggestions.go
│ │ ├── create_workspace.go
│ │ ├── daemon/
│ │ │ ├── daemon.go
│ │ │ ├── netcheck.go
│ │ │ ├── start.go
│ │ │ └── status.go
│ │ ├── delete.go
│ │ ├── flags/
│ │ │ └── flags.go
│ │ ├── import_workspace.go
│ │ ├── list.go
│ │ ├── list_clusters.go
│ │ ├── list_projects.go
│ │ ├── list_templates.go
│ │ ├── list_workspaces.go
│ │ ├── login.go
│ │ ├── pro.go
│ │ ├── provider/
│ │ │ ├── create/
│ │ │ │ ├── create.go
│ │ │ │ └── workspace.go
│ │ │ ├── delete.go
│ │ │ ├── get/
│ │ │ │ ├── get.go
│ │ │ │ ├── self.go
│ │ │ │ ├── version.go
│ │ │ │ └── workspace.go
│ │ │ ├── health.go
│ │ │ ├── list/
│ │ │ │ ├── clusters.go
│ │ │ │ ├── list.go
│ │ │ │ ├── projects.go
│ │ │ │ ├── templates.go
│ │ │ │ └── workspaces.go
│ │ │ ├── provider.go
│ │ │ ├── rebuild.go
│ │ │ ├── ssh.go
│ │ │ ├── status.go
│ │ │ ├── stop.go
│ │ │ ├── up.go
│ │ │ ├── update/
│ │ │ │ ├── update.go
│ │ │ │ └── workspace.go
│ │ │ └── watch/
│ │ │ ├── watch.go
│ │ │ └── workspaces.go
│ │ ├── rebuild.go
│ │ ├── reset/
│ │ │ ├── password.go
│ │ │ └── reset.go
│ │ ├── self.go
│ │ ├── sleep.go
│ │ ├── start.go
│ │ ├── update_provider.go
│ │ ├── update_workspace.go
│ │ ├── version.go
│ │ ├── wakeup.go
│ │ └── watch_workspaces.go
│ ├── profile.go
│ ├── provider/
│ │ ├── add.go
│ │ ├── delete.go
│ │ ├── list-default-providers.go
│ │ ├── list.go
│ │ ├── options.go
│ │ ├── provider.go
│ │ ├── set_options.go
│ │ ├── update.go
│ │ └── use.go
│ ├── root.go
│ ├── ssh.go
│ ├── status.go
│ ├── stop.go
│ ├── troubleshoot.go
│ ├── up.go
│ ├── upgrade.go
│ ├── use/
│ │ └── use.go
│ └── version.go
├── community.yaml
├── desktop/
│ ├── .gitignore
│ ├── .npmrc
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── .vscode/
│ │ └── extensions.json
│ ├── README.md
│ ├── eslint.config.js
│ ├── flatpak/
│ │ ├── DevPod.metainfo.xml
│ │ └── sh.loft.devpod.tmpl
│ ├── index.html
│ ├── package.json
│ ├── src/
│ │ ├── App/
│ │ │ ├── App.tsx
│ │ │ ├── Changelog.tsx
│ │ │ ├── OSSApp.tsx
│ │ │ ├── ProApp.tsx
│ │ │ ├── constants.ts
│ │ │ ├── index.ts
│ │ │ ├── useAppReady.tsx
│ │ │ ├── useChangelogModal.tsx
│ │ │ └── usePreserveLocation.tsx
│ │ ├── ProRoot.tsx
│ │ ├── Theme/
│ │ │ ├── ThemeProvider.tsx
│ │ │ ├── button.ts
│ │ │ ├── card.ts
│ │ │ ├── checkbox.ts
│ │ │ ├── form.ts
│ │ │ ├── index.ts
│ │ │ ├── input.ts
│ │ │ ├── menu.ts
│ │ │ ├── modal.ts
│ │ │ ├── popover.ts
│ │ │ ├── radio.ts
│ │ │ ├── select.ts
│ │ │ ├── switch.ts
│ │ │ ├── tabs.ts
│ │ │ ├── tag.ts
│ │ │ ├── text.ts
│ │ │ ├── textarea.ts
│ │ │ ├── theme.ts
│ │ │ └── themeHooks.tsx
│ │ ├── client/
│ │ │ ├── client.ts
│ │ │ ├── command.ts
│ │ │ ├── commandCache.ts
│ │ │ ├── constants.ts
│ │ │ ├── context/
│ │ │ │ ├── client.ts
│ │ │ │ ├── contextCommands.ts
│ │ │ │ └── index.ts
│ │ │ ├── ides/
│ │ │ │ ├── client.ts
│ │ │ │ ├── ideCommands.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── pro/
│ │ │ │ ├── client.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── proCommands.ts
│ │ │ ├── providers/
│ │ │ │ ├── client.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── providerCommands.ts
│ │ │ ├── tauriClient/
│ │ │ │ └── index.ts
│ │ │ ├── types.ts
│ │ │ └── workspaces/
│ │ │ ├── client.ts
│ │ │ ├── index.ts
│ │ │ └── workspaceCommands.ts
│ │ ├── components/
│ │ │ ├── Animation/
│ │ │ │ ├── Ripple.tsx
│ │ │ │ └── index.ts
│ │ │ ├── AutoComplete/
│ │ │ │ ├── AutoComplete.tsx
│ │ │ │ └── index.ts
│ │ │ ├── BottomActionBar/
│ │ │ │ ├── BottomActionBar.tsx
│ │ │ │ └── index.ts
│ │ │ ├── CardHeader/
│ │ │ │ ├── WorkspaceCardHeader.tsx
│ │ │ │ └── index.ts
│ │ │ ├── DeleteWorkspacesModal/
│ │ │ │ ├── DeleteWorkspacesModal.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Error/
│ │ │ │ ├── ErrorMessageBox.tsx
│ │ │ │ └── index.ts
│ │ │ ├── ExampleCard.tsx
│ │ │ ├── Form/
│ │ │ │ ├── Form.tsx
│ │ │ │ └── index.ts
│ │ │ ├── IDEGroup/
│ │ │ │ ├── IDEGroup.tsx
│ │ │ │ └── index.ts
│ │ │ ├── IDEIcon/
│ │ │ │ ├── IDEIcon.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Layout/
│ │ │ │ ├── NavigationViewLayout.tsx
│ │ │ │ ├── Notifications.tsx
│ │ │ │ ├── ProLayout.tsx
│ │ │ │ ├── ProSwitcher.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── StatusBar.tsx
│ │ │ │ ├── Toolbar.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── ListSelection/
│ │ │ │ ├── ListSelection.tsx
│ │ │ │ └── index.ts
│ │ │ ├── LoftOSSBadge.tsx
│ │ │ ├── Section/
│ │ │ │ ├── CollapsibleSection.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Steps/
│ │ │ │ ├── Steps.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Tag/
│ │ │ │ ├── IconTag.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Terminal/
│ │ │ │ ├── Terminal.tsx
│ │ │ │ ├── TerminalSearchBar.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── useStreamingTerminal.tsx
│ │ │ │ └── useTerminalSearch.tsx
│ │ │ ├── Warning/
│ │ │ │ ├── WarningMessageBox.tsx
│ │ │ │ └── index.ts
│ │ │ ├── WorkspaceOwnerFilter/
│ │ │ │ ├── WorkspaceOwnerFilter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── WorkspaceSorter/
│ │ │ │ ├── WorkspaceSorter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── WorkspaceStatusFilter/
│ │ │ │ ├── WorkspaceStatusFilter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ └── useInstallCLI.tsx
│ │ ├── constants.ts
│ │ ├── contexts/
│ │ │ ├── DevPodContext/
│ │ │ │ ├── DevPodProvider/
│ │ │ │ │ ├── DevPodContext.tsx
│ │ │ │ │ ├── DevPodProvider.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Pro/
│ │ │ │ │ ├── ContextSwitcher.tsx
│ │ │ │ │ ├── ProProvider.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useProContext.ts
│ │ │ │ │ ├── useProHost.ts
│ │ │ │ │ ├── useProjectClusters.tsx
│ │ │ │ │ ├── useTemplates.ts
│ │ │ │ │ └── workspaceInstance.ts
│ │ │ │ ├── action/
│ │ │ │ │ ├── action.ts
│ │ │ │ │ ├── actionHistory.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useAction.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── proInstances/
│ │ │ │ │ ├── ProInstancesProvider.tsx
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useProInstanceManager.ts
│ │ │ │ │ └── useProInstances.tsx
│ │ │ │ ├── useProvider.ts
│ │ │ │ ├── useProviderManager.ts
│ │ │ │ ├── useProviders.ts
│ │ │ │ ├── workspaceStore/
│ │ │ │ │ ├── WorkspaceStoreProvider.tsx
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useWorkspaceStore.ts
│ │ │ │ │ └── workspaceStore.ts
│ │ │ │ └── workspaces/
│ │ │ │ ├── index.ts
│ │ │ │ ├── useAllWorkspaceActions.ts
│ │ │ │ ├── usePollWorkspaces.ts
│ │ │ │ ├── useWorkspace.ts
│ │ │ │ └── useWorkspaces.ts
│ │ │ ├── SettingsContext/
│ │ │ │ ├── SettingsContext.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useSettings.ts
│ │ │ ├── ToolbarContext/
│ │ │ │ ├── ToolbarContext.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useToolbar.ts
│ │ │ └── index.ts
│ │ ├── gen/
│ │ │ ├── Asset.ts
│ │ │ ├── Author.ts
│ │ │ ├── ColorMode.ts
│ │ │ ├── DaemonState.ts
│ │ │ ├── DaemonStatus.ts
│ │ │ ├── Release.ts
│ │ │ ├── Settings.ts
│ │ │ ├── SidebarPosition.ts
│ │ │ ├── Zoom.ts
│ │ │ └── index.ts
│ │ ├── icons/
│ │ │ ├── ArrowCycle.tsx
│ │ │ ├── ArrowDown.tsx
│ │ │ ├── ArrowLeft.tsx
│ │ │ ├── ArrowPath.tsx
│ │ │ ├── ArrowUp.tsx
│ │ │ ├── Bell.tsx
│ │ │ ├── BellDuotone.tsx
│ │ │ ├── Briefcase.tsx
│ │ │ ├── CPU.tsx
│ │ │ ├── CheckCircle.tsx
│ │ │ ├── CircleDuotone.tsx
│ │ │ ├── CircleWithArrow.tsx
│ │ │ ├── Clock.tsx
│ │ │ ├── Close.tsx
│ │ │ ├── Code.tsx
│ │ │ ├── Cog.tsx
│ │ │ ├── CogDuotone.tsx
│ │ │ ├── CogOutlined.tsx
│ │ │ ├── CommandLine.tsx
│ │ │ ├── Connect.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── Database.tsx
│ │ │ ├── DevPodProBadge.tsx
│ │ │ ├── Devpod.tsx
│ │ │ ├── DevpodWordmark.tsx
│ │ │ ├── Ellipsis.tsx
│ │ │ ├── ExclamationCircle.tsx
│ │ │ ├── ExclamationTriangle.tsx
│ │ │ ├── File.tsx
│ │ │ ├── Folder.tsx
│ │ │ ├── Form.tsx
│ │ │ ├── Git.tsx
│ │ │ ├── GitBranch.tsx
│ │ │ ├── GitCommit.tsx
│ │ │ ├── GitPR.tsx
│ │ │ ├── GitSubPath.tsx
│ │ │ ├── Globe.tsx
│ │ │ ├── Gold.tsx
│ │ │ ├── History.tsx
│ │ │ ├── Image.tsx
│ │ │ ├── Laptop.tsx
│ │ │ ├── LockDuotone.tsx
│ │ │ ├── Loft.tsx
│ │ │ ├── LoftDevpodPro.tsx
│ │ │ ├── MatchCase.tsx
│ │ │ ├── Memory.tsx
│ │ │ ├── NotFound.tsx
│ │ │ ├── Parameters.tsx
│ │ │ ├── Pause.tsx
│ │ │ ├── Play.tsx
│ │ │ ├── Plus.tsx
│ │ │ ├── Preset.tsx
│ │ │ ├── ProfileDuotone.tsx
│ │ │ ├── ProviderPlaceholder.tsx
│ │ │ ├── Search.tsx
│ │ │ ├── Sleep.tsx
│ │ │ ├── Stack3D.tsx
│ │ │ ├── Status.tsx
│ │ │ ├── Stop.tsx
│ │ │ ├── Template.tsx
│ │ │ ├── Trash.tsx
│ │ │ ├── User.tsx
│ │ │ ├── WholeWord.tsx
│ │ │ ├── WorkspaceStatus.tsx
│ │ │ ├── defaultProps.tsx
│ │ │ └── index.ts
│ │ ├── images/
│ │ │ └── index.ts
│ │ ├── lib/
│ │ │ ├── debugSettings.ts
│ │ │ ├── eventManager.ts
│ │ │ ├── helpers.ts
│ │ │ ├── index.ts
│ │ │ ├── modals/
│ │ │ │ ├── index.ts
│ │ │ │ ├── useDeleteWorkspaceModal.tsx
│ │ │ │ ├── useLoginProModal.tsx
│ │ │ │ ├── useRebuildWorkspaceModal.tsx
│ │ │ │ ├── useResetWorkspaceModal.tsx
│ │ │ │ └── useStopWorkspaceModal.tsx
│ │ │ ├── platform.ts
│ │ │ ├── pro/
│ │ │ │ ├── constants.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── name.ts
│ │ │ │ ├── parameters.tsx
│ │ │ │ ├── source.ts
│ │ │ │ ├── time.ts
│ │ │ │ └── useConnectionStatus.tsx
│ │ │ ├── randomWords.ts
│ │ │ ├── releases.ts
│ │ │ ├── result.ts
│ │ │ ├── store.ts
│ │ │ ├── systemInfo.ts
│ │ │ ├── types.ts
│ │ │ ├── useDownloadLogs.ts
│ │ │ ├── useFormErrors.ts
│ │ │ ├── useHover.ts
│ │ │ ├── useSelection.ts
│ │ │ ├── useSortWorkspaces.tsx
│ │ │ ├── useStoreTroubleshoot.ts
│ │ │ ├── useUpdate.ts
│ │ │ └── useVersion.ts
│ │ ├── main.tsx
│ │ ├── queryKeys.ts
│ │ ├── routes.tsx
│ │ ├── runner.ts
│ │ ├── types.ts
│ │ ├── useCommunityContributions.ts
│ │ ├── useIDEs.ts
│ │ ├── useWelcomeModal.tsx
│ │ ├── views/
│ │ │ ├── Actions/
│ │ │ │ ├── Action.tsx
│ │ │ │ ├── Actions.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useActionTitle.tsx
│ │ │ ├── Pro/
│ │ │ │ ├── BackToWorkspaces.tsx
│ │ │ │ ├── CreateWorkspace/
│ │ │ │ │ ├── CreateWorkspace.tsx
│ │ │ │ │ ├── CreateWorkspaceForm.tsx
│ │ │ │ │ ├── DevContainerInput.tsx
│ │ │ │ │ ├── IDEInput.tsx
│ │ │ │ │ ├── InfrastructureTemplateInput.tsx
│ │ │ │ │ ├── PresetInput.tsx
│ │ │ │ │ ├── RunnerInput.tsx
│ │ │ │ │ ├── SourceInput.tsx
│ │ │ │ │ ├── UpdateWorkspace.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── Credentials/
│ │ │ │ │ ├── AddGitHTTPCredentials.tsx
│ │ │ │ │ ├── AddGitSSHCredentials.tsx
│ │ │ │ │ ├── Credentials.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── ListWorkspaces.tsx
│ │ │ │ ├── ProInstance.tsx
│ │ │ │ ├── Profile.tsx
│ │ │ │ ├── SelectPreset/
│ │ │ │ │ ├── SelectPreset.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Settings.tsx
│ │ │ │ ├── Workspace/
│ │ │ │ │ ├── Configuration.tsx
│ │ │ │ │ ├── Logs.tsx
│ │ │ │ │ ├── Tabs.tsx
│ │ │ │ │ ├── Workspace.tsx
│ │ │ │ │ ├── WorkspaceCardHeader.tsx
│ │ │ │ │ ├── WorkspaceDetails.tsx
│ │ │ │ │ ├── WorkspaceInstanceCard.tsx
│ │ │ │ │ ├── WorkspaceStatus.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── status.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useTemplate.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ └── index.ts
│ │ │ ├── Providers/
│ │ │ │ ├── AddProvider/
│ │ │ │ │ ├── ConfigureProviderOptionsForm.tsx
│ │ │ │ │ ├── LoadingProviderIndicator.tsx
│ │ │ │ │ ├── OptionFormField.tsx
│ │ │ │ │ ├── SetupClonedProvider.tsx
│ │ │ │ │ ├── SetupProviderSourceForm.tsx
│ │ │ │ │ ├── SetupProviderSteps.tsx
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useAddProvider.ts
│ │ │ │ │ ├── useProviderOptions.ts
│ │ │ │ │ └── useSetupProvider.ts
│ │ │ │ ├── ListProviders.tsx
│ │ │ │ ├── Provider.tsx
│ │ │ │ ├── ProviderCard.tsx
│ │ │ │ ├── Providers.tsx
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── useDeleteProviderModal.tsx
│ │ │ │ ├── useProviderTitle.tsx
│ │ │ │ └── useSetupProviderModal.tsx
│ │ │ ├── Settings/
│ │ │ │ ├── ClearableInput.tsx
│ │ │ │ ├── Settings.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── useContextOptions.tsx
│ │ │ │ ├── useIDESettings.tsx
│ │ │ │ └── useSettingsOptions.tsx
│ │ │ ├── Workspaces/
│ │ │ │ ├── CreateWorkspace/
│ │ │ │ │ ├── CreateWorkspace.tsx
│ │ │ │ │ ├── ProviderOptionsPopover.tsx
│ │ │ │ │ ├── WorkspaceSourceInput.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useCreateWorkspaceForm.tsx
│ │ │ │ ├── ListWorkspaces.tsx
│ │ │ │ ├── WorkspaceCard.tsx
│ │ │ │ ├── WorkspaceControls.tsx
│ │ │ │ ├── WorkspaceStatusBadge.tsx
│ │ │ │ ├── Workspaces.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useWorkspaceTitle.tsx
│ │ │ └── index.ts
│ │ └── vite-env.d.ts
│ ├── src-tauri/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Info.plist
│ │ ├── bin/
│ │ │ └── .gitkeep
│ │ ├── build.rs
│ │ ├── capabilities/
│ │ │ ├── migrated.json
│ │ │ └── updater.json
│ │ ├── entitlements.plist
│ │ ├── gen/
│ │ │ └── schemas/
│ │ │ ├── acl-manifests.json
│ │ │ ├── capabilities.json
│ │ │ ├── desktop-schema.json
│ │ │ ├── linux-schema.json
│ │ │ ├── macOS-schema.json
│ │ │ └── windows-schema.json
│ │ ├── icons/
│ │ │ └── icon.icns
│ │ ├── sign.bat
│ │ ├── src/
│ │ │ ├── action_logs.rs
│ │ │ ├── commands/
│ │ │ │ ├── config.rs
│ │ │ │ ├── constants.rs
│ │ │ │ ├── delete_pro_instance.rs
│ │ │ │ ├── delete_provider.rs
│ │ │ │ ├── list_pro_instances.rs
│ │ │ │ ├── list_workspaces.rs
│ │ │ │ └── start_daemon.rs
│ │ │ ├── commands.rs
│ │ │ ├── community_contributions.rs
│ │ │ ├── custom_protocol.rs
│ │ │ ├── daemon/
│ │ │ │ └── client.rs
│ │ │ ├── daemon.rs
│ │ │ ├── file_exists.rs
│ │ │ ├── fix_env.rs
│ │ │ ├── get_env.rs
│ │ │ ├── install_cli.rs
│ │ │ ├── logging.rs
│ │ │ ├── main.rs
│ │ │ ├── providers.rs
│ │ │ ├── resource_watcher.rs
│ │ │ ├── server.rs
│ │ │ ├── settings.rs
│ │ │ ├── system_tray.rs
│ │ │ ├── ui_messages.rs
│ │ │ ├── ui_ready.rs
│ │ │ ├── updates.rs
│ │ │ ├── util.rs
│ │ │ └── window.rs
│ │ ├── tauri-dev-linux.conf.json
│ │ ├── tauri-dev.conf.json
│ │ ├── tauri-flatpak.conf.json
│ │ └── tauri.conf.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── update-window/
│ │ ├── index.html
│ │ └── src/
│ │ └── main.tsx
│ └── vite.config.ts
├── docs/
│ ├── .gitignore
│ ├── README.md
│ ├── docusaurus.config.js
│ ├── package.json
│ ├── pages/
│ │ ├── developing-in-workspaces/
│ │ │ ├── connect-to-a-workspace.mdx
│ │ │ ├── create-a-workspace.mdx
│ │ │ ├── credentials.mdx
│ │ │ ├── delete-a-workspace.mdx
│ │ │ ├── devcontainer-json.mdx
│ │ │ ├── dotfiles-in-a-workspace.mdx
│ │ │ ├── environment-variables-in-devcontainer-json.mdx
│ │ │ ├── inactivity-timeout.mdx
│ │ │ ├── prebuild-a-workspace.mdx
│ │ │ ├── stop-a-workspace.mdx
│ │ │ └── what-are-workspaces.mdx
│ │ ├── developing-providers/
│ │ │ ├── agent.mdx
│ │ │ ├── binaries.mdx
│ │ │ ├── driver.mdx
│ │ │ ├── options.mdx
│ │ │ └── quickstart.mdx
│ │ ├── fragments/
│ │ │ ├── add-provider.mdx
│ │ │ ├── setup-virtualbox.mdx
│ │ │ └── virtualbox-ubuntu-22.04.mdx
│ │ ├── getting-started/
│ │ │ ├── install.mdx
│ │ │ ├── quickstart-devpod-cli.mdx
│ │ │ ├── quickstart-jetbrains.mdx
│ │ │ ├── quickstart-ssh.mdx
│ │ │ ├── quickstart-vim.mdx
│ │ │ ├── quickstart-vscode-browser.mdx
│ │ │ ├── quickstart-vscode.mdx
│ │ │ └── update.mdx
│ │ ├── how-it-works/
│ │ │ ├── building-workspaces.mdx
│ │ │ ├── deploy-k8s.mdx
│ │ │ ├── deploy-machines.mdx
│ │ │ ├── deploying-workspaces.mdx
│ │ │ └── overview.mdx
│ │ ├── licenses/
│ │ │ └── devpod.mdx
│ │ ├── managing-machines/
│ │ │ ├── manage-machines.mdx
│ │ │ └── what-are-machines.mdx
│ │ ├── managing-providers/
│ │ │ ├── add-provider.mdx
│ │ │ ├── delete-provider.mdx
│ │ │ ├── update-provider.mdx
│ │ │ └── what-are-providers.mdx
│ │ ├── other-topics/
│ │ │ ├── advanced-guides/
│ │ │ │ └── minikube-vscode-browser.mdx
│ │ │ ├── mobile-support.mdx
│ │ │ └── telemetry.mdx
│ │ ├── quickstart/
│ │ │ ├── browser.mdx
│ │ │ ├── devpod-cli.mdx
│ │ │ ├── jetbrains.mdx
│ │ │ ├── ssh.mdx
│ │ │ ├── vim.mdx
│ │ │ └── vscode.mdx
│ │ ├── troubleshooting/
│ │ │ ├── ide-troubleshooting.mdx
│ │ │ ├── linux-troubleshooting.mdx
│ │ │ ├── troubleshooting.mdx
│ │ │ └── windows-troubleshooting.mdx
│ │ ├── tutorials/
│ │ │ ├── docker-provider-via-wsl.mdx
│ │ │ ├── minikube-vscode-browser.mdx
│ │ │ └── reduce-build-times-with-cache.mdx
│ │ └── what-is-devpod.mdx
│ ├── public/
│ │ └── _redirects
│ ├── sidebars.js
│ ├── src/
│ │ ├── components/
│ │ │ ├── Highlight/
│ │ │ │ ├── Highlight.js
│ │ │ │ └── styles.module.css
│ │ │ └── Step/
│ │ │ ├── Step.js
│ │ │ └── styles.module.css
│ │ ├── css/
│ │ │ └── custom.css
│ │ └── pages/
│ │ ├── index.js
│ │ └── styles.module.css
│ ├── static/
│ │ └── js/
│ │ └── custom.js
│ └── uml/
│ ├── c4_build.puml
│ ├── c4_build_k8s.puml
│ ├── c4_k8s.puml
│ ├── c4_machines.puml
│ ├── c4_workspaces.puml
│ └── up_sequence.puml
├── e2e/
│ ├── README.md
│ ├── devcontainer-feature.json
│ ├── e2e_suite_test.go
│ ├── framework/
│ │ ├── command.go
│ │ ├── exec.go
│ │ ├── framework.go
│ │ ├── helper.go
│ │ ├── server_utils.go
│ │ ├── types.go
│ │ └── util.go
│ └── tests/
│ ├── build/
│ │ ├── build.go
│ │ ├── framework.go
│ │ └── testdata/
│ │ ├── docker/
│ │ │ └── .devcontainer/
│ │ │ ├── Dockerfile
│ │ │ └── devcontainer.json
│ │ ├── docker-compose/
│ │ │ └── .devcontainer/
│ │ │ ├── Dockerfile
│ │ │ ├── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ └── kubernetes/
│ │ └── .devcontainer/
│ │ ├── Dockerfile
│ │ └── devcontainer.json
│ ├── context/
│ │ ├── context.go
│ │ └── framework.go
│ ├── ide/
│ │ ├── framework.go
│ │ ├── ide.go
│ │ └── testdata/
│ │ └── .devcontainer.json
│ ├── integration/
│ │ ├── framework.go
│ │ ├── integration.go
│ │ └── testdata/
│ │ └── .devcontainer.json
│ ├── machine/
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── framework.go
│ │ └── testdata/
│ │ └── mock-provider.yaml
│ ├── machineprovider/
│ │ ├── framework.go
│ │ ├── machineprovider.go
│ │ └── testdata/
│ │ ├── machineprovider/
│ │ │ ├── .devcontainer.json
│ │ │ ├── provider.yaml
│ │ │ └── test.txt
│ │ └── machineprovider2/
│ │ ├── .devcontainer.json
│ │ ├── provider.yaml
│ │ └── test.txt
│ ├── provider/
│ │ ├── framework.go
│ │ ├── provider.go
│ │ └── testdata/
│ │ └── simple-k8s-provider/
│ │ ├── provider1.yaml
│ │ ├── provider2-update.yaml
│ │ ├── provider2.yaml
│ │ └── provider3.yaml
│ ├── ssh/
│ │ ├── framework.go
│ │ ├── ssh.go
│ │ └── testdata/
│ │ ├── forward-test/
│ │ │ └── .devcontainer.json
│ │ ├── gpg-forwarding/
│ │ │ ├── .devcontainer.json
│ │ │ ├── devcontainer.json
│ │ │ ├── gpg-private.key
│ │ │ └── gpg-public.key
│ │ └── local-test/
│ │ └── devcontainer.json
│ └── up/
│ ├── docker-wsl.go
│ ├── docker.go
│ ├── docker_build.go
│ ├── docker_compose.go
│ ├── docker_compose_build.go
│ ├── framework.go
│ ├── helper.go
│ ├── podman.go
│ ├── testdata/
│ │ ├── docker/
│ │ │ └── .devcontainer.json
│ │ ├── docker-compose/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-capadd/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-container-env/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-container-user/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-env-file/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-extensions/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-features/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-forward-ports/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-lifecycle-array/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-lifecycle-object/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-mounts/
│ │ │ ├── .devcontainer.json
│ │ │ ├── docker-compose.yaml
│ │ │ └── mount2/
│ │ │ └── bar.txt
│ │ ├── docker-compose-multiple-services/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-override-command/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-overrides/
│ │ │ ├── .devcontainer/
│ │ │ │ ├── devcontainer.json
│ │ │ │ └── docker-compose.devcontainer.yaml
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-privileged/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-rebuild-fail/
│ │ │ ├── .devcontainer.json
│ │ │ ├── docker-compose.yaml
│ │ │ └── fail.devcontainer.json
│ │ ├── docker-compose-rebuild-success/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-remote-env/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-remote-user/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-run-services/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-securityOpt/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-subfolder/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-variables/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-with-multi-stage-build/
│ │ │ ├── .devcontainer.json
│ │ │ ├── Dockerfile
│ │ │ └── docker-compose.yaml
│ │ ├── docker-dockerfile-buildcontext/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ ├── .dockerignore
│ │ │ ├── Dockerfile
│ │ │ └── scripts/
│ │ │ ├── alias.sh
│ │ │ └── install.sh
│ │ ├── docker-features-http-headers/
│ │ │ ├── .devcontainer.json
│ │ │ ├── devcontainer-feature.json
│ │ │ └── install.sh
│ │ ├── docker-features-lifecycle-hooks/
│ │ │ └── .devcontainer.json
│ │ ├── docker-mounts/
│ │ │ ├── .devcontainer.json
│ │ │ ├── mount1/
│ │ │ │ └── foo.txt
│ │ │ └── mount2/
│ │ │ └── bar.txt
│ │ ├── docker-variables/
│ │ │ └── .devcontainer.json
│ │ ├── docker-with-multi-stage-build/
│ │ │ ├── .devcontainer.json
│ │ │ └── Dockerfile
│ │ ├── kubernetes/
│ │ │ ├── .devcontainer.json
│ │ │ └── test_file.txt
│ │ └── no-devcontainer/
│ │ └── empty.go
│ └── up.go
├── examples/
│ ├── build/
│ │ ├── .devcontainer.json
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── app/
│ │ └── code
│ ├── build-multi-stage/
│ │ ├── .devcontainer.json
│ │ ├── Dockerfile
│ │ └── README.md
│ ├── compose/
│ │ ├── .devcontainer.json
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── devcontainer.Dockerfile
│ │ ├── devcontainer.Dockerfile2
│ │ └── docker-compose.devcontainer.yml
│ ├── feature/
│ │ ├── .devcontainer.json
│ │ └── afeature/
│ │ ├── devcontainer-feature.json
│ │ └── install.sh
│ ├── multi-devcontainer/
│ │ ├── .devcontainer.json
│ │ ├── proj1/
│ │ │ └── .devcontainer.json
│ │ └── proj2/
│ │ └── .devcontainer.json
│ ├── object-lifecycle-hooks/
│ │ └── .devcontainer.json
│ ├── simple/
│ │ ├── .devcontainer.json
│ │ └── README.md
│ ├── simple-k8s-provider/
│ │ ├── README.md
│ │ └── provider.yaml
│ └── ztunnel/
│ ├── README.md
│ ├── devcontainer.json
│ ├── helloworld.yaml
│ ├── launch.json
│ ├── pod_manifest.yaml
│ └── sleep.yaml
├── go.mod
├── go.sum
├── hack/
│ ├── build-e2e.sh
│ ├── build-grpc.sh
│ ├── dev_devpod_pro.sh
│ ├── gen-desktop.sh
│ ├── pro/
│ │ ├── main.go
│ │ └── provider.yaml
│ ├── rebuild.sh
│ └── unit-tests.sh
├── loadtest/
│ ├── README.md
│ ├── deleteWorkspaces.sh
│ ├── emulateTraffic.sh
│ ├── generateLoad.sh
│ ├── init_monitor.sh
│ ├── monitor.sh
│ ├── run.sh
│ └── startWorkspaces.sh
├── main.go
├── netlify.toml
├── pkg/
│ ├── agent/
│ │ ├── agent.go
│ │ ├── inject.go
│ │ ├── tunnel/
│ │ │ ├── tunnel.pb.go
│ │ │ ├── tunnel.proto
│ │ │ └── tunnel_grpc.pb.go
│ │ ├── tunnelserver/
│ │ │ ├── client.go
│ │ │ ├── logger.go
│ │ │ ├── options.go
│ │ │ ├── stream.go
│ │ │ └── tunnelserver.go
│ │ └── workspace.go
│ ├── binaries/
│ │ └── download.go
│ ├── client/
│ │ ├── client.go
│ │ └── clientimplementation/
│ │ ├── daemonclient/
│ │ │ ├── client.go
│ │ │ ├── create.go
│ │ │ ├── delete.go
│ │ │ ├── form.go
│ │ │ ├── status.go
│ │ │ ├── stop.go
│ │ │ ├── up.go
│ │ │ └── update.go
│ │ ├── machine_client.go
│ │ ├── proxy_client.go
│ │ └── workspace_client.go
│ ├── command/
│ │ ├── command.go
│ │ ├── escape.go
│ │ ├── process.go
│ │ ├── process_supported.go
│ │ ├── process_unsupported.go
│ │ └── user.go
│ ├── compose/
│ │ └── helper.go
│ ├── compress/
│ │ └── compress.go
│ ├── config/
│ │ ├── config.go
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── dir.go
│ │ └── ide.go
│ ├── copy/
│ │ ├── copy.go
│ │ ├── copy_supported.go
│ │ └── copy_unsupported.go
│ ├── credentials/
│ │ ├── request.go
│ │ ├── server.go
│ │ └── start.go
│ ├── daemon/
│ │ ├── agent/
│ │ │ ├── daemon.go
│ │ │ ├── reaper_linux.go
│ │ │ └── reaper_stub.go
│ │ └── platform/
│ │ ├── client.go
│ │ ├── daemon.go
│ │ ├── error.go
│ │ ├── error_unix.go
│ │ ├── error_windows.go
│ │ ├── local_server.go
│ │ ├── socket.go
│ │ ├── socket_windows.go
│ │ ├── ts_server.go
│ │ └── workspace_watcher.go
│ ├── devcontainer/
│ │ ├── build/
│ │ │ └── options.go
│ │ ├── build.go
│ │ ├── build_test.go
│ │ ├── buildkit/
│ │ │ ├── buildkit.go
│ │ │ ├── cache.go
│ │ │ ├── conn.go
│ │ │ ├── printer.go
│ │ │ └── remote.go
│ │ ├── compose.go
│ │ ├── config/
│ │ │ ├── build.go
│ │ │ ├── config.go
│ │ │ ├── container_details.go
│ │ │ ├── feature.go
│ │ │ ├── merge.go
│ │ │ ├── metadata.go
│ │ │ ├── parse.go
│ │ │ ├── parse_test.go
│ │ │ ├── prebuild.go
│ │ │ ├── prepareprobe.go
│ │ │ ├── prepareprobe_windows.go
│ │ │ ├── result.go
│ │ │ ├── substitute.go
│ │ │ └── userenvprobe.go
│ │ ├── config.go
│ │ ├── crane/
│ │ │ └── run.go
│ │ ├── delete.go
│ │ ├── feature/
│ │ │ ├── extend.go
│ │ │ ├── features.go
│ │ │ └── options.go
│ │ ├── graph/
│ │ │ ├── graph.go
│ │ │ └── graph_test.go
│ │ ├── helpers.go
│ │ ├── inspect.go
│ │ ├── metadata/
│ │ │ └── metadata.go
│ │ ├── prebuild.go
│ │ ├── run.go
│ │ ├── setup/
│ │ │ ├── lifecyclehooks.go
│ │ │ └── setup.go
│ │ ├── setup.go
│ │ ├── single.go
│ │ └── sshtunnel/
│ │ └── sshtunnel.go
│ ├── docker/
│ │ ├── client.go
│ │ ├── config.go
│ │ └── helper.go
│ ├── dockercredentials/
│ │ └── dockercredentials.go
│ ├── dockerfile/
│ │ ├── parse.go
│ │ ├── parse_test.go
│ │ └── test_Dockerfile
│ ├── download/
│ │ └── download.go
│ ├── driver/
│ │ ├── custom/
│ │ │ └── custom.go
│ │ ├── docker/
│ │ │ ├── build.go
│ │ │ └── docker.go
│ │ ├── docker.go
│ │ ├── drivercreate/
│ │ │ └── create.go
│ │ ├── kubernetes/
│ │ │ ├── client.go
│ │ │ ├── container_status.go
│ │ │ ├── daemonsecret.go
│ │ │ ├── dockersecrets.go
│ │ │ ├── driver.go
│ │ │ ├── find.go
│ │ │ ├── helper.go
│ │ │ ├── init_container.go
│ │ │ ├── pullsecrets.go
│ │ │ ├── pvc.go
│ │ │ ├── registry.go
│ │ │ ├── registry_test.go
│ │ │ ├── run.go
│ │ │ ├── serviceaccount.go
│ │ │ ├── target_architecture.go
│ │ │ ├── throttledlogger/
│ │ │ │ ├── throttled_logger.go
│ │ │ │ ├── timer.go
│ │ │ │ └── timer_test.go
│ │ │ └── wait.go
│ │ └── types.go
│ ├── encoding/
│ │ ├── encoding.go
│ │ └── encoding_test.go
│ ├── envfile/
│ │ └── envfile.go
│ ├── extract/
│ │ ├── compress.go
│ │ ├── extract.go
│ │ └── zip.go
│ ├── file/
│ │ ├── file.go
│ │ ├── file_supported.go
│ │ └── file_unsupported.go
│ ├── git/
│ │ ├── clone.go
│ │ ├── git.go
│ │ ├── git_test.go
│ │ └── install.go
│ ├── gitcredentials/
│ │ └── gitcredentials.go
│ ├── gitsshsigning/
│ │ ├── client.go
│ │ ├── helper.go
│ │ ├── server.go
│ │ └── utils.go
│ ├── gpg/
│ │ └── gpg_forwarding.go
│ ├── http/
│ │ └── http.go
│ ├── id/
│ │ └── id.go
│ ├── ide/
│ │ ├── fleet/
│ │ │ └── fleet.go
│ │ ├── ideparse/
│ │ │ └── parse.go
│ │ ├── jetbrains/
│ │ │ ├── clion.go
│ │ │ ├── dataspell.go
│ │ │ ├── generic.go
│ │ │ ├── goland.go
│ │ │ ├── intellij.go
│ │ │ ├── phpstorm.go
│ │ │ ├── pycharm.go
│ │ │ ├── rider.go
│ │ │ ├── rubymine.go
│ │ │ ├── rustrover.go
│ │ │ └── webstorm.go
│ │ ├── jupyter/
│ │ │ └── jupyter.go
│ │ ├── openvscode/
│ │ │ └── openvscode.go
│ │ ├── rstudio/
│ │ │ └── rstudio.go
│ │ ├── types.go
│ │ ├── vscode/
│ │ │ ├── apk.go
│ │ │ ├── open.go
│ │ │ └── vscode.go
│ │ └── zed/
│ │ ├── zed.go
│ │ └── zed_linux.go
│ ├── image/
│ │ ├── auth.go
│ │ └── image.go
│ ├── inject/
│ │ ├── delayed_writer.go
│ │ ├── download_urls.go
│ │ ├── inject.go
│ │ ├── inject.sh
│ │ └── script.go
│ ├── language/
│ │ └── language.go
│ ├── loftconfig/
│ │ ├── client.go
│ │ ├── config.go
│ │ └── server.go
│ ├── log/
│ │ ├── jsonstream.go
│ │ └── log.go
│ ├── netstat/
│ │ ├── netstat.go
│ │ ├── netstat_util.go
│ │ └── watcher.go
│ ├── open/
│ │ └── open.go
│ ├── options/
│ │ ├── resolve.go
│ │ ├── resolve_test.go
│ │ └── resolver/
│ │ ├── parse.go
│ │ ├── resolve.go
│ │ ├── resolver.go
│ │ ├── sub_options.go
│ │ └── util.go
│ ├── platform/
│ │ ├── annotations/
│ │ │ └── annotations.go
│ │ ├── client/
│ │ │ ├── client.go
│ │ │ └── config.go
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── deploy.go
│ │ ├── env.go
│ │ ├── form/
│ │ │ └── form.go
│ │ ├── instance.go
│ │ ├── kube/
│ │ │ └── kube.go
│ │ ├── kubeconfig.go
│ │ ├── labels/
│ │ │ └── labels.go
│ │ ├── option.go
│ │ ├── owner.go
│ │ ├── parameters/
│ │ │ └── parameters.go
│ │ ├── platform.go
│ │ ├── project/
│ │ │ └── project.go
│ │ ├── remotecommand/
│ │ │ ├── client.go
│ │ │ ├── protocol.go
│ │ │ ├── remotecommand.go
│ │ │ ├── stream.go
│ │ │ └── websocket.go
│ │ ├── user.go
│ │ └── version.go
│ ├── port/
│ │ ├── parse.go
│ │ └── port.go
│ ├── provider/
│ │ ├── dir.go
│ │ ├── env.go
│ │ ├── export.go
│ │ ├── machine.go
│ │ ├── parse.go
│ │ ├── pro.go
│ │ ├── provider.go
│ │ └── workspace.go
│ ├── random/
│ │ └── random.go
│ ├── shell/
│ │ └── shell.go
│ ├── single/
│ │ └── single.go
│ ├── ssh/
│ │ ├── agent/
│ │ │ ├── agent_unix.go
│ │ │ └── agent_windows.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── connection_counter.go
│ │ ├── forward.go
│ │ ├── helper.go
│ │ ├── keys.go
│ │ ├── server/
│ │ │ ├── agent.go
│ │ │ ├── exec.go
│ │ │ ├── exit.go
│ │ │ ├── port/
│ │ │ │ └── port.go
│ │ │ ├── pty_supported.go
│ │ │ ├── pty_unsupported.go
│ │ │ ├── sftp_handler.go
│ │ │ ├── ssh.go
│ │ │ ├── ssh_container.go
│ │ │ └── workdir.go
│ │ ├── ssh_add.go
│ │ ├── ssh_supported.go
│ │ └── ssh_unsupported.go
│ ├── stdio/
│ │ ├── conn.go
│ │ └── listener.go
│ ├── telemetry/
│ │ ├── collect.go
│ │ ├── helpers.go
│ │ └── noop.go
│ ├── template/
│ │ └── fill.go
│ ├── token/
│ │ └── token.go
│ ├── ts/
│ │ ├── addr.go
│ │ ├── derp.go
│ │ ├── ssh.go
│ │ ├── util.go
│ │ └── workspace_server.go
│ ├── tunnel/
│ │ ├── container.go
│ │ ├── direct.go
│ │ ├── forwarder.go
│ │ └── services.go
│ ├── types/
│ │ ├── option.go
│ │ ├── streams.go
│ │ ├── time.go
│ │ ├── types.go
│ │ └── types_test.go
│ ├── upgrade/
│ │ └── upgrade.go
│ ├── util/
│ │ ├── hash/
│ │ │ └── hash.go
│ │ ├── homedir.go
│ │ ├── homedir_test.go
│ │ └── rand.go
│ ├── version/
│ │ └── version.go
│ └── workspace/
│ ├── delete.go
│ ├── id.go
│ ├── id_test.go
│ ├── image.go
│ ├── list.go
│ ├── machine.go
│ ├── pro.go
│ ├── provider.go
│ └── workspace.go
├── providers/
│ ├── docker/
│ │ └── provider.yaml
│ ├── kubernetes/
│ │ └── provider.yaml
│ ├── pro/
│ │ └── provider.yaml
│ └── providers.go
├── scripts/
│ ├── install_docker.sh
│ └── scripts.go
└── vendor/
├── cel.dev/
│ └── expr/
│ ├── .bazelversion
│ ├── .gitattributes
│ ├── .gitignore
│ ├── BUILD.bazel
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── GOVERNANCE.md
│ ├── LICENSE
│ ├── MAINTAINERS.md
│ ├── MODULE.bazel
│ ├── README.md
│ ├── WORKSPACE
│ ├── WORKSPACE.bzlmod
│ ├── checked.pb.go
│ ├── cloudbuild.yaml
│ ├── eval.pb.go
│ ├── explain.pb.go
│ ├── regen_go_proto.sh
│ ├── regen_go_proto_canonical_protos.sh
│ ├── syntax.pb.go
│ └── value.pb.go
├── cloud.google.com/
│ └── go/
│ └── compute/
│ └── metadata/
│ ├── CHANGES.md
│ ├── LICENSE
│ ├── README.md
│ ├── metadata.go
│ ├── retry.go
│ ├── retry_linux.go
│ ├── syscheck.go
│ ├── syscheck_linux.go
│ └── syscheck_windows.go
├── filippo.io/
│ └── edwards25519/
│ ├── LICENSE
│ ├── README.md
│ ├── doc.go
│ ├── edwards25519.go
│ ├── extra.go
│ ├── field/
│ │ ├── fe.go
│ │ ├── fe_amd64.go
│ │ ├── fe_amd64.s
│ │ ├── fe_amd64_noasm.go
│ │ ├── fe_arm64.go
│ │ ├── fe_arm64.s
│ │ ├── fe_arm64_noasm.go
│ │ ├── fe_extra.go
│ │ └── fe_generic.go
│ ├── scalar.go
│ ├── scalar_fiat.go
│ ├── scalarmult.go
│ └── tables.go
├── github.com/
│ ├── AdaLogics/
│ │ └── go-fuzz-headers/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── consumer.go
│ │ ├── funcs.go
│ │ └── sql.go
│ ├── AlecAivazis/
│ │ └── survey/
│ │ └── v2/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── confirm.go
│ │ ├── core/
│ │ │ ├── template.go
│ │ │ └── write.go
│ │ ├── editor.go
│ │ ├── filter.go
│ │ ├── input.go
│ │ ├── multiline.go
│ │ ├── multiselect.go
│ │ ├── password.go
│ │ ├── renderer.go
│ │ ├── select.go
│ │ ├── survey.go
│ │ ├── terminal/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ ├── buffered_reader.go
│ │ │ ├── cursor.go
│ │ │ ├── cursor_windows.go
│ │ │ ├── display.go
│ │ │ ├── display_posix.go
│ │ │ ├── display_windows.go
│ │ │ ├── error.go
│ │ │ ├── output.go
│ │ │ ├── output_windows.go
│ │ │ ├── runereader.go
│ │ │ ├── runereader_bsd.go
│ │ │ ├── runereader_linux.go
│ │ │ ├── runereader_posix.go
│ │ │ ├── runereader_ppc64le.go
│ │ │ ├── runereader_windows.go
│ │ │ ├── sequences.go
│ │ │ ├── stdio.go
│ │ │ ├── syscall_windows.go
│ │ │ └── terminal.go
│ │ ├── transform.go
│ │ └── validate.go
│ ├── Azure/
│ │ ├── azure-sdk-for-go/
│ │ │ ├── LICENSE.txt
│ │ │ ├── NOTICE.txt
│ │ │ ├── services/
│ │ │ │ └── preview/
│ │ │ │ └── containerregistry/
│ │ │ │ └── runtime/
│ │ │ │ └── 2019-08-15-preview/
│ │ │ │ └── containerregistry/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── accesstokens.go
│ │ │ │ ├── blob.go
│ │ │ │ ├── client.go
│ │ │ │ ├── dataplane_meta.json
│ │ │ │ ├── manifests.go
│ │ │ │ ├── models.go
│ │ │ │ ├── refreshtokens.go
│ │ │ │ ├── repository.go
│ │ │ │ ├── tag.go
│ │ │ │ ├── v2support.go
│ │ │ │ └── version.go
│ │ │ └── version/
│ │ │ └── version.go
│ │ └── go-ansiterm/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── constants.go
│ │ ├── context.go
│ │ ├── csi_entry_state.go
│ │ ├── csi_param_state.go
│ │ ├── escape_intermediate_state.go
│ │ ├── escape_state.go
│ │ ├── event_handler.go
│ │ ├── ground_state.go
│ │ ├── osc_string_state.go
│ │ ├── parser.go
│ │ ├── parser_action_helpers.go
│ │ ├── parser_actions.go
│ │ ├── states.go
│ │ ├── utilities.go
│ │ └── winterm/
│ │ ├── ansi.go
│ │ ├── api.go
│ │ ├── attr_translation.go
│ │ ├── cursor_helpers.go
│ │ ├── erase_helpers.go
│ │ ├── scroll_helper.go
│ │ ├── utilities.go
│ │ └── win_event_handler.go
│ ├── BurntSushi/
│ │ └── toml/
│ │ ├── .gitignore
│ │ ├── COPYING
│ │ ├── README.md
│ │ ├── decode.go
│ │ ├── deprecated.go
│ │ ├── doc.go
│ │ ├── encode.go
│ │ ├── error.go
│ │ ├── internal/
│ │ │ └── tz.go
│ │ ├── lex.go
│ │ ├── meta.go
│ │ ├── parse.go
│ │ ├── type_fields.go
│ │ └── type_toml.go
│ ├── Microsoft/
│ │ └── go-winio/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODEOWNERS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── backup.go
│ │ ├── doc.go
│ │ ├── ea.go
│ │ ├── file.go
│ │ ├── fileinfo.go
│ │ ├── hvsock.go
│ │ ├── internal/
│ │ │ ├── fs/
│ │ │ │ ├── doc.go
│ │ │ │ ├── fs.go
│ │ │ │ ├── security.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ ├── socket/
│ │ │ │ ├── rawaddr.go
│ │ │ │ ├── socket.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ └── stringbuffer/
│ │ │ └── wstring.go
│ │ ├── pipe.go
│ │ ├── pkg/
│ │ │ └── guid/
│ │ │ ├── guid.go
│ │ │ ├── guid_nonwindows.go
│ │ │ ├── guid_windows.go
│ │ │ └── variant_string.go
│ │ ├── privilege.go
│ │ ├── reparse.go
│ │ ├── sd.go
│ │ ├── syscall.go
│ │ └── zsyscall_windows.go
│ ├── NYTimes/
│ │ └── gziphandler/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── gzip.go
│ │ └── gzip_go18.go
│ ├── PaesslerAG/
│ │ ├── gval/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── evaluable.go
│ │ │ ├── functions.go
│ │ │ ├── gval.go
│ │ │ ├── language.go
│ │ │ ├── operator.go
│ │ │ ├── parse.go
│ │ │ └── parser.go
│ │ └── jsonpath/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jsonpath.go
│ │ ├── parse.go
│ │ ├── path.go
│ │ ├── placeholder.go
│ │ ├── selector.go
│ │ └── test.sh
│ ├── acarl005/
│ │ └── stripansi/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── stripansi.go
│ ├── akutz/
│ │ └── memconn/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── VERSION
│ │ ├── memconn.go
│ │ ├── memconn_addr.go
│ │ ├── memconn_conn.go
│ │ ├── memconn_listener.go
│ │ ├── memconn_pipe.go
│ │ └── memconn_provider.go
│ ├── alessio/
│ │ └── shellescape/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── .goreleaser.yml
│ │ ├── AUTHORS
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── shellescape.go
│ ├── alexbrainman/
│ │ └── sspi/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── buffer.go
│ │ ├── internal/
│ │ │ └── common/
│ │ │ └── common.go
│ │ ├── mksyscall.go
│ │ ├── negotiate/
│ │ │ └── negotiate.go
│ │ ├── sspi.go
│ │ ├── syscall.go
│ │ └── zsyscall_windows.go
│ ├── anmitsu/
│ │ └── go-shlex/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── shlex.go
│ ├── antlr4-go/
│ │ └── antlr/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── antlrdoc.go
│ │ ├── atn.go
│ │ ├── atn_config.go
│ │ ├── atn_config_set.go
│ │ ├── atn_deserialization_options.go
│ │ ├── atn_deserializer.go
│ │ ├── atn_simulator.go
│ │ ├── atn_state.go
│ │ ├── atn_type.go
│ │ ├── char_stream.go
│ │ ├── common_token_factory.go
│ │ ├── common_token_stream.go
│ │ ├── comparators.go
│ │ ├── configuration.go
│ │ ├── dfa.go
│ │ ├── dfa_serializer.go
│ │ ├── dfa_state.go
│ │ ├── diagnostic_error_listener.go
│ │ ├── error_listener.go
│ │ ├── error_strategy.go
│ │ ├── errors.go
│ │ ├── file_stream.go
│ │ ├── input_stream.go
│ │ ├── int_stream.go
│ │ ├── interval_set.go
│ │ ├── jcollect.go
│ │ ├── lexer.go
│ │ ├── lexer_action.go
│ │ ├── lexer_action_executor.go
│ │ ├── lexer_atn_simulator.go
│ │ ├── ll1_analyzer.go
│ │ ├── mutex.go
│ │ ├── mutex_nomutex.go
│ │ ├── nostatistics.go
│ │ ├── parser.go
│ │ ├── parser_atn_simulator.go
│ │ ├── parser_rule_context.go
│ │ ├── prediction_context.go
│ │ ├── prediction_context_cache.go
│ │ ├── prediction_mode.go
│ │ ├── recognizer.go
│ │ ├── rule_context.go
│ │ ├── semantic_context.go
│ │ ├── statistics.go
│ │ ├── stats_data.go
│ │ ├── token.go
│ │ ├── token_source.go
│ │ ├── token_stream.go
│ │ ├── tokenstream_rewriter.go
│ │ ├── trace_listener.go
│ │ ├── transition.go
│ │ ├── tree.go
│ │ ├── trees.go
│ │ └── utils.go
│ ├── asaskevich/
│ │ └── govalidator/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── arrays.go
│ │ ├── converter.go
│ │ ├── doc.go
│ │ ├── error.go
│ │ ├── numerics.go
│ │ ├── patterns.go
│ │ ├── types.go
│ │ ├── utils.go
│ │ ├── validator.go
│ │ └── wercker.yml
│ ├── atotto/
│ │ └── clipboard/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── clipboard.go
│ │ ├── clipboard_darwin.go
│ │ ├── clipboard_plan9.go
│ │ ├── clipboard_unix.go
│ │ └── clipboard_windows.go
│ ├── aws/
│ │ ├── aws-sdk-go-v2/
│ │ │ ├── LICENSE.txt
│ │ │ ├── NOTICE.txt
│ │ │ ├── aws/
│ │ │ │ ├── accountid_endpoint_mode.go
│ │ │ │ ├── arn/
│ │ │ │ │ └── arn.go
│ │ │ │ ├── config.go
│ │ │ │ ├── context.go
│ │ │ │ ├── credential_cache.go
│ │ │ │ ├── credentials.go
│ │ │ │ ├── defaults/
│ │ │ │ │ ├── auto.go
│ │ │ │ │ ├── configuration.go
│ │ │ │ │ ├── defaults.go
│ │ │ │ │ └── doc.go
│ │ │ │ ├── defaultsmode.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── from_ptr.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── logging.go
│ │ │ │ ├── logging_generate.go
│ │ │ │ ├── middleware/
│ │ │ │ │ ├── metadata.go
│ │ │ │ │ ├── middleware.go
│ │ │ │ │ ├── osname.go
│ │ │ │ │ ├── osname_go115.go
│ │ │ │ │ ├── private/
│ │ │ │ │ │ └── metrics/
│ │ │ │ │ │ └── metrics.go
│ │ │ │ │ ├── recursion_detection.go
│ │ │ │ │ ├── request_id.go
│ │ │ │ │ ├── request_id_retriever.go
│ │ │ │ │ └── user_agent.go
│ │ │ │ ├── protocol/
│ │ │ │ │ ├── query/
│ │ │ │ │ │ ├── array.go
│ │ │ │ │ │ ├── encoder.go
│ │ │ │ │ │ ├── map.go
│ │ │ │ │ │ ├── middleware.go
│ │ │ │ │ │ ├── object.go
│ │ │ │ │ │ └── value.go
│ │ │ │ │ ├── restjson/
│ │ │ │ │ │ └── decoder_util.go
│ │ │ │ │ └── xml/
│ │ │ │ │ └── error_utils.go
│ │ │ │ ├── ratelimit/
│ │ │ │ │ ├── none.go
│ │ │ │ │ ├── token_bucket.go
│ │ │ │ │ └── token_rate_limit.go
│ │ │ │ ├── request.go
│ │ │ │ ├── retry/
│ │ │ │ │ ├── adaptive.go
│ │ │ │ │ ├── adaptive_ratelimit.go
│ │ │ │ │ ├── adaptive_token_bucket.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── jitter_backoff.go
│ │ │ │ │ ├── metadata.go
│ │ │ │ │ ├── middleware.go
│ │ │ │ │ ├── retry.go
│ │ │ │ │ ├── retryable_error.go
│ │ │ │ │ ├── standard.go
│ │ │ │ │ ├── throttle_error.go
│ │ │ │ │ └── timeout_error.go
│ │ │ │ ├── retryer.go
│ │ │ │ ├── runtime.go
│ │ │ │ ├── signer/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ └── v4/
│ │ │ │ │ │ ├── cache.go
│ │ │ │ │ │ ├── const.go
│ │ │ │ │ │ ├── header_rules.go
│ │ │ │ │ │ ├── headers.go
│ │ │ │ │ │ ├── hmac.go
│ │ │ │ │ │ ├── host.go
│ │ │ │ │ │ ├── scope.go
│ │ │ │ │ │ ├── time.go
│ │ │ │ │ │ └── util.go
│ │ │ │ │ └── v4/
│ │ │ │ │ ├── middleware.go
│ │ │ │ │ ├── presign_middleware.go
│ │ │ │ │ ├── stream.go
│ │ │ │ │ └── v4.go
│ │ │ │ ├── to_ptr.go
│ │ │ │ ├── transport/
│ │ │ │ │ └── http/
│ │ │ │ │ ├── client.go
│ │ │ │ │ ├── content_type.go
│ │ │ │ │ ├── response_error.go
│ │ │ │ │ ├── response_error_middleware.go
│ │ │ │ │ └── timeout_read_closer.go
│ │ │ │ ├── types.go
│ │ │ │ └── version.go
│ │ │ ├── config/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── config.go
│ │ │ │ ├── defaultsmode.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── env_config.go
│ │ │ │ ├── generate.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── load_options.go
│ │ │ │ ├── local.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── resolve.go
│ │ │ │ ├── resolve_bearer_token.go
│ │ │ │ ├── resolve_credentials.go
│ │ │ │ └── shared_config.go
│ │ │ ├── credentials/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── doc.go
│ │ │ │ ├── ec2rolecreds/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ └── provider.go
│ │ │ │ ├── endpointcreds/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ └── client/
│ │ │ │ │ │ ├── auth.go
│ │ │ │ │ │ ├── client.go
│ │ │ │ │ │ ├── endpoints.go
│ │ │ │ │ │ └── middleware.go
│ │ │ │ │ └── provider.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── processcreds/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ └── provider.go
│ │ │ │ ├── ssocreds/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── sso_cached_token.go
│ │ │ │ │ ├── sso_credentials_provider.go
│ │ │ │ │ └── sso_token_provider.go
│ │ │ │ ├── static_provider.go
│ │ │ │ └── stscreds/
│ │ │ │ ├── assume_role_provider.go
│ │ │ │ └── web_identity_provider.go
│ │ │ ├── feature/
│ │ │ │ └── ec2/
│ │ │ │ └── imds/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_GetDynamicData.go
│ │ │ │ ├── api_op_GetIAMInfo.go
│ │ │ │ ├── api_op_GetInstanceIdentityDocument.go
│ │ │ │ ├── api_op_GetMetadata.go
│ │ │ │ ├── api_op_GetRegion.go
│ │ │ │ ├── api_op_GetToken.go
│ │ │ │ ├── api_op_GetUserData.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── config/
│ │ │ │ │ └── resolvers.go
│ │ │ │ ├── request_middleware.go
│ │ │ │ └── token_provider.go
│ │ │ ├── internal/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── auth.go
│ │ │ │ │ ├── scheme.go
│ │ │ │ │ └── smithy/
│ │ │ │ │ ├── bearer_token_adapter.go
│ │ │ │ │ ├── bearer_token_signer_adapter.go
│ │ │ │ │ ├── credentials_adapter.go
│ │ │ │ │ ├── smithy.go
│ │ │ │ │ └── v4signer_adapter.go
│ │ │ │ ├── configsources/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── endpoints.go
│ │ │ │ │ └── go_module_metadata.go
│ │ │ │ ├── context/
│ │ │ │ │ └── context.go
│ │ │ │ ├── endpoints/
│ │ │ │ │ ├── awsrulesfn/
│ │ │ │ │ │ ├── arn.go
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── generate.go
│ │ │ │ │ │ ├── host.go
│ │ │ │ │ │ ├── partition.go
│ │ │ │ │ │ ├── partitions.go
│ │ │ │ │ │ └── partitions.json
│ │ │ │ │ ├── endpoints.go
│ │ │ │ │ └── v2/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── endpoints.go
│ │ │ │ │ └── go_module_metadata.go
│ │ │ │ ├── ini/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── go_module_metadata.go
│ │ │ │ │ ├── ini.go
│ │ │ │ │ ├── parse.go
│ │ │ │ │ ├── sections.go
│ │ │ │ │ ├── strings.go
│ │ │ │ │ ├── token.go
│ │ │ │ │ ├── tokenize.go
│ │ │ │ │ └── value.go
│ │ │ │ ├── middleware/
│ │ │ │ │ └── middleware.go
│ │ │ │ ├── rand/
│ │ │ │ │ └── rand.go
│ │ │ │ ├── sdk/
│ │ │ │ │ ├── interfaces.go
│ │ │ │ │ └── time.go
│ │ │ │ ├── sdkio/
│ │ │ │ │ └── byte.go
│ │ │ │ ├── shareddefaults/
│ │ │ │ │ └── shared_config.go
│ │ │ │ ├── strings/
│ │ │ │ │ └── strings.go
│ │ │ │ ├── sync/
│ │ │ │ │ └── singleflight/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── docs.go
│ │ │ │ │ └── singleflight.go
│ │ │ │ └── timeconv/
│ │ │ │ └── duration.go
│ │ │ └── service/
│ │ │ ├── ecr/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_BatchCheckLayerAvailability.go
│ │ │ │ ├── api_op_BatchDeleteImage.go
│ │ │ │ ├── api_op_BatchGetImage.go
│ │ │ │ ├── api_op_BatchGetRepositoryScanningConfiguration.go
│ │ │ │ ├── api_op_CompleteLayerUpload.go
│ │ │ │ ├── api_op_CreatePullThroughCacheRule.go
│ │ │ │ ├── api_op_CreateRepository.go
│ │ │ │ ├── api_op_DeleteLifecyclePolicy.go
│ │ │ │ ├── api_op_DeletePullThroughCacheRule.go
│ │ │ │ ├── api_op_DeleteRegistryPolicy.go
│ │ │ │ ├── api_op_DeleteRepository.go
│ │ │ │ ├── api_op_DeleteRepositoryPolicy.go
│ │ │ │ ├── api_op_DescribeImageReplicationStatus.go
│ │ │ │ ├── api_op_DescribeImageScanFindings.go
│ │ │ │ ├── api_op_DescribeImages.go
│ │ │ │ ├── api_op_DescribePullThroughCacheRules.go
│ │ │ │ ├── api_op_DescribeRegistry.go
│ │ │ │ ├── api_op_DescribeRepositories.go
│ │ │ │ ├── api_op_GetAuthorizationToken.go
│ │ │ │ ├── api_op_GetDownloadUrlForLayer.go
│ │ │ │ ├── api_op_GetLifecyclePolicy.go
│ │ │ │ ├── api_op_GetLifecyclePolicyPreview.go
│ │ │ │ ├── api_op_GetRegistryPolicy.go
│ │ │ │ ├── api_op_GetRegistryScanningConfiguration.go
│ │ │ │ ├── api_op_GetRepositoryPolicy.go
│ │ │ │ ├── api_op_InitiateLayerUpload.go
│ │ │ │ ├── api_op_ListImages.go
│ │ │ │ ├── api_op_ListTagsForResource.go
│ │ │ │ ├── api_op_PutImage.go
│ │ │ │ ├── api_op_PutImageScanningConfiguration.go
│ │ │ │ ├── api_op_PutImageTagMutability.go
│ │ │ │ ├── api_op_PutLifecyclePolicy.go
│ │ │ │ ├── api_op_PutRegistryPolicy.go
│ │ │ │ ├── api_op_PutRegistryScanningConfiguration.go
│ │ │ │ ├── api_op_PutReplicationConfiguration.go
│ │ │ │ ├── api_op_SetRepositoryPolicy.go
│ │ │ │ ├── api_op_StartImageScan.go
│ │ │ │ ├── api_op_StartLifecyclePolicyPreview.go
│ │ │ │ ├── api_op_TagResource.go
│ │ │ │ ├── api_op_UntagResource.go
│ │ │ │ ├── api_op_UploadLayerPart.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── enums.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── ecrpublic/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_BatchCheckLayerAvailability.go
│ │ │ │ ├── api_op_BatchDeleteImage.go
│ │ │ │ ├── api_op_CompleteLayerUpload.go
│ │ │ │ ├── api_op_CreateRepository.go
│ │ │ │ ├── api_op_DeleteRepository.go
│ │ │ │ ├── api_op_DeleteRepositoryPolicy.go
│ │ │ │ ├── api_op_DescribeImageTags.go
│ │ │ │ ├── api_op_DescribeImages.go
│ │ │ │ ├── api_op_DescribeRegistries.go
│ │ │ │ ├── api_op_DescribeRepositories.go
│ │ │ │ ├── api_op_GetAuthorizationToken.go
│ │ │ │ ├── api_op_GetRegistryCatalogData.go
│ │ │ │ ├── api_op_GetRepositoryCatalogData.go
│ │ │ │ ├── api_op_GetRepositoryPolicy.go
│ │ │ │ ├── api_op_InitiateLayerUpload.go
│ │ │ │ ├── api_op_ListTagsForResource.go
│ │ │ │ ├── api_op_PutImage.go
│ │ │ │ ├── api_op_PutRegistryCatalogData.go
│ │ │ │ ├── api_op_PutRepositoryCatalogData.go
│ │ │ │ ├── api_op_SetRepositoryPolicy.go
│ │ │ │ ├── api_op_TagResource.go
│ │ │ │ ├── api_op_UntagResource.go
│ │ │ │ ├── api_op_UploadLayerPart.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── enums.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── internal/
│ │ │ │ ├── accept-encoding/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── accept_encoding_gzip.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ └── go_module_metadata.go
│ │ │ │ └── presigned-url/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── context.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ └── middleware.go
│ │ │ ├── ssm/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_AddTagsToResource.go
│ │ │ │ ├── api_op_AssociateOpsItemRelatedItem.go
│ │ │ │ ├── api_op_CancelCommand.go
│ │ │ │ ├── api_op_CancelMaintenanceWindowExecution.go
│ │ │ │ ├── api_op_CreateActivation.go
│ │ │ │ ├── api_op_CreateAssociation.go
│ │ │ │ ├── api_op_CreateAssociationBatch.go
│ │ │ │ ├── api_op_CreateDocument.go
│ │ │ │ ├── api_op_CreateMaintenanceWindow.go
│ │ │ │ ├── api_op_CreateOpsItem.go
│ │ │ │ ├── api_op_CreateOpsMetadata.go
│ │ │ │ ├── api_op_CreatePatchBaseline.go
│ │ │ │ ├── api_op_CreateResourceDataSync.go
│ │ │ │ ├── api_op_DeleteActivation.go
│ │ │ │ ├── api_op_DeleteAssociation.go
│ │ │ │ ├── api_op_DeleteDocument.go
│ │ │ │ ├── api_op_DeleteInventory.go
│ │ │ │ ├── api_op_DeleteMaintenanceWindow.go
│ │ │ │ ├── api_op_DeleteOpsItem.go
│ │ │ │ ├── api_op_DeleteOpsMetadata.go
│ │ │ │ ├── api_op_DeleteParameter.go
│ │ │ │ ├── api_op_DeleteParameters.go
│ │ │ │ ├── api_op_DeletePatchBaseline.go
│ │ │ │ ├── api_op_DeleteResourceDataSync.go
│ │ │ │ ├── api_op_DeleteResourcePolicy.go
│ │ │ │ ├── api_op_DeregisterManagedInstance.go
│ │ │ │ ├── api_op_DeregisterPatchBaselineForPatchGroup.go
│ │ │ │ ├── api_op_DeregisterTargetFromMaintenanceWindow.go
│ │ │ │ ├── api_op_DeregisterTaskFromMaintenanceWindow.go
│ │ │ │ ├── api_op_DescribeActivations.go
│ │ │ │ ├── api_op_DescribeAssociation.go
│ │ │ │ ├── api_op_DescribeAssociationExecutionTargets.go
│ │ │ │ ├── api_op_DescribeAssociationExecutions.go
│ │ │ │ ├── api_op_DescribeAutomationExecutions.go
│ │ │ │ ├── api_op_DescribeAutomationStepExecutions.go
│ │ │ │ ├── api_op_DescribeAvailablePatches.go
│ │ │ │ ├── api_op_DescribeDocument.go
│ │ │ │ ├── api_op_DescribeDocumentPermission.go
│ │ │ │ ├── api_op_DescribeEffectiveInstanceAssociations.go
│ │ │ │ ├── api_op_DescribeEffectivePatchesForPatchBaseline.go
│ │ │ │ ├── api_op_DescribeInstanceAssociationsStatus.go
│ │ │ │ ├── api_op_DescribeInstanceInformation.go
│ │ │ │ ├── api_op_DescribeInstancePatchStates.go
│ │ │ │ ├── api_op_DescribeInstancePatchStatesForPatchGroup.go
│ │ │ │ ├── api_op_DescribeInstancePatches.go
│ │ │ │ ├── api_op_DescribeInventoryDeletions.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowExecutionTaskInvocations.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowExecutionTasks.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowExecutions.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowSchedule.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowTargets.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowTasks.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindows.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowsForTarget.go
│ │ │ │ ├── api_op_DescribeOpsItems.go
│ │ │ │ ├── api_op_DescribeParameters.go
│ │ │ │ ├── api_op_DescribePatchBaselines.go
│ │ │ │ ├── api_op_DescribePatchGroupState.go
│ │ │ │ ├── api_op_DescribePatchGroups.go
│ │ │ │ ├── api_op_DescribePatchProperties.go
│ │ │ │ ├── api_op_DescribeSessions.go
│ │ │ │ ├── api_op_DisassociateOpsItemRelatedItem.go
│ │ │ │ ├── api_op_GetAutomationExecution.go
│ │ │ │ ├── api_op_GetCalendarState.go
│ │ │ │ ├── api_op_GetCommandInvocation.go
│ │ │ │ ├── api_op_GetConnectionStatus.go
│ │ │ │ ├── api_op_GetDefaultPatchBaseline.go
│ │ │ │ ├── api_op_GetDeployablePatchSnapshotForInstance.go
│ │ │ │ ├── api_op_GetDocument.go
│ │ │ │ ├── api_op_GetInventory.go
│ │ │ │ ├── api_op_GetInventorySchema.go
│ │ │ │ ├── api_op_GetMaintenanceWindow.go
│ │ │ │ ├── api_op_GetMaintenanceWindowExecution.go
│ │ │ │ ├── api_op_GetMaintenanceWindowExecutionTask.go
│ │ │ │ ├── api_op_GetMaintenanceWindowExecutionTaskInvocation.go
│ │ │ │ ├── api_op_GetMaintenanceWindowTask.go
│ │ │ │ ├── api_op_GetOpsItem.go
│ │ │ │ ├── api_op_GetOpsMetadata.go
│ │ │ │ ├── api_op_GetOpsSummary.go
│ │ │ │ ├── api_op_GetParameter.go
│ │ │ │ ├── api_op_GetParameterHistory.go
│ │ │ │ ├── api_op_GetParameters.go
│ │ │ │ ├── api_op_GetParametersByPath.go
│ │ │ │ ├── api_op_GetPatchBaseline.go
│ │ │ │ ├── api_op_GetPatchBaselineForPatchGroup.go
│ │ │ │ ├── api_op_GetResourcePolicies.go
│ │ │ │ ├── api_op_GetServiceSetting.go
│ │ │ │ ├── api_op_LabelParameterVersion.go
│ │ │ │ ├── api_op_ListAssociationVersions.go
│ │ │ │ ├── api_op_ListAssociations.go
│ │ │ │ ├── api_op_ListCommandInvocations.go
│ │ │ │ ├── api_op_ListCommands.go
│ │ │ │ ├── api_op_ListComplianceItems.go
│ │ │ │ ├── api_op_ListComplianceSummaries.go
│ │ │ │ ├── api_op_ListDocumentMetadataHistory.go
│ │ │ │ ├── api_op_ListDocumentVersions.go
│ │ │ │ ├── api_op_ListDocuments.go
│ │ │ │ ├── api_op_ListInventoryEntries.go
│ │ │ │ ├── api_op_ListOpsItemEvents.go
│ │ │ │ ├── api_op_ListOpsItemRelatedItems.go
│ │ │ │ ├── api_op_ListOpsMetadata.go
│ │ │ │ ├── api_op_ListResourceComplianceSummaries.go
│ │ │ │ ├── api_op_ListResourceDataSync.go
│ │ │ │ ├── api_op_ListTagsForResource.go
│ │ │ │ ├── api_op_ModifyDocumentPermission.go
│ │ │ │ ├── api_op_PutComplianceItems.go
│ │ │ │ ├── api_op_PutInventory.go
│ │ │ │ ├── api_op_PutParameter.go
│ │ │ │ ├── api_op_PutResourcePolicy.go
│ │ │ │ ├── api_op_RegisterDefaultPatchBaseline.go
│ │ │ │ ├── api_op_RegisterPatchBaselineForPatchGroup.go
│ │ │ │ ├── api_op_RegisterTargetWithMaintenanceWindow.go
│ │ │ │ ├── api_op_RegisterTaskWithMaintenanceWindow.go
│ │ │ │ ├── api_op_RemoveTagsFromResource.go
│ │ │ │ ├── api_op_ResetServiceSetting.go
│ │ │ │ ├── api_op_ResumeSession.go
│ │ │ │ ├── api_op_SendAutomationSignal.go
│ │ │ │ ├── api_op_SendCommand.go
│ │ │ │ ├── api_op_StartAssociationsOnce.go
│ │ │ │ ├── api_op_StartAutomationExecution.go
│ │ │ │ ├── api_op_StartChangeRequestExecution.go
│ │ │ │ ├── api_op_StartSession.go
│ │ │ │ ├── api_op_StopAutomationExecution.go
│ │ │ │ ├── api_op_TerminateSession.go
│ │ │ │ ├── api_op_UnlabelParameterVersion.go
│ │ │ │ ├── api_op_UpdateAssociation.go
│ │ │ │ ├── api_op_UpdateAssociationStatus.go
│ │ │ │ ├── api_op_UpdateDocument.go
│ │ │ │ ├── api_op_UpdateDocumentDefaultVersion.go
│ │ │ │ ├── api_op_UpdateDocumentMetadata.go
│ │ │ │ ├── api_op_UpdateMaintenanceWindow.go
│ │ │ │ ├── api_op_UpdateMaintenanceWindowTarget.go
│ │ │ │ ├── api_op_UpdateMaintenanceWindowTask.go
│ │ │ │ ├── api_op_UpdateManagedInstanceRole.go
│ │ │ │ ├── api_op_UpdateOpsItem.go
│ │ │ │ ├── api_op_UpdateOpsMetadata.go
│ │ │ │ ├── api_op_UpdatePatchBaseline.go
│ │ │ │ ├── api_op_UpdateResourceDataSync.go
│ │ │ │ ├── api_op_UpdateServiceSetting.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── options.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── enums.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── sso/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_GetRoleCredentials.go
│ │ │ │ ├── api_op_ListAccountRoles.go
│ │ │ │ ├── api_op_ListAccounts.go
│ │ │ │ ├── api_op_Logout.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── options.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── ssooidc/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_CreateToken.go
│ │ │ │ ├── api_op_CreateTokenWithIAM.go
│ │ │ │ ├── api_op_RegisterClient.go
│ │ │ │ ├── api_op_StartDeviceAuthorization.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── options.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ └── sts/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── LICENSE.txt
│ │ │ ├── api_client.go
│ │ │ ├── api_op_AssumeRole.go
│ │ │ ├── api_op_AssumeRoleWithSAML.go
│ │ │ ├── api_op_AssumeRoleWithWebIdentity.go
│ │ │ ├── api_op_DecodeAuthorizationMessage.go
│ │ │ ├── api_op_GetAccessKeyInfo.go
│ │ │ ├── api_op_GetCallerIdentity.go
│ │ │ ├── api_op_GetFederationToken.go
│ │ │ ├── api_op_GetSessionToken.go
│ │ │ ├── auth.go
│ │ │ ├── deserializers.go
│ │ │ ├── doc.go
│ │ │ ├── endpoints.go
│ │ │ ├── generated.json
│ │ │ ├── go_module_metadata.go
│ │ │ ├── internal/
│ │ │ │ └── endpoints/
│ │ │ │ └── endpoints.go
│ │ │ ├── options.go
│ │ │ ├── serializers.go
│ │ │ ├── types/
│ │ │ │ ├── errors.go
│ │ │ │ └── types.go
│ │ │ └── validators.go
│ │ └── smithy-go/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── NOTICE
│ │ ├── README.md
│ │ ├── auth/
│ │ │ ├── auth.go
│ │ │ ├── bearer/
│ │ │ │ ├── docs.go
│ │ │ │ ├── middleware.go
│ │ │ │ ├── token.go
│ │ │ │ └── token_cache.go
│ │ │ ├── identity.go
│ │ │ ├── option.go
│ │ │ └── scheme_id.go
│ │ ├── context/
│ │ │ └── suppress_expired.go
│ │ ├── doc.go
│ │ ├── document/
│ │ │ ├── doc.go
│ │ │ ├── document.go
│ │ │ └── errors.go
│ │ ├── document.go
│ │ ├── encoding/
│ │ │ ├── doc.go
│ │ │ ├── encoding.go
│ │ │ ├── httpbinding/
│ │ │ │ ├── encode.go
│ │ │ │ ├── header.go
│ │ │ │ ├── path_replace.go
│ │ │ │ ├── query.go
│ │ │ │ └── uri.go
│ │ │ ├── json/
│ │ │ │ ├── array.go
│ │ │ │ ├── constants.go
│ │ │ │ ├── decoder_util.go
│ │ │ │ ├── encoder.go
│ │ │ │ ├── escape.go
│ │ │ │ ├── object.go
│ │ │ │ └── value.go
│ │ │ └── xml/
│ │ │ ├── array.go
│ │ │ ├── constants.go
│ │ │ ├── doc.go
│ │ │ ├── element.go
│ │ │ ├── encoder.go
│ │ │ ├── error_utils.go
│ │ │ ├── escape.go
│ │ │ ├── map.go
│ │ │ ├── value.go
│ │ │ └── xml_decoder.go
│ │ ├── endpoints/
│ │ │ └── endpoint.go
│ │ ├── errors.go
│ │ ├── go_module_metadata.go
│ │ ├── internal/
│ │ │ └── sync/
│ │ │ └── singleflight/
│ │ │ ├── LICENSE
│ │ │ ├── docs.go
│ │ │ └── singleflight.go
│ │ ├── io/
│ │ │ ├── byte.go
│ │ │ ├── doc.go
│ │ │ ├── reader.go
│ │ │ └── ringbuffer.go
│ │ ├── local-mod-replace.sh
│ │ ├── logging/
│ │ │ └── logger.go
│ │ ├── middleware/
│ │ │ ├── doc.go
│ │ │ ├── logging.go
│ │ │ ├── metadata.go
│ │ │ ├── middleware.go
│ │ │ ├── ordered_group.go
│ │ │ ├── stack.go
│ │ │ ├── stack_values.go
│ │ │ ├── step_build.go
│ │ │ ├── step_deserialize.go
│ │ │ ├── step_finalize.go
│ │ │ ├── step_initialize.go
│ │ │ └── step_serialize.go
│ │ ├── modman.toml
│ │ ├── private/
│ │ │ └── requestcompression/
│ │ │ ├── gzip.go
│ │ │ ├── middleware_capture_request_compression.go
│ │ │ └── request_compression.go
│ │ ├── properties.go
│ │ ├── ptr/
│ │ │ ├── doc.go
│ │ │ ├── from_ptr.go
│ │ │ ├── gen_scalars.go
│ │ │ └── to_ptr.go
│ │ ├── rand/
│ │ │ ├── doc.go
│ │ │ ├── rand.go
│ │ │ └── uuid.go
│ │ ├── time/
│ │ │ └── time.go
│ │ ├── transport/
│ │ │ └── http/
│ │ │ ├── auth.go
│ │ │ ├── auth_schemes.go
│ │ │ ├── checksum_middleware.go
│ │ │ ├── client.go
│ │ │ ├── doc.go
│ │ │ ├── headerlist.go
│ │ │ ├── host.go
│ │ │ ├── internal/
│ │ │ │ └── io/
│ │ │ │ └── safe.go
│ │ │ ├── md5_checksum.go
│ │ │ ├── middleware_close_response_body.go
│ │ │ ├── middleware_content_length.go
│ │ │ ├── middleware_header_comment.go
│ │ │ ├── middleware_headers.go
│ │ │ ├── middleware_http_logging.go
│ │ │ ├── middleware_metadata.go
│ │ │ ├── middleware_min_proto.go
│ │ │ ├── properties.go
│ │ │ ├── request.go
│ │ │ ├── response.go
│ │ │ ├── time.go
│ │ │ ├── url.go
│ │ │ └── user_agent.go
│ │ ├── validation.go
│ │ └── waiter/
│ │ ├── logger.go
│ │ └── waiter.go
│ ├── awslabs/
│ │ └── amazon-ecr-credential-helper/
│ │ └── ecr-login/
│ │ ├── LICENSE
│ │ ├── api/
│ │ │ ├── client.go
│ │ │ └── factory.go
│ │ ├── cache/
│ │ │ ├── build.go
│ │ │ ├── credentials.go
│ │ │ ├── file.go
│ │ │ └── null.go
│ │ ├── config/
│ │ │ ├── cache_dir.go
│ │ │ └── log.go
│ │ ├── ecr.go
│ │ └── version/
│ │ └── version.go
│ ├── aymanbagabas/
│ │ └── go-osc52/
│ │ └── v2/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── osc52.go
│ ├── beorn7/
│ │ └── perks/
│ │ ├── LICENSE
│ │ └── quantile/
│ │ ├── exampledata.txt
│ │ └── stream.go
│ ├── bits-and-blooms/
│ │ └── bitset/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── azure-pipelines.yml
│ │ ├── bitset.go
│ │ ├── popcnt.go
│ │ ├── popcnt_19.go
│ │ ├── popcnt_amd64.go
│ │ ├── popcnt_amd64.s
│ │ ├── popcnt_generic.go
│ │ ├── select.go
│ │ ├── trailing_zeros_18.go
│ │ └── trailing_zeros_19.go
│ ├── blang/
│ │ └── semver/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── json.go
│ │ ├── package.json
│ │ ├── range.go
│ │ ├── semver.go
│ │ ├── sort.go
│ │ ├── sql.go
│ │ └── v4/
│ │ ├── LICENSE
│ │ ├── json.go
│ │ ├── range.go
│ │ ├── semver.go
│ │ ├── sort.go
│ │ └── sql.go
│ ├── bmatcuk/
│ │ └── doublestar/
│ │ └── v4/
│ │ ├── .codecov.yml
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── UPGRADING.md
│ │ ├── doublestar.go
│ │ ├── glob.go
│ │ ├── globoptions.go
│ │ ├── globwalk.go
│ │ ├── match.go
│ │ ├── utils.go
│ │ └── validate.go
│ ├── catppuccin/
│ │ └── go/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .goreleaser.yaml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── frappe.go
│ │ ├── latte.go
│ │ ├── macchiato.go
│ │ ├── main.go
│ │ └── mocha.go
│ ├── cenkalti/
│ │ └── backoff/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── backoff.go
│ │ ├── context.go
│ │ ├── exponential.go
│ │ ├── retry.go
│ │ ├── ticker.go
│ │ ├── timer.go
│ │ └── tries.go
│ ├── cespare/
│ │ └── xxhash/
│ │ └── v2/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── testall.sh
│ │ ├── xxhash.go
│ │ ├── xxhash_amd64.s
│ │ ├── xxhash_arm64.s
│ │ ├── xxhash_asm.go
│ │ ├── xxhash_other.go
│ │ ├── xxhash_safe.go
│ │ └── xxhash_unsafe.go
│ ├── charmbracelet/
│ │ ├── bubbles/
│ │ │ ├── LICENSE
│ │ │ ├── cursor/
│ │ │ │ └── cursor.go
│ │ │ ├── filepicker/
│ │ │ │ ├── filepicker.go
│ │ │ │ ├── hidden_unix.go
│ │ │ │ └── hidden_windows.go
│ │ │ ├── help/
│ │ │ │ └── help.go
│ │ │ ├── key/
│ │ │ │ └── key.go
│ │ │ ├── runeutil/
│ │ │ │ └── runeutil.go
│ │ │ ├── spinner/
│ │ │ │ └── spinner.go
│ │ │ ├── textarea/
│ │ │ │ ├── memoization/
│ │ │ │ │ └── memoization.go
│ │ │ │ └── textarea.go
│ │ │ ├── textinput/
│ │ │ │ └── textinput.go
│ │ │ └── viewport/
│ │ │ ├── keymap.go
│ │ │ └── viewport.go
│ │ ├── bubbletea/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .golangci-soft.yml
│ │ │ ├── .golangci.yml
│ │ │ ├── .goreleaser.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── commands.go
│ │ │ ├── exec.go
│ │ │ ├── focus.go
│ │ │ ├── inputreader_other.go
│ │ │ ├── inputreader_windows.go
│ │ │ ├── key.go
│ │ │ ├── key_other.go
│ │ │ ├── key_sequences.go
│ │ │ ├── key_windows.go
│ │ │ ├── logging.go
│ │ │ ├── mouse.go
│ │ │ ├── nil_renderer.go
│ │ │ ├── options.go
│ │ │ ├── renderer.go
│ │ │ ├── screen.go
│ │ │ ├── signals_unix.go
│ │ │ ├── signals_windows.go
│ │ │ ├── standard_renderer.go
│ │ │ ├── tea.go
│ │ │ ├── tea_init.go
│ │ │ ├── tty.go
│ │ │ ├── tty_unix.go
│ │ │ └── tty_windows.go
│ │ ├── huh/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .golangci-soft.yml
│ │ │ ├── .golangci.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── SECURITY.md
│ │ │ ├── accessibility/
│ │ │ │ └── accessibility.go
│ │ │ ├── accessor.go
│ │ │ ├── clamp.go
│ │ │ ├── eval.go
│ │ │ ├── field_confirm.go
│ │ │ ├── field_filepicker.go
│ │ │ ├── field_input.go
│ │ │ ├── field_multiselect.go
│ │ │ ├── field_note.go
│ │ │ ├── field_select.go
│ │ │ ├── field_text.go
│ │ │ ├── form.go
│ │ │ ├── group.go
│ │ │ ├── internal/
│ │ │ │ └── selector/
│ │ │ │ └── selector.go
│ │ │ ├── keymap.go
│ │ │ ├── layout.go
│ │ │ ├── option.go
│ │ │ ├── run.go
│ │ │ ├── theme.go
│ │ │ └── validate.go
│ │ ├── lipgloss/
│ │ │ ├── .gitignore
│ │ │ ├── .golangci-soft.yml
│ │ │ ├── .golangci.yml
│ │ │ ├── .goreleaser.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── align.go
│ │ │ ├── ansi_unix.go
│ │ │ ├── ansi_windows.go
│ │ │ ├── borders.go
│ │ │ ├── color.go
│ │ │ ├── get.go
│ │ │ ├── join.go
│ │ │ ├── position.go
│ │ │ ├── renderer.go
│ │ │ ├── runes.go
│ │ │ ├── set.go
│ │ │ ├── size.go
│ │ │ ├── style.go
│ │ │ ├── unset.go
│ │ │ └── whitespace.go
│ │ └── x/
│ │ ├── ansi/
│ │ │ ├── LICENSE
│ │ │ ├── ansi.go
│ │ │ ├── ascii.go
│ │ │ ├── background.go
│ │ │ ├── c0.go
│ │ │ ├── c1.go
│ │ │ ├── clipboard.go
│ │ │ ├── color.go
│ │ │ ├── csi.go
│ │ │ ├── ctrl.go
│ │ │ ├── cursor.go
│ │ │ ├── dcs.go
│ │ │ ├── doc.go
│ │ │ ├── hyperlink.go
│ │ │ ├── kitty.go
│ │ │ ├── mode.go
│ │ │ ├── osc.go
│ │ │ ├── params.go
│ │ │ ├── parser/
│ │ │ │ ├── const.go
│ │ │ │ ├── seq.go
│ │ │ │ └── transition_table.go
│ │ │ ├── parser.go
│ │ │ ├── parser_decode.go
│ │ │ ├── passthrough.go
│ │ │ ├── screen.go
│ │ │ ├── sequence.go
│ │ │ ├── style.go
│ │ │ ├── termcap.go
│ │ │ ├── title.go
│ │ │ ├── truncate.go
│ │ │ ├── util.go
│ │ │ ├── width.go
│ │ │ ├── wrap.go
│ │ │ └── xterm.go
│ │ ├── exp/
│ │ │ └── strings/
│ │ │ ├── LICENSE
│ │ │ └── join.go
│ │ └── term/
│ │ ├── LICENSE
│ │ ├── term.go
│ │ ├── term_other.go
│ │ ├── term_unix.go
│ │ ├── term_unix_bsd.go
│ │ ├── term_unix_other.go
│ │ ├── term_windows.go
│ │ ├── terminal.go
│ │ └── util.go
│ ├── chrismellard/
│ │ └── docker-credential-acr-env/
│ │ ├── LICENSE
│ │ └── pkg/
│ │ ├── credhelper/
│ │ │ └── helper.go
│ │ ├── registry/
│ │ │ ├── const.go
│ │ │ └── registry.go
│ │ └── token/
│ │ └── token.go
│ ├── coder/
│ │ └── websocket/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── accept.go
│ │ ├── close.go
│ │ ├── compress.go
│ │ ├── conn.go
│ │ ├── dial.go
│ │ ├── doc.go
│ │ ├── frame.go
│ │ ├── internal/
│ │ │ ├── bpool/
│ │ │ │ └── bpool.go
│ │ │ ├── errd/
│ │ │ │ └── wrap.go
│ │ │ ├── util/
│ │ │ │ └── util.go
│ │ │ ├── wsjs/
│ │ │ │ └── wsjs_js.go
│ │ │ └── xsync/
│ │ │ ├── go.go
│ │ │ └── int64.go
│ │ ├── make.sh
│ │ ├── mask.go
│ │ ├── mask_amd64.s
│ │ ├── mask_arm64.s
│ │ ├── mask_asm.go
│ │ ├── mask_go.go
│ │ ├── netconn.go
│ │ ├── netconn_js.go
│ │ ├── netconn_notjs.go
│ │ ├── read.go
│ │ ├── stringer.go
│ │ ├── write.go
│ │ └── ws_js.go
│ ├── compose-spec/
│ │ └── compose-go/
│ │ └── v2/
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ ├── cli/
│ │ │ └── options.go
│ │ ├── consts/
│ │ │ └── consts.go
│ │ ├── dotenv/
│ │ │ ├── LICENSE
│ │ │ ├── env.go
│ │ │ ├── godotenv.go
│ │ │ └── parser.go
│ │ ├── errdefs/
│ │ │ └── errors.go
│ │ ├── format/
│ │ │ └── volume.go
│ │ ├── graph/
│ │ │ ├── cycle.go
│ │ │ ├── graph.go
│ │ │ ├── services.go
│ │ │ └── traversal.go
│ │ ├── interpolation/
│ │ │ └── interpolation.go
│ │ ├── loader/
│ │ │ ├── environment.go
│ │ │ ├── example1.env
│ │ │ ├── example2.env
│ │ │ ├── extends.go
│ │ │ ├── fix.go
│ │ │ ├── full-example.yml
│ │ │ ├── include.go
│ │ │ ├── interpolate.go
│ │ │ ├── loader.go
│ │ │ ├── mapstructure.go
│ │ │ ├── normalize.go
│ │ │ ├── paths.go
│ │ │ ├── reset.go
│ │ │ └── validate.go
│ │ ├── override/
│ │ │ ├── extends.go
│ │ │ ├── merge.go
│ │ │ └── uncity.go
│ │ ├── paths/
│ │ │ ├── context.go
│ │ │ ├── extends.go
│ │ │ ├── home.go
│ │ │ ├── resolve.go
│ │ │ ├── unix.go
│ │ │ └── windows_path.go
│ │ ├── schema/
│ │ │ ├── compose-spec.json
│ │ │ ├── schema.go
│ │ │ └── using-variables.yaml
│ │ ├── template/
│ │ │ ├── template.go
│ │ │ └── variables.go
│ │ ├── transform/
│ │ │ ├── build.go
│ │ │ ├── canonical.go
│ │ │ ├── defaults.go
│ │ │ ├── dependson.go
│ │ │ ├── device.go
│ │ │ ├── envfile.go
│ │ │ ├── extends.go
│ │ │ ├── external.go
│ │ │ ├── include.go
│ │ │ ├── mapping.go
│ │ │ ├── ports.go
│ │ │ ├── secrets.go
│ │ │ ├── services.go
│ │ │ ├── ssh.go
│ │ │ ├── ulimits.go
│ │ │ └── volume.go
│ │ ├── tree/
│ │ │ └── path.go
│ │ ├── types/
│ │ │ ├── bytes.go
│ │ │ ├── command.go
│ │ │ ├── config.go
│ │ │ ├── derived.gen.go
│ │ │ ├── develop.go
│ │ │ ├── device.go
│ │ │ ├── duration.go
│ │ │ ├── envfile.go
│ │ │ ├── healthcheck.go
│ │ │ ├── hostList.go
│ │ │ ├── labels.go
│ │ │ ├── mapping.go
│ │ │ ├── options.go
│ │ │ ├── project.go
│ │ │ ├── services.go
│ │ │ ├── ssh.go
│ │ │ ├── stringOrList.go
│ │ │ └── types.go
│ │ ├── utils/
│ │ │ ├── collectionutils.go
│ │ │ ├── pathutils.go
│ │ │ ├── set.go
│ │ │ └── stringutils.go
│ │ └── validation/
│ │ ├── external.go
│ │ ├── validation.go
│ │ └── volume.go
│ ├── containerd/
│ │ ├── console/
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── console.go
│ │ │ ├── console_linux.go
│ │ │ ├── console_other.go
│ │ │ ├── console_unix.go
│ │ │ ├── console_windows.go
│ │ │ ├── pty_freebsd_cgo.go
│ │ │ ├── pty_freebsd_nocgo.go
│ │ │ ├── pty_unix.go
│ │ │ ├── pty_zos.go
│ │ │ ├── tc_darwin.go
│ │ │ ├── tc_freebsd_cgo.go
│ │ │ ├── tc_freebsd_nocgo.go
│ │ │ ├── tc_linux.go
│ │ │ ├── tc_netbsd.go
│ │ │ ├── tc_openbsd_cgo.go
│ │ │ ├── tc_openbsd_nocgo.go
│ │ │ ├── tc_unix.go
│ │ │ └── tc_zos.go
│ │ ├── containerd/
│ │ │ ├── api/
│ │ │ │ ├── LICENSE
│ │ │ │ └── services/
│ │ │ │ └── content/
│ │ │ │ └── v1/
│ │ │ │ ├── content.pb.go
│ │ │ │ ├── content.proto
│ │ │ │ ├── content_grpc.pb.go
│ │ │ │ ├── content_ttrpc.pb.go
│ │ │ │ └── doc.go
│ │ │ └── v2/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── core/
│ │ │ │ ├── content/
│ │ │ │ │ ├── adaptor.go
│ │ │ │ │ ├── content.go
│ │ │ │ │ ├── helpers.go
│ │ │ │ │ └── proxy/
│ │ │ │ │ ├── content_reader.go
│ │ │ │ │ ├── content_store.go
│ │ │ │ │ └── content_writer.go
│ │ │ │ ├── images/
│ │ │ │ │ ├── annotations.go
│ │ │ │ │ ├── diffid.go
│ │ │ │ │ ├── handlers.go
│ │ │ │ │ ├── image.go
│ │ │ │ │ ├── importexport.go
│ │ │ │ │ ├── labels.go
│ │ │ │ │ └── mediatypes.go
│ │ │ │ ├── leases/
│ │ │ │ │ ├── context.go
│ │ │ │ │ ├── grpc.go
│ │ │ │ │ ├── id.go
│ │ │ │ │ └── lease.go
│ │ │ │ └── remotes/
│ │ │ │ ├── docker/
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ ├── fetch.go
│ │ │ │ │ │ └── parse.go
│ │ │ │ │ ├── authorizer.go
│ │ │ │ │ ├── converter.go
│ │ │ │ │ ├── converter_fuzz.go
│ │ │ │ │ ├── errcode.go
│ │ │ │ │ ├── errdesc.go
│ │ │ │ │ ├── fetcher.go
│ │ │ │ │ ├── fetcher_fuzz.go
│ │ │ │ │ ├── handler.go
│ │ │ │ │ ├── httpreadseeker.go
│ │ │ │ │ ├── pusher.go
│ │ │ │ │ ├── registry.go
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ ├── resolver_unix.go
│ │ │ │ │ ├── resolver_windows.go
│ │ │ │ │ ├── schema1/
│ │ │ │ │ │ └── converter.go
│ │ │ │ │ ├── scope.go
│ │ │ │ │ └── status.go
│ │ │ │ ├── errors/
│ │ │ │ │ └── errors.go
│ │ │ │ ├── handlers.go
│ │ │ │ └── resolver.go
│ │ │ ├── defaults/
│ │ │ │ ├── defaults.go
│ │ │ │ ├── defaults_darwin.go
│ │ │ │ ├── defaults_differ_windows.go
│ │ │ │ ├── defaults_freebsd.go
│ │ │ │ ├── defaults_linux.go
│ │ │ │ ├── defaults_snapshotter_linux.go
│ │ │ │ ├── defaults_snapshotter_unix.go
│ │ │ │ ├── defaults_snapshotter_windows.go
│ │ │ │ ├── defaults_unix.go
│ │ │ │ ├── defaults_windows.go
│ │ │ │ └── doc.go
│ │ │ ├── internal/
│ │ │ │ ├── fsverity/
│ │ │ │ │ ├── fsverity_linux.go
│ │ │ │ │ └── fsverity_other.go
│ │ │ │ └── randutil/
│ │ │ │ └── randutil.go
│ │ │ ├── pkg/
│ │ │ │ ├── archive/
│ │ │ │ │ └── compression/
│ │ │ │ │ ├── compression.go
│ │ │ │ │ └── compression_fuzzer.go
│ │ │ │ ├── deprecation/
│ │ │ │ │ └── deprecation.go
│ │ │ │ ├── filters/
│ │ │ │ │ ├── adaptor.go
│ │ │ │ │ ├── filter.go
│ │ │ │ │ ├── parser.go
│ │ │ │ │ ├── quote.go
│ │ │ │ │ └── scanner.go
│ │ │ │ ├── identifiers/
│ │ │ │ │ └── validate.go
│ │ │ │ ├── kernelversion/
│ │ │ │ │ └── kernel_linux.go
│ │ │ │ ├── labels/
│ │ │ │ │ ├── labels.go
│ │ │ │ │ └── validate.go
│ │ │ │ ├── namespaces/
│ │ │ │ │ ├── context.go
│ │ │ │ │ ├── grpc.go
│ │ │ │ │ ├── store.go
│ │ │ │ │ └── ttrpc.go
│ │ │ │ ├── protobuf/
│ │ │ │ │ ├── compare.go
│ │ │ │ │ ├── timestamp.go
│ │ │ │ │ └── types/
│ │ │ │ │ └── types.go
│ │ │ │ ├── reference/
│ │ │ │ │ └── reference.go
│ │ │ │ └── tracing/
│ │ │ │ ├── helpers.go
│ │ │ │ ├── log.go
│ │ │ │ └── tracing.go
│ │ │ ├── plugins/
│ │ │ │ ├── content/
│ │ │ │ │ └── local/
│ │ │ │ │ ├── content_local_fuzzer.go
│ │ │ │ │ ├── locks.go
│ │ │ │ │ ├── readerat.go
│ │ │ │ │ ├── store.go
│ │ │ │ │ ├── store_bsd.go
│ │ │ │ │ ├── store_openbsd.go
│ │ │ │ │ ├── store_unix.go
│ │ │ │ │ ├── store_windows.go
│ │ │ │ │ ├── test_helper.go
│ │ │ │ │ └── writer.go
│ │ │ │ └── services/
│ │ │ │ └── content/
│ │ │ │ └── contentserver/
│ │ │ │ └── contentserver.go
│ │ │ └── version/
│ │ │ └── version.go
│ │ ├── continuity/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ └── sysx/
│ │ │ ├── README.md
│ │ │ ├── nodata_linux.go
│ │ │ ├── nodata_solaris.go
│ │ │ ├── nodata_unix.go
│ │ │ ├── xattr.go
│ │ │ └── xattr_unsupported.go
│ │ ├── errdefs/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── errors.go
│ │ │ ├── pkg/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── errgrpc/
│ │ │ │ │ └── grpc.go
│ │ │ │ └── internal/
│ │ │ │ ├── cause/
│ │ │ │ │ └── cause.go
│ │ │ │ └── types/
│ │ │ │ └── collapsible.go
│ │ │ └── resolve.go
│ │ ├── log/
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── context.go
│ │ ├── platforms/
│ │ │ ├── .gitattributes
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── compare.go
│ │ │ ├── cpuinfo.go
│ │ │ ├── cpuinfo_linux.go
│ │ │ ├── cpuinfo_other.go
│ │ │ ├── database.go
│ │ │ ├── defaults.go
│ │ │ ├── defaults_darwin.go
│ │ │ ├── defaults_freebsd.go
│ │ │ ├── defaults_unix.go
│ │ │ ├── defaults_windows.go
│ │ │ ├── errors.go
│ │ │ ├── platform_windows_compat.go
│ │ │ └── platforms.go
│ │ ├── stargz-snapshotter/
│ │ │ └── estargz/
│ │ │ ├── LICENSE
│ │ │ ├── build.go
│ │ │ ├── errorutil/
│ │ │ │ └── errors.go
│ │ │ ├── estargz.go
│ │ │ ├── gzip.go
│ │ │ ├── testutil.go
│ │ │ └── types.go
│ │ ├── ttrpc/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── PROTOCOL.md
│ │ │ ├── Protobuild.toml
│ │ │ ├── README.md
│ │ │ ├── channel.go
│ │ │ ├── client.go
│ │ │ ├── codec.go
│ │ │ ├── config.go
│ │ │ ├── doc.go
│ │ │ ├── errors.go
│ │ │ ├── handshake.go
│ │ │ ├── interceptor.go
│ │ │ ├── metadata.go
│ │ │ ├── request.pb.go
│ │ │ ├── request.proto
│ │ │ ├── server.go
│ │ │ ├── services.go
│ │ │ ├── stream.go
│ │ │ ├── stream_server.go
│ │ │ ├── test.proto
│ │ │ └── unixcreds_linux.go
│ │ └── typeurl/
│ │ └── v2/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── doc.go
│ │ ├── types.go
│ │ └── types_gogo.go
│ ├── containers/
│ │ ├── image/
│ │ │ └── v5/
│ │ │ ├── LICENSE
│ │ │ ├── docker/
│ │ │ │ └── reference/
│ │ │ │ ├── README.md
│ │ │ │ ├── helpers.go
│ │ │ │ ├── normalize.go
│ │ │ │ ├── reference.go
│ │ │ │ ├── regexp-additions.go
│ │ │ │ └── regexp.go
│ │ │ ├── internal/
│ │ │ │ ├── multierr/
│ │ │ │ │ └── multierr.go
│ │ │ │ ├── rootless/
│ │ │ │ │ └── rootless.go
│ │ │ │ └── set/
│ │ │ │ └── set.go
│ │ │ ├── pkg/
│ │ │ │ ├── compression/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ └── types.go
│ │ │ │ │ └── types/
│ │ │ │ │ └── types.go
│ │ │ │ ├── docker/
│ │ │ │ │ └── config/
│ │ │ │ │ └── config.go
│ │ │ │ └── sysregistriesv2/
│ │ │ │ ├── paths_common.go
│ │ │ │ ├── paths_freebsd.go
│ │ │ │ ├── shortnames.go
│ │ │ │ └── system_registries_v2.go
│ │ │ └── types/
│ │ │ └── types.go
│ │ └── storage/
│ │ ├── AUTHORS
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ └── pkg/
│ │ ├── fileutils/
│ │ │ ├── exists_freebsd.go
│ │ │ ├── exists_unix.go
│ │ │ ├── exists_windows.go
│ │ │ ├── fileutils.go
│ │ │ ├── fileutils_darwin.go
│ │ │ ├── fileutils_solaris.go
│ │ │ ├── fileutils_unix.go
│ │ │ └── fileutils_windows.go
│ │ ├── homedir/
│ │ │ ├── homedir.go
│ │ │ ├── homedir_unix.go
│ │ │ └── homedir_windows.go
│ │ ├── idtools/
│ │ │ ├── idtools.go
│ │ │ ├── idtools_supported.go
│ │ │ ├── idtools_unix.go
│ │ │ ├── idtools_unsupported.go
│ │ │ ├── idtools_windows.go
│ │ │ ├── parser.go
│ │ │ ├── usergroupadd_linux.go
│ │ │ ├── usergroupadd_unsupported.go
│ │ │ └── utils_unix.go
│ │ ├── ioutils/
│ │ │ ├── buffer.go
│ │ │ ├── bytespipe.go
│ │ │ ├── fswriters.go
│ │ │ ├── fswriters_linux.go
│ │ │ ├── fswriters_other.go
│ │ │ ├── readers.go
│ │ │ ├── temp_unix.go
│ │ │ ├── temp_windows.go
│ │ │ ├── writeflusher.go
│ │ │ └── writers.go
│ │ ├── lockfile/
│ │ │ ├── lastwrite.go
│ │ │ ├── lockfile.go
│ │ │ ├── lockfile_unix.go
│ │ │ └── lockfile_windows.go
│ │ ├── longpath/
│ │ │ └── longpath.go
│ │ ├── mount/
│ │ │ ├── flags.go
│ │ │ ├── flags_freebsd.go
│ │ │ ├── flags_linux.go
│ │ │ ├── flags_unsupported.go
│ │ │ ├── mount.go
│ │ │ ├── mounter_freebsd.go
│ │ │ ├── mounter_linux.go
│ │ │ ├── mounter_unsupported.go
│ │ │ ├── mountinfo.go
│ │ │ ├── mountinfo_linux.go
│ │ │ ├── sharedsubtree_linux.go
│ │ │ ├── unmount_unix.go
│ │ │ └── unmount_unsupported.go
│ │ ├── reexec/
│ │ │ ├── README.md
│ │ │ ├── command_freebsd.go
│ │ │ ├── command_linux.go
│ │ │ ├── command_unix.go
│ │ │ ├── command_unsupported.go
│ │ │ ├── command_windows.go
│ │ │ └── reexec.go
│ │ ├── regexp/
│ │ │ ├── regexp.go
│ │ │ ├── regexp_dontprecompile.go
│ │ │ └── regexp_precompile.go
│ │ ├── system/
│ │ │ ├── chmod.go
│ │ │ ├── chtimes.go
│ │ │ ├── chtimes_unix.go
│ │ │ ├── chtimes_windows.go
│ │ │ ├── errors.go
│ │ │ ├── exitcode.go
│ │ │ ├── init.go
│ │ │ ├── init_windows.go
│ │ │ ├── lchflags_bsd.go
│ │ │ ├── lchown.go
│ │ │ ├── lcow_unix.go
│ │ │ ├── lcow_windows.go
│ │ │ ├── lstat_unix.go
│ │ │ ├── lstat_windows.go
│ │ │ ├── meminfo.go
│ │ │ ├── meminfo_freebsd.go
│ │ │ ├── meminfo_linux.go
│ │ │ ├── meminfo_solaris.go
│ │ │ ├── meminfo_unsupported.go
│ │ │ ├── meminfo_windows.go
│ │ │ ├── mknod.go
│ │ │ ├── mknod_freebsd.go
│ │ │ ├── mknod_windows.go
│ │ │ ├── path.go
│ │ │ ├── path_unix.go
│ │ │ ├── path_windows.go
│ │ │ ├── process_unix.go
│ │ │ ├── rm.go
│ │ │ ├── rm_common.go
│ │ │ ├── rm_freebsd.go
│ │ │ ├── stat_common.go
│ │ │ ├── stat_darwin.go
│ │ │ ├── stat_freebsd.go
│ │ │ ├── stat_linux.go
│ │ │ ├── stat_openbsd.go
│ │ │ ├── stat_solaris.go
│ │ │ ├── stat_unix.go
│ │ │ ├── stat_windows.go
│ │ │ ├── syscall_unix.go
│ │ │ ├── syscall_windows.go
│ │ │ ├── umask.go
│ │ │ ├── umask_windows.go
│ │ │ ├── utimes_freebsd.go
│ │ │ ├── utimes_linux.go
│ │ │ ├── utimes_unsupported.go
│ │ │ ├── xattrs_darwin.go
│ │ │ ├── xattrs_linux.go
│ │ │ └── xattrs_unsupported.go
│ │ └── unshare/
│ │ ├── getenv_linux_cgo.go
│ │ ├── getenv_linux_nocgo.go
│ │ ├── unshare.c
│ │ ├── unshare.go
│ │ ├── unshare_cgo.go
│ │ ├── unshare_darwin.go
│ │ ├── unshare_freebsd.c
│ │ ├── unshare_freebsd.go
│ │ ├── unshare_gccgo.go
│ │ ├── unshare_linux.go
│ │ ├── unshare_unsupported.go
│ │ └── unshare_unsupported_cgo.go
│ ├── coreos/
│ │ ├── go-iptables/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ └── iptables/
│ │ │ ├── iptables.go
│ │ │ └── lock.go
│ │ ├── go-semver/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ └── semver/
│ │ │ ├── semver.go
│ │ │ └── sort.go
│ │ └── go-systemd/
│ │ └── v22/
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ ├── daemon/
│ │ │ ├── sdnotify.go
│ │ │ └── watchdog.go
│ │ └── journal/
│ │ ├── journal.go
│ │ ├── journal_unix.go
│ │ └── journal_windows.go
│ ├── creack/
│ │ └── pty/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── Dockerfile.golang
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── asm_solaris_amd64.s
│ │ ├── doc.go
│ │ ├── ioctl.go
│ │ ├── ioctl_bsd.go
│ │ ├── ioctl_inner.go
│ │ ├── ioctl_legacy.go
│ │ ├── ioctl_solaris.go
│ │ ├── ioctl_unsupported.go
│ │ ├── mktypes.bash
│ │ ├── pty_darwin.go
│ │ ├── pty_dragonfly.go
│ │ ├── pty_freebsd.go
│ │ ├── pty_linux.go
│ │ ├── pty_netbsd.go
│ │ ├── pty_openbsd.go
│ │ ├── pty_solaris.go
│ │ ├── pty_unsupported.go
│ │ ├── run.go
│ │ ├── start.go
│ │ ├── start_windows.go
│ │ ├── test_crosscompile.sh
│ │ ├── winsize.go
│ │ ├── winsize_unix.go
│ │ ├── winsize_unsupported.go
│ │ ├── ztypes_386.go
│ │ ├── ztypes_amd64.go
│ │ ├── ztypes_arm.go
│ │ ├── ztypes_arm64.go
│ │ ├── ztypes_dragonfly_amd64.go
│ │ ├── ztypes_freebsd_386.go
│ │ ├── ztypes_freebsd_amd64.go
│ │ ├── ztypes_freebsd_arm.go
│ │ ├── ztypes_freebsd_arm64.go
│ │ ├── ztypes_freebsd_ppc64.go
│ │ ├── ztypes_freebsd_riscv64.go
│ │ ├── ztypes_loong64.go
│ │ ├── ztypes_mipsx.go
│ │ ├── ztypes_netbsd_32bit_int.go
│ │ ├── ztypes_openbsd_32bit_int.go
│ │ ├── ztypes_ppc.go
│ │ ├── ztypes_ppc64.go
│ │ ├── ztypes_ppc64le.go
│ │ ├── ztypes_riscvx.go
│ │ ├── ztypes_s390x.go
│ │ └── ztypes_sparcx.go
│ ├── davecgh/
│ │ └── go-spew/
│ │ ├── LICENSE
│ │ └── spew/
│ │ ├── bypass.go
│ │ ├── bypasssafe.go
│ │ ├── common.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── dump.go
│ │ ├── format.go
│ │ └── spew.go
│ ├── dblohm7/
│ │ └── wingoes/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── com/
│ │ │ ├── api.go
│ │ │ ├── automation/
│ │ │ │ ├── automation.go
│ │ │ │ ├── mksyscall.go
│ │ │ │ ├── types.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ ├── com.go
│ │ │ ├── globalopts.go
│ │ │ ├── guid.go
│ │ │ ├── interface.go
│ │ │ ├── mksyscall.go
│ │ │ ├── object.go
│ │ │ ├── process.go
│ │ │ ├── stream.go
│ │ │ ├── stream_not386.go
│ │ │ ├── stream_windows_386.go
│ │ │ ├── types.go
│ │ │ ├── unknown.go
│ │ │ └── zsyscall_windows.go
│ │ ├── error.go
│ │ ├── guid.go
│ │ ├── guid_notwindows.go
│ │ ├── guid_windows.go
│ │ ├── hresult.go
│ │ ├── internal/
│ │ │ └── types.go
│ │ ├── osversion.go
│ │ ├── pe/
│ │ │ ├── oh.go
│ │ │ ├── pe.go
│ │ │ ├── pe_386.go
│ │ │ ├── pe_amd64.go
│ │ │ ├── pe_arm64.go
│ │ │ ├── pe_notwindows.go
│ │ │ ├── pe_windows.go
│ │ │ └── version.go
│ │ ├── time.go
│ │ └── util.go
│ ├── denisbrodbeck/
│ │ └── machineid/
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── helper.go
│ │ ├── id.go
│ │ ├── id_bsd.go
│ │ ├── id_darwin.go
│ │ ├── id_linux.go
│ │ ├── id_windows.go
│ │ └── makefile
│ ├── digitalocean/
│ │ └── go-smbios/
│ │ ├── AUTHORS
│ │ ├── LICENSE.md
│ │ └── smbios/
│ │ ├── decoder.go
│ │ ├── doc.go
│ │ ├── entrypoint.go
│ │ ├── fuzz.go
│ │ ├── stream_linux.go
│ │ ├── stream_memory.go
│ │ ├── stream_others.go
│ │ ├── stream_unix.go
│ │ ├── stream_windows.go
│ │ └── structure.go
│ ├── dimchansky/
│ │ └── utfbom/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── utfbom.go
│ ├── distribution/
│ │ └── reference/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE-OF-CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── GOVERNANCE.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── helpers.go
│ │ ├── normalize.go
│ │ ├── reference.go
│ │ ├── regexp.go
│ │ └── sort.go
│ ├── docker/
│ │ ├── cli/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ └── cli/
│ │ │ └── config/
│ │ │ ├── config.go
│ │ │ ├── configfile/
│ │ │ │ ├── file.go
│ │ │ │ ├── file_unix.go
│ │ │ │ └── file_windows.go
│ │ │ ├── credentials/
│ │ │ │ ├── credentials.go
│ │ │ │ ├── default_store.go
│ │ │ │ ├── default_store_darwin.go
│ │ │ │ ├── default_store_linux.go
│ │ │ │ ├── default_store_unsupported.go
│ │ │ │ ├── default_store_windows.go
│ │ │ │ ├── file_store.go
│ │ │ │ └── native_store.go
│ │ │ └── types/
│ │ │ └── authconfig.go
│ │ ├── distribution/
│ │ │ ├── LICENSE
│ │ │ └── registry/
│ │ │ └── client/
│ │ │ └── auth/
│ │ │ └── challenge/
│ │ │ ├── addr.go
│ │ │ └── authchallenge.go
│ │ ├── docker/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── api/
│ │ │ │ ├── README.md
│ │ │ │ ├── common.go
│ │ │ │ ├── swagger-gen.yaml
│ │ │ │ ├── swagger.yaml
│ │ │ │ └── types/
│ │ │ │ ├── blkiodev/
│ │ │ │ │ └── blkio.go
│ │ │ │ ├── checkpoint/
│ │ │ │ │ ├── list.go
│ │ │ │ │ └── options.go
│ │ │ │ ├── client.go
│ │ │ │ ├── container/
│ │ │ │ │ ├── change_type.go
│ │ │ │ │ ├── change_types.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── container_top.go
│ │ │ │ │ ├── container_update.go
│ │ │ │ │ ├── create_request.go
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── exec.go
│ │ │ │ │ ├── filesystem_change.go
│ │ │ │ │ ├── hostconfig.go
│ │ │ │ │ ├── hostconfig_unix.go
│ │ │ │ │ ├── hostconfig_windows.go
│ │ │ │ │ ├── options.go
│ │ │ │ │ ├── stats.go
│ │ │ │ │ ├── wait_exit_error.go
│ │ │ │ │ ├── wait_response.go
│ │ │ │ │ └── waitcondition.go
│ │ │ │ ├── error_response.go
│ │ │ │ ├── error_response_ext.go
│ │ │ │ ├── events/
│ │ │ │ │ └── events.go
│ │ │ │ ├── filters/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── parse.go
│ │ │ │ ├── graph_driver_data.go
│ │ │ │ ├── id_response.go
│ │ │ │ ├── image/
│ │ │ │ │ ├── delete_response.go
│ │ │ │ │ ├── image.go
│ │ │ │ │ ├── image_history.go
│ │ │ │ │ ├── manifest.go
│ │ │ │ │ ├── opts.go
│ │ │ │ │ └── summary.go
│ │ │ │ ├── mount/
│ │ │ │ │ └── mount.go
│ │ │ │ ├── network/
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── endpoint.go
│ │ │ │ │ ├── ipam.go
│ │ │ │ │ └── network.go
│ │ │ │ ├── plugin.go
│ │ │ │ ├── plugin_device.go
│ │ │ │ ├── plugin_env.go
│ │ │ │ ├── plugin_interface_type.go
│ │ │ │ ├── plugin_mount.go
│ │ │ │ ├── plugin_responses.go
│ │ │ │ ├── port.go
│ │ │ │ ├── registry/
│ │ │ │ │ ├── authconfig.go
│ │ │ │ │ ├── authenticate.go
│ │ │ │ │ ├── registry.go
│ │ │ │ │ └── search.go
│ │ │ │ ├── strslice/
│ │ │ │ │ └── strslice.go
│ │ │ │ ├── swarm/
│ │ │ │ │ ├── common.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── network.go
│ │ │ │ │ ├── node.go
│ │ │ │ │ ├── runtime/
│ │ │ │ │ │ ├── gen.go
│ │ │ │ │ │ ├── plugin.pb.go
│ │ │ │ │ │ └── plugin.proto
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ ├── secret.go
│ │ │ │ │ ├── service.go
│ │ │ │ │ ├── service_create_response.go
│ │ │ │ │ ├── service_update_response.go
│ │ │ │ │ ├── swarm.go
│ │ │ │ │ └── task.go
│ │ │ │ ├── system/
│ │ │ │ │ ├── info.go
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ └── security_opts.go
│ │ │ │ ├── time/
│ │ │ │ │ └── timestamp.go
│ │ │ │ ├── types.go
│ │ │ │ ├── types_deprecated.go
│ │ │ │ ├── versions/
│ │ │ │ │ └── compare.go
│ │ │ │ └── volume/
│ │ │ │ ├── cluster_volume.go
│ │ │ │ ├── create_options.go
│ │ │ │ ├── list_response.go
│ │ │ │ ├── options.go
│ │ │ │ ├── volume.go
│ │ │ │ └── volume_update.go
│ │ │ ├── client/
│ │ │ │ ├── README.md
│ │ │ │ ├── build_cancel.go
│ │ │ │ ├── build_prune.go
│ │ │ │ ├── checkpoint_create.go
│ │ │ │ ├── checkpoint_delete.go
│ │ │ │ ├── checkpoint_list.go
│ │ │ │ ├── client.go
│ │ │ │ ├── client_deprecated.go
│ │ │ │ ├── client_unix.go
│ │ │ │ ├── client_windows.go
│ │ │ │ ├── config_create.go
│ │ │ │ ├── config_inspect.go
│ │ │ │ ├── config_list.go
│ │ │ │ ├── config_remove.go
│ │ │ │ ├── config_update.go
│ │ │ │ ├── container_attach.go
│ │ │ │ ├── container_commit.go
│ │ │ │ ├── container_copy.go
│ │ │ │ ├── container_create.go
│ │ │ │ ├── container_diff.go
│ │ │ │ ├── container_exec.go
│ │ │ │ ├── container_export.go
│ │ │ │ ├── container_inspect.go
│ │ │ │ ├── container_kill.go
│ │ │ │ ├── container_list.go
│ │ │ │ ├── container_logs.go
│ │ │ │ ├── container_pause.go
│ │ │ │ ├── container_prune.go
│ │ │ │ ├── container_remove.go
│ │ │ │ ├── container_rename.go
│ │ │ │ ├── container_resize.go
│ │ │ │ ├── container_restart.go
│ │ │ │ ├── container_start.go
│ │ │ │ ├── container_stats.go
│ │ │ │ ├── container_stop.go
│ │ │ │ ├── container_top.go
│ │ │ │ ├── container_unpause.go
│ │ │ │ ├── container_update.go
│ │ │ │ ├── container_wait.go
│ │ │ │ ├── disk_usage.go
│ │ │ │ ├── distribution_inspect.go
│ │ │ │ ├── envvars.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── events.go
│ │ │ │ ├── hijack.go
│ │ │ │ ├── image_build.go
│ │ │ │ ├── image_create.go
│ │ │ │ ├── image_history.go
│ │ │ │ ├── image_import.go
│ │ │ │ ├── image_inspect.go
│ │ │ │ ├── image_list.go
│ │ │ │ ├── image_load.go
│ │ │ │ ├── image_prune.go
│ │ │ │ ├── image_pull.go
│ │ │ │ ├── image_push.go
│ │ │ │ ├── image_remove.go
│ │ │ │ ├── image_save.go
│ │ │ │ ├── image_search.go
│ │ │ │ ├── image_tag.go
│ │ │ │ ├── info.go
│ │ │ │ ├── interface.go
│ │ │ │ ├── interface_experimental.go
│ │ │ │ ├── interface_stable.go
│ │ │ │ ├── login.go
│ │ │ │ ├── network_connect.go
│ │ │ │ ├── network_create.go
│ │ │ │ ├── network_disconnect.go
│ │ │ │ ├── network_inspect.go
│ │ │ │ ├── network_list.go
│ │ │ │ ├── network_prune.go
│ │ │ │ ├── network_remove.go
│ │ │ │ ├── node_inspect.go
│ │ │ │ ├── node_list.go
│ │ │ │ ├── node_remove.go
│ │ │ │ ├── node_update.go
│ │ │ │ ├── options.go
│ │ │ │ ├── ping.go
│ │ │ │ ├── plugin_create.go
│ │ │ │ ├── plugin_disable.go
│ │ │ │ ├── plugin_enable.go
│ │ │ │ ├── plugin_inspect.go
│ │ │ │ ├── plugin_install.go
│ │ │ │ ├── plugin_list.go
│ │ │ │ ├── plugin_push.go
│ │ │ │ ├── plugin_remove.go
│ │ │ │ ├── plugin_set.go
│ │ │ │ ├── plugin_upgrade.go
│ │ │ │ ├── request.go
│ │ │ │ ├── secret_create.go
│ │ │ │ ├── secret_inspect.go
│ │ │ │ ├── secret_list.go
│ │ │ │ ├── secret_remove.go
│ │ │ │ ├── secret_update.go
│ │ │ │ ├── service_create.go
│ │ │ │ ├── service_inspect.go
│ │ │ │ ├── service_list.go
│ │ │ │ ├── service_logs.go
│ │ │ │ ├── service_remove.go
│ │ │ │ ├── service_update.go
│ │ │ │ ├── swarm_get_unlock_key.go
│ │ │ │ ├── swarm_init.go
│ │ │ │ ├── swarm_inspect.go
│ │ │ │ ├── swarm_join.go
│ │ │ │ ├── swarm_leave.go
│ │ │ │ ├── swarm_unlock.go
│ │ │ │ ├── swarm_update.go
│ │ │ │ ├── task_inspect.go
│ │ │ │ ├── task_list.go
│ │ │ │ ├── task_logs.go
│ │ │ │ ├── utils.go
│ │ │ │ ├── version.go
│ │ │ │ ├── volume_create.go
│ │ │ │ ├── volume_inspect.go
│ │ │ │ ├── volume_list.go
│ │ │ │ ├── volume_prune.go
│ │ │ │ ├── volume_remove.go
│ │ │ │ └── volume_update.go
│ │ │ ├── errdefs/
│ │ │ │ ├── defs.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── helpers.go
│ │ │ │ ├── http_helpers.go
│ │ │ │ └── is.go
│ │ │ ├── internal/
│ │ │ │ └── multierror/
│ │ │ │ └── multierror.go
│ │ │ └── pkg/
│ │ │ ├── homedir/
│ │ │ │ ├── homedir.go
│ │ │ │ ├── homedir_linux.go
│ │ │ │ └── homedir_others.go
│ │ │ └── longpath/
│ │ │ └── longpath.go
│ │ ├── docker-credential-helpers/
│ │ │ ├── LICENSE
│ │ │ ├── client/
│ │ │ │ ├── client.go
│ │ │ │ └── command.go
│ │ │ └── credentials/
│ │ │ ├── credentials.go
│ │ │ ├── error.go
│ │ │ ├── helper.go
│ │ │ └── version.go
│ │ ├── go-connections/
│ │ │ ├── LICENSE
│ │ │ ├── nat/
│ │ │ │ ├── nat.go
│ │ │ │ ├── parse.go
│ │ │ │ └── sort.go
│ │ │ ├── sockets/
│ │ │ │ ├── README.md
│ │ │ │ ├── inmem_socket.go
│ │ │ │ ├── proxy.go
│ │ │ │ ├── sockets.go
│ │ │ │ ├── sockets_unix.go
│ │ │ │ ├── sockets_windows.go
│ │ │ │ ├── tcp_socket.go
│ │ │ │ └── unix_socket.go
│ │ │ └── tlsconfig/
│ │ │ ├── certpool.go
│ │ │ ├── config.go
│ │ │ └── config_client_ciphers.go
│ │ └── go-units/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── README.md
│ │ ├── circle.yml
│ │ ├── duration.go
│ │ ├── size.go
│ │ └── ulimit.go
│ ├── dustin/
│ │ └── go-humanize/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.markdown
│ │ ├── big.go
│ │ ├── bigbytes.go
│ │ ├── bytes.go
│ │ ├── comma.go
│ │ ├── commaf.go
│ │ ├── ftoa.go
│ │ ├── humanize.go
│ │ ├── number.go
│ │ ├── ordinals.go
│ │ ├── si.go
│ │ └── times.go
│ ├── emicklei/
│ │ └── go-restful/
│ │ └── v3/
│ │ ├── .gitignore
│ │ ├── .goconvey
│ │ ├── .travis.yml
│ │ ├── CHANGES.md
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── Srcfile
│ │ ├── bench_test.sh
│ │ ├── compress.go
│ │ ├── compressor_cache.go
│ │ ├── compressor_pools.go
│ │ ├── compressors.go
│ │ ├── constants.go
│ │ ├── container.go
│ │ ├── cors_filter.go
│ │ ├── coverage.sh
│ │ ├── curly.go
│ │ ├── curly_route.go
│ │ ├── custom_verb.go
│ │ ├── doc.go
│ │ ├── entity_accessors.go
│ │ ├── extensions.go
│ │ ├── filter.go
│ │ ├── filter_adapter.go
│ │ ├── jsr311.go
│ │ ├── log/
│ │ │ └── log.go
│ │ ├── logger.go
│ │ ├── mime.go
│ │ ├── options_filter.go
│ │ ├── parameter.go
│ │ ├── path_expression.go
│ │ ├── path_processor.go
│ │ ├── request.go
│ │ ├── response.go
│ │ ├── route.go
│ │ ├── route_builder.go
│ │ ├── route_reader.go
│ │ ├── router.go
│ │ ├── service_error.go
│ │ ├── web_service.go
│ │ └── web_service_container.go
│ ├── erikgeiser/
│ │ └── coninput/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── keycodes.go
│ │ ├── mode.go
│ │ ├── read.go
│ │ └── records.go
│ ├── evanphx/
│ │ └── json-patch/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── errors.go
│ │ ├── merge.go
│ │ ├── patch.go
│ │ └── v5/
│ │ ├── LICENSE
│ │ ├── errors.go
│ │ ├── internal/
│ │ │ └── json/
│ │ │ ├── decode.go
│ │ │ ├── encode.go
│ │ │ ├── fold.go
│ │ │ ├── fuzz.go
│ │ │ ├── indent.go
│ │ │ ├── scanner.go
│ │ │ ├── stream.go
│ │ │ ├── tables.go
│ │ │ └── tags.go
│ │ ├── merge.go
│ │ └── patch.go
│ ├── felixge/
│ │ └── httpsnoop/
│ │ ├── .gitignore
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── capture_metrics.go
│ │ ├── docs.go
│ │ ├── wrap_generated_gteq_1.8.go
│ │ └── wrap_generated_lt_1.8.go
│ ├── fsnotify/
│ │ └── fsnotify/
│ │ ├── .cirrus.yml
│ │ ├── .editorconfig
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .mailmap
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── backend_fen.go
│ │ ├── backend_inotify.go
│ │ ├── backend_kqueue.go
│ │ ├── backend_other.go
│ │ ├── backend_windows.go
│ │ ├── fsnotify.go
│ │ ├── mkdoc.zsh
│ │ ├── system_bsd.go
│ │ └── system_darwin.go
│ ├── fxamacker/
│ │ └── cbor/
│ │ └── v2/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── bytestring.go
│ │ ├── cache.go
│ │ ├── common.go
│ │ ├── decode.go
│ │ ├── diagnose.go
│ │ ├── doc.go
│ │ ├── encode.go
│ │ ├── encode_map.go
│ │ ├── encode_map_go117.go
│ │ ├── simplevalue.go
│ │ ├── stream.go
│ │ ├── structfields.go
│ │ ├── tag.go
│ │ └── valid.go
│ ├── gaissmai/
│ │ └── bart/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── base_index.go
│ │ ├── dumper.go
│ │ ├── jsonify.go
│ │ ├── node.go
│ │ ├── stringify.go
│ │ └── table.go
│ ├── ghodss/
│ │ └── yaml/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── fields.go
│ │ └── yaml.go
│ ├── go-json-experiment/
│ │ └── json/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── arshal.go
│ │ ├── arshal_any.go
│ │ ├── arshal_default.go
│ │ ├── arshal_funcs.go
│ │ ├── arshal_inlined.go
│ │ ├── arshal_methods.go
│ │ ├── arshal_time.go
│ │ ├── doc.go
│ │ ├── errors.go
│ │ ├── fields.go
│ │ ├── fold.go
│ │ ├── intern.go
│ │ ├── internal/
│ │ │ ├── internal.go
│ │ │ ├── jsonflags/
│ │ │ │ └── flags.go
│ │ │ ├── jsonopts/
│ │ │ │ └── options.go
│ │ │ └── jsonwire/
│ │ │ ├── decode.go
│ │ │ ├── encode.go
│ │ │ └── wire.go
│ │ ├── jsontext/
│ │ │ ├── decode.go
│ │ │ ├── doc.go
│ │ │ ├── encode.go
│ │ │ ├── errors.go
│ │ │ ├── export.go
│ │ │ ├── options.go
│ │ │ ├── pools.go
│ │ │ ├── quote.go
│ │ │ ├── state.go
│ │ │ ├── token.go
│ │ │ └── value.go
│ │ └── options.go
│ ├── go-logr/
│ │ ├── logr/
│ │ │ ├── .golangci.yaml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── SECURITY.md
│ │ │ ├── context.go
│ │ │ ├── context_noslog.go
│ │ │ ├── context_slog.go
│ │ │ ├── discard.go
│ │ │ ├── funcr/
│ │ │ │ ├── funcr.go
│ │ │ │ └── slogsink.go
│ │ │ ├── logr.go
│ │ │ ├── sloghandler.go
│ │ │ ├── slogr.go
│ │ │ └── slogsink.go
│ │ └── stdr/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── stdr.go
│ ├── go-ole/
│ │ └── go-ole/
│ │ ├── .travis.yml
│ │ ├── ChangeLog.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── appveyor.yml
│ │ ├── com.go
│ │ ├── com_func.go
│ │ ├── connect.go
│ │ ├── constants.go
│ │ ├── error.go
│ │ ├── error_func.go
│ │ ├── error_windows.go
│ │ ├── guid.go
│ │ ├── iconnectionpoint.go
│ │ ├── iconnectionpoint_func.go
│ │ ├── iconnectionpoint_windows.go
│ │ ├── iconnectionpointcontainer.go
│ │ ├── iconnectionpointcontainer_func.go
│ │ ├── iconnectionpointcontainer_windows.go
│ │ ├── idispatch.go
│ │ ├── idispatch_func.go
│ │ ├── idispatch_windows.go
│ │ ├── ienumvariant.go
│ │ ├── ienumvariant_func.go
│ │ ├── ienumvariant_windows.go
│ │ ├── iinspectable.go
│ │ ├── iinspectable_func.go
│ │ ├── iinspectable_windows.go
│ │ ├── iprovideclassinfo.go
│ │ ├── iprovideclassinfo_func.go
│ │ ├── iprovideclassinfo_windows.go
│ │ ├── itypeinfo.go
│ │ ├── itypeinfo_func.go
│ │ ├── itypeinfo_windows.go
│ │ ├── iunknown.go
│ │ ├── iunknown_func.go
│ │ ├── iunknown_windows.go
│ │ ├── ole.go
│ │ ├── oleutil/
│ │ │ ├── connection.go
│ │ │ ├── connection_func.go
│ │ │ ├── connection_windows.go
│ │ │ ├── go-get.go
│ │ │ └── oleutil.go
│ │ ├── safearray.go
│ │ ├── safearray_func.go
│ │ ├── safearray_windows.go
│ │ ├── safearrayconversion.go
│ │ ├── safearrayslices.go
│ │ ├── utility.go
│ │ ├── variables.go
│ │ ├── variant.go
│ │ ├── variant_386.go
│ │ ├── variant_amd64.go
│ │ ├── variant_arm.go
│ │ ├── variant_arm64.go
│ │ ├── variant_date_386.go
│ │ ├── variant_date_amd64.go
│ │ ├── variant_date_arm.go
│ │ ├── variant_date_arm64.go
│ │ ├── variant_ppc64le.go
│ │ ├── variant_s390x.go
│ │ ├── vt_string.go
│ │ ├── winrt.go
│ │ └── winrt_doc.go
│ ├── go-openapi/
│ │ ├── jsonpointer/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── .golangci.yml
│ │ │ ├── CODE_OF_CONDUCT.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── pointer.go
│ │ └── jsonreference/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── internal/
│ │ │ └── normalize_url.go
│ │ └── reference.go
│ ├── go-viper/
│ │ └── mapstructure/
│ │ └── v2/
│ │ ├── .editorconfig
│ │ ├── .envrc
│ │ ├── .gitignore
│ │ ├── .golangci.yaml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── decode_hooks.go
│ │ ├── flake.nix
│ │ ├── internal/
│ │ │ └── errors/
│ │ │ ├── errors.go
│ │ │ ├── join.go
│ │ │ └── join_go1_19.go
│ │ ├── mapstructure.go
│ │ ├── reflect_go1_19.go
│ │ └── reflect_go1_20.go
│ ├── godbus/
│ │ └── dbus/
│ │ └── v5/
│ │ ├── .cirrus.yml
│ │ ├── .golangci.yml
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── auth.go
│ │ ├── auth_anonymous.go
│ │ ├── auth_external.go
│ │ ├── auth_sha1.go
│ │ ├── call.go
│ │ ├── conn.go
│ │ ├── conn_darwin.go
│ │ ├── conn_other.go
│ │ ├── conn_unix.go
│ │ ├── conn_windows.go
│ │ ├── dbus.go
│ │ ├── decoder.go
│ │ ├── default_handler.go
│ │ ├── doc.go
│ │ ├── encoder.go
│ │ ├── escape.go
│ │ ├── export.go
│ │ ├── homedir.go
│ │ ├── match.go
│ │ ├── message.go
│ │ ├── object.go
│ │ ├── sequence.go
│ │ ├── sequential_handler.go
│ │ ├── server_interfaces.go
│ │ ├── sig.go
│ │ ├── transport_darwin.go
│ │ ├── transport_generic.go
│ │ ├── transport_nonce_tcp.go
│ │ ├── transport_tcp.go
│ │ ├── transport_unix.go
│ │ ├── transport_unixcred_dragonfly.go
│ │ ├── transport_unixcred_freebsd.go
│ │ ├── transport_unixcred_linux.go
│ │ ├── transport_unixcred_netbsd.go
│ │ ├── transport_unixcred_openbsd.go
│ │ ├── transport_zos.go
│ │ ├── variant.go
│ │ ├── variant_lexer.go
│ │ └── variant_parser.go
│ ├── gofrs/
│ │ └── flock/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── build.sh
│ │ ├── flock.go
│ │ ├── flock_others.go
│ │ ├── flock_unix.go
│ │ ├── flock_unix_fcntl.go
│ │ └── flock_windows.go
│ ├── gogo/
│ │ └── protobuf/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── gogoproto/
│ │ │ ├── Makefile
│ │ │ ├── doc.go
│ │ │ ├── gogo.pb.go
│ │ │ ├── gogo.pb.golden
│ │ │ ├── gogo.proto
│ │ │ └── helper.go
│ │ ├── proto/
│ │ │ ├── Makefile
│ │ │ ├── clone.go
│ │ │ ├── custom_gogo.go
│ │ │ ├── decode.go
│ │ │ ├── deprecated.go
│ │ │ ├── discard.go
│ │ │ ├── duration.go
│ │ │ ├── duration_gogo.go
│ │ │ ├── encode.go
│ │ │ ├── encode_gogo.go
│ │ │ ├── equal.go
│ │ │ ├── extensions.go
│ │ │ ├── extensions_gogo.go
│ │ │ ├── lib.go
│ │ │ ├── lib_gogo.go
│ │ │ ├── message_set.go
│ │ │ ├── pointer_reflect.go
│ │ │ ├── pointer_reflect_gogo.go
│ │ │ ├── pointer_unsafe.go
│ │ │ ├── pointer_unsafe_gogo.go
│ │ │ ├── properties.go
│ │ │ ├── properties_gogo.go
│ │ │ ├── skip_gogo.go
│ │ │ ├── table_marshal.go
│ │ │ ├── table_marshal_gogo.go
│ │ │ ├── table_merge.go
│ │ │ ├── table_unmarshal.go
│ │ │ ├── table_unmarshal_gogo.go
│ │ │ ├── text.go
│ │ │ ├── text_gogo.go
│ │ │ ├── text_parser.go
│ │ │ ├── timestamp.go
│ │ │ ├── timestamp_gogo.go
│ │ │ ├── wrappers.go
│ │ │ └── wrappers_gogo.go
│ │ ├── protoc-gen-gogo/
│ │ │ └── descriptor/
│ │ │ ├── Makefile
│ │ │ ├── descriptor.go
│ │ │ ├── descriptor.pb.go
│ │ │ ├── descriptor_gostring.gen.go
│ │ │ └── helper.go
│ │ └── sortkeys/
│ │ └── sortkeys.go
│ ├── golang/
│ │ ├── groupcache/
│ │ │ ├── LICENSE
│ │ │ └── lru/
│ │ │ └── lru.go
│ │ └── protobuf/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── proto/
│ │ │ ├── buffer.go
│ │ │ ├── defaults.go
│ │ │ ├── deprecated.go
│ │ │ ├── discard.go
│ │ │ ├── extensions.go
│ │ │ ├── properties.go
│ │ │ ├── proto.go
│ │ │ ├── registry.go
│ │ │ ├── text_decode.go
│ │ │ ├── text_encode.go
│ │ │ ├── wire.go
│ │ │ └── wrappers.go
│ │ └── ptypes/
│ │ ├── any/
│ │ │ └── any.pb.go
│ │ └── timestamp/
│ │ └── timestamp.pb.go
│ ├── golang-jwt/
│ │ └── jwt/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── MIGRATION_GUIDE.md
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── VERSION_HISTORY.md
│ │ ├── claims.go
│ │ ├── doc.go
│ │ ├── ecdsa.go
│ │ ├── ecdsa_utils.go
│ │ ├── ed25519.go
│ │ ├── ed25519_utils.go
│ │ ├── errors.go
│ │ ├── hmac.go
│ │ ├── map_claims.go
│ │ ├── none.go
│ │ ├── parser.go
│ │ ├── parser_option.go
│ │ ├── rsa.go
│ │ ├── rsa_pss.go
│ │ ├── rsa_utils.go
│ │ ├── signing_method.go
│ │ ├── staticcheck.conf
│ │ ├── token.go
│ │ └── types.go
│ ├── google/
│ │ ├── btree/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── btree.go
│ │ │ └── btree_generic.go
│ │ ├── cel-go/
│ │ │ ├── LICENSE
│ │ │ ├── cel/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── cel.go
│ │ │ │ ├── decls.go
│ │ │ │ ├── env.go
│ │ │ │ ├── folding.go
│ │ │ │ ├── inlining.go
│ │ │ │ ├── io.go
│ │ │ │ ├── library.go
│ │ │ │ ├── macro.go
│ │ │ │ ├── optimizer.go
│ │ │ │ ├── options.go
│ │ │ │ ├── program.go
│ │ │ │ └── validator.go
│ │ │ ├── checker/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── checker.go
│ │ │ │ ├── cost.go
│ │ │ │ ├── decls/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── decls.go
│ │ │ │ ├── env.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── format.go
│ │ │ │ ├── mapping.go
│ │ │ │ ├── options.go
│ │ │ │ ├── printer.go
│ │ │ │ ├── scopes.go
│ │ │ │ └── types.go
│ │ │ ├── common/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── ast/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── ast.go
│ │ │ │ │ ├── conversion.go
│ │ │ │ │ ├── expr.go
│ │ │ │ │ ├── factory.go
│ │ │ │ │ └── navigable.go
│ │ │ │ ├── containers/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── container.go
│ │ │ │ ├── cost.go
│ │ │ │ ├── debug/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── debug.go
│ │ │ │ ├── decls/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── decls.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── error.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── functions/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── functions.go
│ │ │ │ ├── location.go
│ │ │ │ ├── operators/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── operators.go
│ │ │ │ ├── overloads/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── overloads.go
│ │ │ │ ├── runes/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── buffer.go
│ │ │ │ ├── source.go
│ │ │ │ ├── stdlib/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── standard.go
│ │ │ │ └── types/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── any_value.go
│ │ │ │ ├── bool.go
│ │ │ │ ├── bytes.go
│ │ │ │ ├── compare.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── double.go
│ │ │ │ ├── duration.go
│ │ │ │ ├── err.go
│ │ │ │ ├── int.go
│ │ │ │ ├── iterator.go
│ │ │ │ ├── json_value.go
│ │ │ │ ├── list.go
│ │ │ │ ├── map.go
│ │ │ │ ├── null.go
│ │ │ │ ├── object.go
│ │ │ │ ├── optional.go
│ │ │ │ ├── overflow.go
│ │ │ │ ├── pb/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── checked.go
│ │ │ │ │ ├── enum.go
│ │ │ │ │ ├── equal.go
│ │ │ │ │ ├── file.go
│ │ │ │ │ ├── pb.go
│ │ │ │ │ └── type.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── ref/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── provider.go
│ │ │ │ │ └── reference.go
│ │ │ │ ├── string.go
│ │ │ │ ├── timestamp.go
│ │ │ │ ├── traits/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── comparer.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── field_tester.go
│ │ │ │ │ ├── indexer.go
│ │ │ │ │ ├── iterator.go
│ │ │ │ │ ├── lister.go
│ │ │ │ │ ├── mapper.go
│ │ │ │ │ ├── matcher.go
│ │ │ │ │ ├── math.go
│ │ │ │ │ ├── receiver.go
│ │ │ │ │ ├── sizer.go
│ │ │ │ │ ├── traits.go
│ │ │ │ │ └── zeroer.go
│ │ │ │ ├── types.go
│ │ │ │ ├── uint.go
│ │ │ │ ├── unknown.go
│ │ │ │ └── util.go
│ │ │ ├── ext/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── README.md
│ │ │ │ ├── bindings.go
│ │ │ │ ├── comprehensions.go
│ │ │ │ ├── encoders.go
│ │ │ │ ├── formatting.go
│ │ │ │ ├── guards.go
│ │ │ │ ├── lists.go
│ │ │ │ ├── math.go
│ │ │ │ ├── native.go
│ │ │ │ ├── protos.go
│ │ │ │ ├── sets.go
│ │ │ │ └── strings.go
│ │ │ ├── interpreter/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── activation.go
│ │ │ │ ├── attribute_patterns.go
│ │ │ │ ├── attributes.go
│ │ │ │ ├── decorators.go
│ │ │ │ ├── dispatcher.go
│ │ │ │ ├── evalstate.go
│ │ │ │ ├── functions/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── functions.go
│ │ │ │ ├── interpretable.go
│ │ │ │ ├── interpreter.go
│ │ │ │ ├── optimizations.go
│ │ │ │ ├── planner.go
│ │ │ │ ├── prune.go
│ │ │ │ └── runtimecost.go
│ │ │ └── parser/
│ │ │ ├── BUILD.bazel
│ │ │ ├── errors.go
│ │ │ ├── gen/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── CEL.g4
│ │ │ │ ├── CEL.interp
│ │ │ │ ├── CEL.tokens
│ │ │ │ ├── CELLexer.interp
│ │ │ │ ├── CELLexer.tokens
│ │ │ │ ├── cel_base_listener.go
│ │ │ │ ├── cel_base_visitor.go
│ │ │ │ ├── cel_lexer.go
│ │ │ │ ├── cel_listener.go
│ │ │ │ ├── cel_parser.go
│ │ │ │ ├── cel_visitor.go
│ │ │ │ ├── doc.go
│ │ │ │ └── generate.sh
│ │ │ ├── helper.go
│ │ │ ├── input.go
│ │ │ ├── macro.go
│ │ │ ├── options.go
│ │ │ ├── parser.go
│ │ │ ├── unescape.go
│ │ │ └── unparser.go
│ │ ├── gnostic-models/
│ │ │ ├── LICENSE
│ │ │ ├── compiler/
│ │ │ │ ├── README.md
│ │ │ │ ├── context.go
│ │ │ │ ├── error.go
│ │ │ │ ├── extensions.go
│ │ │ │ ├── helpers.go
│ │ │ │ ├── main.go
│ │ │ │ └── reader.go
│ │ │ ├── extensions/
│ │ │ │ ├── README.md
│ │ │ │ ├── extension.pb.go
│ │ │ │ ├── extension.proto
│ │ │ │ └── extensions.go
│ │ │ ├── jsonschema/
│ │ │ │ ├── README.md
│ │ │ │ ├── base.go
│ │ │ │ ├── display.go
│ │ │ │ ├── models.go
│ │ │ │ ├── operations.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── schema.json
│ │ │ │ └── writer.go
│ │ │ ├── openapiv2/
│ │ │ │ ├── OpenAPIv2.go
│ │ │ │ ├── OpenAPIv2.pb.go
│ │ │ │ ├── OpenAPIv2.proto
│ │ │ │ ├── README.md
│ │ │ │ ├── document.go
│ │ │ │ └── openapi-2.0.json
│ │ │ └── openapiv3/
│ │ │ ├── OpenAPIv3.go
│ │ │ ├── OpenAPIv3.pb.go
│ │ │ ├── OpenAPIv3.proto
│ │ │ ├── README.md
│ │ │ ├── annotations.pb.go
│ │ │ ├── annotations.proto
│ │ │ └── document.go
│ │ ├── go-cmp/
│ │ │ ├── LICENSE
│ │ │ └── cmp/
│ │ │ ├── compare.go
│ │ │ ├── export.go
│ │ │ ├── internal/
│ │ │ │ ├── diff/
│ │ │ │ │ ├── debug_disable.go
│ │ │ │ │ ├── debug_enable.go
│ │ │ │ │ └── diff.go
│ │ │ │ ├── flags/
│ │ │ │ │ └── flags.go
│ │ │ │ ├── function/
│ │ │ │ │ └── func.go
│ │ │ │ └── value/
│ │ │ │ ├── name.go
│ │ │ │ ├── pointer.go
│ │ │ │ └── sort.go
│ │ │ ├── options.go
│ │ │ ├── path.go
│ │ │ ├── report.go
│ │ │ ├── report_compare.go
│ │ │ ├── report_references.go
│ │ │ ├── report_reflect.go
│ │ │ ├── report_slices.go
│ │ │ ├── report_text.go
│ │ │ └── report_value.go
│ │ ├── go-containerregistry/
│ │ │ ├── LICENSE
│ │ │ ├── internal/
│ │ │ │ ├── and/
│ │ │ │ │ └── and_closer.go
│ │ │ │ ├── compression/
│ │ │ │ │ └── compression.go
│ │ │ │ ├── estargz/
│ │ │ │ │ └── estargz.go
│ │ │ │ ├── gzip/
│ │ │ │ │ └── zip.go
│ │ │ │ ├── redact/
│ │ │ │ │ └── redact.go
│ │ │ │ ├── retry/
│ │ │ │ │ ├── retry.go
│ │ │ │ │ └── wait/
│ │ │ │ │ └── kubernetes_apimachinery_wait.go
│ │ │ │ ├── verify/
│ │ │ │ │ └── verify.go
│ │ │ │ └── zstd/
│ │ │ │ └── zstd.go
│ │ │ └── pkg/
│ │ │ ├── authn/
│ │ │ │ ├── README.md
│ │ │ │ ├── anon.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── authn.go
│ │ │ │ ├── basic.go
│ │ │ │ ├── bearer.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── keychain.go
│ │ │ │ ├── kubernetes/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── keychain.go
│ │ │ │ └── multikeychain.go
│ │ │ ├── compression/
│ │ │ │ └── compression.go
│ │ │ ├── logs/
│ │ │ │ └── logs.go
│ │ │ ├── name/
│ │ │ │ ├── README.md
│ │ │ │ ├── check.go
│ │ │ │ ├── digest.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── options.go
│ │ │ │ ├── ref.go
│ │ │ │ ├── registry.go
│ │ │ │ ├── repository.go
│ │ │ │ └── tag.go
│ │ │ └── v1/
│ │ │ ├── config.go
│ │ │ ├── doc.go
│ │ │ ├── empty/
│ │ │ │ ├── README.md
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ └── index.go
│ │ │ ├── google/
│ │ │ │ ├── README.md
│ │ │ │ ├── auth.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── keychain.go
│ │ │ │ ├── list.go
│ │ │ │ └── options.go
│ │ │ ├── hash.go
│ │ │ ├── image.go
│ │ │ ├── index.go
│ │ │ ├── layer.go
│ │ │ ├── manifest.go
│ │ │ ├── match/
│ │ │ │ └── match.go
│ │ │ ├── mutate/
│ │ │ │ ├── README.md
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ ├── index.go
│ │ │ │ ├── mutate.go
│ │ │ │ └── rebase.go
│ │ │ ├── partial/
│ │ │ │ ├── README.md
│ │ │ │ ├── compressed.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ ├── index.go
│ │ │ │ ├── uncompressed.go
│ │ │ │ └── with.go
│ │ │ ├── platform.go
│ │ │ ├── progress.go
│ │ │ ├── remote/
│ │ │ │ ├── README.md
│ │ │ │ ├── catalog.go
│ │ │ │ ├── check.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── descriptor.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── fetcher.go
│ │ │ │ ├── image.go
│ │ │ │ ├── index.go
│ │ │ │ ├── layer.go
│ │ │ │ ├── list.go
│ │ │ │ ├── mount.go
│ │ │ │ ├── multi_write.go
│ │ │ │ ├── options.go
│ │ │ │ ├── progress.go
│ │ │ │ ├── puller.go
│ │ │ │ ├── pusher.go
│ │ │ │ ├── referrers.go
│ │ │ │ ├── schema1.go
│ │ │ │ ├── transport/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── basic.go
│ │ │ │ │ ├── bearer.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── error.go
│ │ │ │ │ ├── logger.go
│ │ │ │ │ ├── ping.go
│ │ │ │ │ ├── retry.go
│ │ │ │ │ ├── schemer.go
│ │ │ │ │ ├── scope.go
│ │ │ │ │ ├── transport.go
│ │ │ │ │ └── useragent.go
│ │ │ │ └── write.go
│ │ │ ├── stream/
│ │ │ │ ├── README.md
│ │ │ │ └── layer.go
│ │ │ ├── tarball/
│ │ │ │ ├── README.md
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ ├── layer.go
│ │ │ │ └── write.go
│ │ │ ├── types/
│ │ │ │ └── types.go
│ │ │ └── zz_deepcopy_generated.go
│ │ ├── go-github/
│ │ │ └── v30/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ └── github/
│ │ │ ├── actions.go
│ │ │ ├── actions_artifacts.go
│ │ │ ├── actions_runners.go
│ │ │ ├── actions_secrets.go
│ │ │ ├── actions_workflow_jobs.go
│ │ │ ├── actions_workflow_runs.go
│ │ │ ├── actions_workflows.go
│ │ │ ├── activity.go
│ │ │ ├── activity_events.go
│ │ │ ├── activity_notifications.go
│ │ │ ├── activity_star.go
│ │ │ ├── activity_watching.go
│ │ │ ├── admin.go
│ │ │ ├── admin_orgs.go
│ │ │ ├── admin_stats.go
│ │ │ ├── admin_users.go
│ │ │ ├── apps.go
│ │ │ ├── apps_installation.go
│ │ │ ├── apps_manifest.go
│ │ │ ├── apps_marketplace.go
│ │ │ ├── authorizations.go
│ │ │ ├── checks.go
│ │ │ ├── doc.go
│ │ │ ├── event.go
│ │ │ ├── event_types.go
│ │ │ ├── gists.go
│ │ │ ├── gists_comments.go
│ │ │ ├── git.go
│ │ │ ├── git_blobs.go
│ │ │ ├── git_commits.go
│ │ │ ├── git_refs.go
│ │ │ ├── git_tags.go
│ │ │ ├── git_trees.go
│ │ │ ├── github-accessors.go
│ │ │ ├── github.go
│ │ │ ├── gitignore.go
│ │ │ ├── interactions.go
│ │ │ ├── interactions_orgs.go
│ │ │ ├── interactions_repos.go
│ │ │ ├── issues.go
│ │ │ ├── issues_assignees.go
│ │ │ ├── issues_comments.go
│ │ │ ├── issues_events.go
│ │ │ ├── issues_labels.go
│ │ │ ├── issues_milestones.go
│ │ │ ├── issues_timeline.go
│ │ │ ├── licenses.go
│ │ │ ├── messages.go
│ │ │ ├── migrations.go
│ │ │ ├── migrations_source_import.go
│ │ │ ├── migrations_user.go
│ │ │ ├── misc.go
│ │ │ ├── orgs.go
│ │ │ ├── orgs_hooks.go
│ │ │ ├── orgs_members.go
│ │ │ ├── orgs_outside_collaborators.go
│ │ │ ├── orgs_projects.go
│ │ │ ├── orgs_users_blocking.go
│ │ │ ├── projects.go
│ │ │ ├── pulls.go
│ │ │ ├── pulls_comments.go
│ │ │ ├── pulls_reviewers.go
│ │ │ ├── pulls_reviews.go
│ │ │ ├── reactions.go
│ │ │ ├── repos.go
│ │ │ ├── repos_collaborators.go
│ │ │ ├── repos_comments.go
│ │ │ ├── repos_commits.go
│ │ │ ├── repos_community_health.go
│ │ │ ├── repos_contents.go
│ │ │ ├── repos_deployments.go
│ │ │ ├── repos_forks.go
│ │ │ ├── repos_hooks.go
│ │ │ ├── repos_invitations.go
│ │ │ ├── repos_keys.go
│ │ │ ├── repos_merging.go
│ │ │ ├── repos_pages.go
│ │ │ ├── repos_prereceive_hooks.go
│ │ │ ├── repos_projects.go
│ │ │ ├── repos_releases.go
│ │ │ ├── repos_stats.go
│ │ │ ├── repos_statuses.go
│ │ │ ├── repos_traffic.go
│ │ │ ├── search.go
│ │ │ ├── strings.go
│ │ │ ├── teams.go
│ │ │ ├── teams_discussion_comments.go
│ │ │ ├── teams_discussions.go
│ │ │ ├── teams_members.go
│ │ │ ├── timestamp.go
│ │ │ ├── users.go
│ │ │ ├── users_administration.go
│ │ │ ├── users_blocking.go
│ │ │ ├── users_emails.go
│ │ │ ├── users_followers.go
│ │ │ ├── users_gpg_keys.go
│ │ │ ├── users_keys.go
│ │ │ ├── users_projects.go
│ │ │ ├── with_appengine.go
│ │ │ └── without_appengine.go
│ │ ├── go-querystring/
│ │ │ ├── LICENSE
│ │ │ └── query/
│ │ │ └── encode.go
│ │ ├── gofuzz/
│ │ │ ├── .travis.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bytesource/
│ │ │ │ └── bytesource.go
│ │ │ ├── doc.go
│ │ │ └── fuzz.go
│ │ ├── nftables/
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── alignedbuff/
│ │ │ │ └── alignedbuff.go
│ │ │ ├── binaryutil/
│ │ │ │ └── binaryutil.go
│ │ │ ├── chain.go
│ │ │ ├── compat_policy.go
│ │ │ ├── conn.go
│ │ │ ├── counter.go
│ │ │ ├── doc.go
│ │ │ ├── expr/
│ │ │ │ ├── bitwise.go
│ │ │ │ ├── byteorder.go
│ │ │ │ ├── connlimit.go
│ │ │ │ ├── counter.go
│ │ │ │ ├── ct.go
│ │ │ │ ├── dup.go
│ │ │ │ ├── dynset.go
│ │ │ │ ├── expr.go
│ │ │ │ ├── exthdr.go
│ │ │ │ ├── fib.go
│ │ │ │ ├── flow_offload.go
│ │ │ │ ├── hash.go
│ │ │ │ ├── immediate.go
│ │ │ │ ├── limit.go
│ │ │ │ ├── log.go
│ │ │ │ ├── lookup.go
│ │ │ │ ├── match.go
│ │ │ │ ├── nat.go
│ │ │ │ ├── notrack.go
│ │ │ │ ├── numgen.go
│ │ │ │ ├── objref.go
│ │ │ │ ├── payload.go
│ │ │ │ ├── queue.go
│ │ │ │ ├── quota.go
│ │ │ │ ├── range.go
│ │ │ │ ├── redirect.go
│ │ │ │ ├── reject.go
│ │ │ │ ├── rt.go
│ │ │ │ ├── socket.go
│ │ │ │ ├── target.go
│ │ │ │ ├── tproxy.go
│ │ │ │ └── verdict.go
│ │ │ ├── flowtable.go
│ │ │ ├── internal/
│ │ │ │ └── parseexprfunc/
│ │ │ │ └── parseexprfunc.go
│ │ │ ├── monitor.go
│ │ │ ├── obj.go
│ │ │ ├── quota.go
│ │ │ ├── rule.go
│ │ │ ├── set.go
│ │ │ ├── table.go
│ │ │ ├── util.go
│ │ │ └── xt/
│ │ │ ├── info.go
│ │ │ ├── match_addrtype.go
│ │ │ ├── match_conntrack.go
│ │ │ ├── match_tcp.go
│ │ │ ├── match_udp.go
│ │ │ ├── target_dnat.go
│ │ │ ├── target_masquerade_ip.go
│ │ │ ├── unknown.go
│ │ │ ├── util.go
│ │ │ └── xt.go
│ │ ├── pprof/
│ │ │ ├── AUTHORS
│ │ │ ├── CONTRIBUTORS
│ │ │ ├── LICENSE
│ │ │ └── profile/
│ │ │ ├── encode.go
│ │ │ ├── filter.go
│ │ │ ├── index.go
│ │ │ ├── legacy_java_profile.go
│ │ │ ├── legacy_profile.go
│ │ │ ├── merge.go
│ │ │ ├── profile.go
│ │ │ ├── proto.go
│ │ │ └── prune.go
│ │ ├── shlex/
│ │ │ ├── COPYING
│ │ │ ├── README
│ │ │ └── shlex.go
│ │ └── uuid/
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dce.go
│ │ ├── doc.go
│ │ ├── hash.go
│ │ ├── marshal.go
│ │ ├── node.go
│ │ ├── node_js.go
│ │ ├── node_net.go
│ │ ├── null.go
│ │ ├── sql.go
│ │ ├── time.go
│ │ ├── util.go
│ │ ├── uuid.go
│ │ ├── version1.go
│ │ ├── version4.go
│ │ ├── version6.go
│ │ └── version7.go
│ ├── gorilla/
│ │ ├── csrf/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── Gopkg.toml
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── context.go
│ │ │ ├── csrf.go
│ │ │ ├── doc.go
│ │ │ ├── helpers.go
│ │ │ ├── options.go
│ │ │ ├── store.go
│ │ │ └── store_legacy.go
│ │ ├── handlers/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── canonical.go
│ │ │ ├── compress.go
│ │ │ ├── cors.go
│ │ │ ├── doc.go
│ │ │ ├── handlers.go
│ │ │ ├── logging.go
│ │ │ ├── proxy_headers.go
│ │ │ └── recovery.go
│ │ ├── securecookie/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── doc.go
│ │ │ └── securecookie.go
│ │ └── websocket/
│ │ ├── .gitignore
│ │ ├── AUTHORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── client.go
│ │ ├── compression.go
│ │ ├── conn.go
│ │ ├── doc.go
│ │ ├── join.go
│ │ ├── json.go
│ │ ├── mask.go
│ │ ├── mask_safe.go
│ │ ├── prepared.go
│ │ ├── proxy.go
│ │ ├── server.go
│ │ ├── tls_handshake.go
│ │ ├── tls_handshake_116.go
│ │ ├── util.go
│ │ └── x_net_proxy.go
│ ├── grpc-ecosystem/
│ │ └── grpc-gateway/
│ │ └── v2/
│ │ ├── LICENSE
│ │ ├── internal/
│ │ │ └── httprule/
│ │ │ ├── BUILD.bazel
│ │ │ ├── compile.go
│ │ │ ├── fuzz.go
│ │ │ ├── parse.go
│ │ │ └── types.go
│ │ ├── runtime/
│ │ │ ├── BUILD.bazel
│ │ │ ├── context.go
│ │ │ ├── convert.go
│ │ │ ├── doc.go
│ │ │ ├── errors.go
│ │ │ ├── fieldmask.go
│ │ │ ├── handler.go
│ │ │ ├── marshal_httpbodyproto.go
│ │ │ ├── marshal_json.go
│ │ │ ├── marshal_jsonpb.go
│ │ │ ├── marshal_proto.go
│ │ │ ├── marshaler.go
│ │ │ ├── marshaler_registry.go
│ │ │ ├── mux.go
│ │ │ ├── pattern.go
│ │ │ ├── proto2_convert.go
│ │ │ └── query.go
│ │ └── utilities/
│ │ ├── BUILD.bazel
│ │ ├── doc.go
│ │ ├── pattern.go
│ │ ├── readerfactory.go
│ │ ├── string_array_flag.go
│ │ └── trie.go
│ ├── hashicorp/
│ │ ├── errwrap/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── errwrap.go
│ │ ├── go-cleanhttp/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── cleanhttp.go
│ │ │ ├── doc.go
│ │ │ └── handlers.go
│ │ └── go-multierror/
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── append.go
│ │ ├── flatten.go
│ │ ├── format.go
│ │ ├── group.go
│ │ ├── multierror.go
│ │ ├── prefix.go
│ │ └── sort.go
│ ├── hdevalence/
│ │ └── ed25519consensus/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── batch.go
│ │ └── ed25519.go
│ ├── illarion/
│ │ └── gonotify/
│ │ └── v2/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dirwatcher.go
│ │ ├── event.go
│ │ ├── filewatcher.go
│ │ └── inotify.go
│ ├── in-toto/
│ │ └── in-toto-golang/
│ │ ├── LICENSE
│ │ └── in_toto/
│ │ ├── attestations.go
│ │ ├── certconstraint.go
│ │ ├── envelope.go
│ │ ├── hashlib.go
│ │ ├── keylib.go
│ │ ├── match.go
│ │ ├── model.go
│ │ ├── rulelib.go
│ │ ├── runlib.go
│ │ ├── slsa_provenance/
│ │ │ ├── common/
│ │ │ │ └── common.go
│ │ │ ├── v0.1/
│ │ │ │ └── provenance.go
│ │ │ ├── v0.2/
│ │ │ │ └── provenance.go
│ │ │ └── v1/
│ │ │ └── provenance.go
│ │ ├── util.go
│ │ ├── util_unix.go
│ │ ├── util_windows.go
│ │ └── verifylib.go
│ ├── inconshreveable/
│ │ ├── go-update/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── apply.go
│ │ │ ├── doc.go
│ │ │ ├── hide_noop.go
│ │ │ ├── hide_windows.go
│ │ │ ├── internal/
│ │ │ │ ├── binarydist/
│ │ │ │ │ ├── License
│ │ │ │ │ ├── Readme.md
│ │ │ │ │ ├── bzip2.go
│ │ │ │ │ ├── diff.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── encoding.go
│ │ │ │ │ ├── patch.go
│ │ │ │ │ └── seek.go
│ │ │ │ └── osext/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── osext.go
│ │ │ │ ├── osext_plan9.go
│ │ │ │ ├── osext_procfs.go
│ │ │ │ ├── osext_sysctl.go
│ │ │ │ └── osext_windows.go
│ │ │ ├── patcher.go
│ │ │ └── verifier.go
│ │ └── mousetrap/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── trap_others.go
│ │ └── trap_windows.go
│ ├── insomniacslk/
│ │ └── dhcp/
│ │ ├── CONTRIBUTORS.md
│ │ ├── LICENSE
│ │ ├── dhcpv4/
│ │ │ ├── bindtointerface.go
│ │ │ ├── defaults.go
│ │ │ ├── dhcpv4.go
│ │ │ ├── modifiers.go
│ │ │ ├── option_generic.go
│ │ │ ├── option_ip.go
│ │ │ ├── option_ip_address_lease_time.go
│ │ │ ├── option_ips.go
│ │ │ ├── option_maximum_dhcp_message_size.go
│ │ │ ├── option_message_type.go
│ │ │ ├── option_misc.go
│ │ │ ├── option_parameter_request_list.go
│ │ │ ├── option_relay_agent_information.go
│ │ │ ├── option_routes.go
│ │ │ ├── option_string.go
│ │ │ ├── option_strings.go
│ │ │ ├── option_subnet_mask.go
│ │ │ ├── option_vivc.go
│ │ │ ├── options.go
│ │ │ └── types.go
│ │ ├── iana/
│ │ │ ├── archtype.go
│ │ │ ├── entid.go
│ │ │ ├── hwtypes.go
│ │ │ ├── iana.go
│ │ │ └── statuscodes.go
│ │ ├── interfaces/
│ │ │ ├── bindtodevice_bsd.go
│ │ │ ├── bindtodevice_darwin.go
│ │ │ ├── bindtodevice_linux.go
│ │ │ ├── bindtodevice_windows.go
│ │ │ └── interfaces.go
│ │ └── rfc1035label/
│ │ └── label.go
│ ├── jmespath/
│ │ └── go-jmespath/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── api.go
│ │ ├── astnodetype_string.go
│ │ ├── functions.go
│ │ ├── interpreter.go
│ │ ├── lexer.go
│ │ ├── parser.go
│ │ ├── toktype_string.go
│ │ └── util.go
│ ├── joho/
│ │ └── godotenv/
│ │ ├── .gitignore
│ │ ├── LICENCE
│ │ ├── README.md
│ │ ├── godotenv.go
│ │ └── parser.go
│ ├── josharian/
│ │ ├── intern/
│ │ │ ├── README.md
│ │ │ ├── intern.go
│ │ │ └── license.md
│ │ └── native/
│ │ ├── doc.go
│ │ ├── endian_generic.go
│ │ ├── license
│ │ └── readme.md
│ ├── jsimonetti/
│ │ └── rtnetlink/
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── Makefile.fuzz
│ │ ├── README.md
│ │ ├── address.go
│ │ ├── conn.go
│ │ ├── doc.go
│ │ ├── endian.go
│ │ ├── fuzz-shell.nix
│ │ ├── internal/
│ │ │ └── unix/
│ │ │ ├── types_linux.go
│ │ │ └── types_other.go
│ │ ├── link.go
│ │ ├── neigh.go
│ │ ├── route.go
│ │ └── rule.go
│ ├── julienschmidt/
│ │ └── httprouter/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── path.go
│ │ ├── router.go
│ │ └── tree.go
│ ├── k0kubun/
│ │ └── go-ansi/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── cursor.go
│ │ ├── cursor_windows.go
│ │ ├── display.go
│ │ ├── display_windows.go
│ │ ├── output.go
│ │ ├── output_windows.go
│ │ ├── print.go
│ │ └── syscall_windows.go
│ ├── kballard/
│ │ └── go-shellquote/
│ │ ├── LICENSE
│ │ ├── README
│ │ ├── doc.go
│ │ ├── quote.go
│ │ └── unquote.go
│ ├── klauspost/
│ │ └── compress/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .goreleaser.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── compressible.go
│ │ ├── fse/
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── bytereader.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ └── fse.go
│ │ ├── gen.sh
│ │ ├── huff0/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ ├── decompress_amd64.go
│ │ │ ├── decompress_amd64.s
│ │ │ ├── decompress_generic.go
│ │ │ └── huff0.go
│ │ ├── internal/
│ │ │ ├── cpuinfo/
│ │ │ │ ├── cpuinfo.go
│ │ │ │ ├── cpuinfo_amd64.go
│ │ │ │ └── cpuinfo_amd64.s
│ │ │ └── snapref/
│ │ │ ├── LICENSE
│ │ │ ├── decode.go
│ │ │ ├── decode_other.go
│ │ │ ├── encode.go
│ │ │ ├── encode_other.go
│ │ │ └── snappy.go
│ │ ├── s2sx.mod
│ │ ├── s2sx.sum
│ │ └── zstd/
│ │ ├── README.md
│ │ ├── bitreader.go
│ │ ├── bitwriter.go
│ │ ├── blockdec.go
│ │ ├── blockenc.go
│ │ ├── blocktype_string.go
│ │ ├── bytebuf.go
│ │ ├── bytereader.go
│ │ ├── decodeheader.go
│ │ ├── decoder.go
│ │ ├── decoder_options.go
│ │ ├── dict.go
│ │ ├── enc_base.go
│ │ ├── enc_best.go
│ │ ├── enc_better.go
│ │ ├── enc_dfast.go
│ │ ├── enc_fast.go
│ │ ├── encoder.go
│ │ ├── encoder_options.go
│ │ ├── framedec.go
│ │ ├── frameenc.go
│ │ ├── fse_decoder.go
│ │ ├── fse_decoder_amd64.go
│ │ ├── fse_decoder_amd64.s
│ │ ├── fse_decoder_generic.go
│ │ ├── fse_encoder.go
│ │ ├── fse_predefined.go
│ │ ├── hash.go
│ │ ├── history.go
│ │ ├── internal/
│ │ │ └── xxhash/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ ├── xxhash.go
│ │ │ ├── xxhash_amd64.s
│ │ │ ├── xxhash_arm64.s
│ │ │ ├── xxhash_asm.go
│ │ │ ├── xxhash_other.go
│ │ │ └── xxhash_safe.go
│ │ ├── matchlen_amd64.go
│ │ ├── matchlen_amd64.s
│ │ ├── matchlen_generic.go
│ │ ├── seqdec.go
│ │ ├── seqdec_amd64.go
│ │ ├── seqdec_amd64.s
│ │ ├── seqdec_generic.go
│ │ ├── seqenc.go
│ │ ├── snappy.go
│ │ ├── zip.go
│ │ └── zstd.go
│ ├── kortschak/
│ │ └── wol/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── wol.go
│ ├── kr/
│ │ └── fs/
│ │ ├── LICENSE
│ │ ├── Readme
│ │ ├── filesystem.go
│ │ └── walk.go
│ ├── kylelemons/
│ │ └── godebug/
│ │ ├── LICENSE
│ │ └── diff/
│ │ └── diff.go
│ ├── liggitt/
│ │ └── tabwriter/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── tabwriter.go
│ ├── loft-sh/
│ │ ├── admin-apis/
│ │ │ ├── LICENSE
│ │ │ └── pkg/
│ │ │ └── licenseapi/
│ │ │ ├── features.go
│ │ │ ├── features.yaml
│ │ │ ├── features_internal.go
│ │ │ ├── generate.go
│ │ │ ├── license.go
│ │ │ ├── license_analytics.go
│ │ │ ├── license_announcement.go
│ │ │ ├── license_block_request.go
│ │ │ ├── license_button.go
│ │ │ ├── license_domain_token.go
│ │ │ ├── license_feature.go
│ │ │ ├── license_invoice.go
│ │ │ ├── license_limit.go
│ │ │ ├── license_module.go
│ │ │ ├── license_new.go
│ │ │ ├── license_plan.go
│ │ │ ├── license_resource_count.go
│ │ │ ├── license_routes.go
│ │ │ ├── license_trial.go
│ │ │ ├── names.go
│ │ │ ├── offline_license.go
│ │ │ ├── request_auth.go
│ │ │ ├── request_chat_auth.go
│ │ │ ├── request_generic.go
│ │ │ ├── request_instance.go
│ │ │ └── zz_generated.deepcopy.go
│ │ ├── agentapi/
│ │ │ └── v4/
│ │ │ ├── LICENSE
│ │ │ └── pkg/
│ │ │ └── apis/
│ │ │ └── loft/
│ │ │ ├── cluster/
│ │ │ │ ├── doc.go
│ │ │ │ ├── inject.go
│ │ │ │ ├── v1/
│ │ │ │ │ ├── chartinfo_types.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── feature_types.go
│ │ │ │ │ ├── helmrelease_types.go
│ │ │ │ │ ├── sleepmodeconfig_types.go
│ │ │ │ │ ├── zz_generated.api.register.go
│ │ │ │ │ ├── zz_generated.conversion.go
│ │ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ │ └── zz_generated.defaults.go
│ │ │ │ ├── zz_generated.api.register.go
│ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ └── zz_generated.defaults.go
│ │ │ └── storage/
│ │ │ └── v1/
│ │ │ ├── clusterquota_types.go
│ │ │ ├── condition_types.go
│ │ │ ├── doc.go
│ │ │ ├── groupversion_info.go
│ │ │ ├── zz_generated.deepcopy.go
│ │ │ └── zz_generated.defaults.go
│ │ ├── analytics-client/
│ │ │ ├── LICENSE
│ │ │ └── client/
│ │ │ ├── buffer.go
│ │ │ ├── client.go
│ │ │ ├── noop.go
│ │ │ └── types.go
│ │ ├── api/
│ │ │ └── v4/
│ │ │ ├── LICENSE
│ │ │ └── pkg/
│ │ │ ├── apis/
│ │ │ │ ├── audit/
│ │ │ │ │ └── v1/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── event_types.go
│ │ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ │ └── zz_generated.defaults.go
│ │ │ │ ├── management/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── inject.go
│ │ │ │ │ ├── install/
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── install.go
│ │ │ │ │ │ └── zz_generated.api.register.go
│ │ │ │ │ ├── types.go
│ │ │ │ │ ├── v1/
│ │ │ │ │ │ ├── agentauditevent_types.go
│ │ │ │ │ │ ├── announcement_types.go
│ │ │ │ │ │ ├── app_credentials_types.go
│ │ │ │ │ │ ├── app_types.go
│ │ │ │ │ │ ├── backup_apply_types.go
│ │ │ │ │ │ ├── backup_types.go
│ │ │ │ │ │ ├── cluster_accesskey_types.go
│ │ │ │ │ │ ├── cluster_agentconfig_types.go
│ │ │ │ │ │ ├── cluster_charts_types.go
│ │ │ │ │ │ ├── cluster_domain_types.go
│ │ │ │ │ │ ├── cluster_memberaccess_types.go
│ │ │ │ │ │ ├── cluster_members_types.go
│ │ │ │ │ │ ├── cluster_reset_types.go
│ │ │ │ │ │ ├── cluster_types.go
│ │ │ │ │ │ ├── cluster_virtualclusterdefaults_types.go
│ │ │ │ │ │ ├── clusteraccess_types.go
│ │ │ │ │ │ ├── clusterroletemplate_types.go
│ │ │ │ │ │ ├── config_types.go
│ │ │ │ │ │ ├── devpodenvironmenttemplate_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_cancel_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_download_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_log_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_stop_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_tasks_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_troubleshoot_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_up_types.go
│ │ │ │ │ │ ├── devpodworkspacepreset_types.
================================================
FILE CONTENTS
================================================
================================================
FILE: .devcontainer/devcontainer.json
================================================
{
"name": "DevPod Development",
"image": "ghcr.io/loft-sh/devpod:dev-6b64450abdb0ebc2ce7f663f9ff935c56679f8b6",
"remoteUser": "devpod",
"postCreateCommand": "bash ./.devcontainer/post_create.sh",
// Required for DinD
"privileged": true
}
================================================
FILE: .devcontainer/post_create.sh
================================================
#!/usr/bin/env bash
set -euo pipefail
log() {
echo "[POST_CREATE] $*"
}
# Start docker daemon. The script should've been put here by the DinD devcontainer feature
log "Starting Docker Daemon"
sudo /usr/local/share/docker-init.sh
#
# Add our user to docker group
sudo usermod -aG docker $USER
log "Installing docker provider with default options"
devpod provider add docker
log "Done"
================================================
FILE: .github/ISSUE_TEMPLATE/bug-report.md
================================================
---
name: Bug report
about: Create a report to help us reproduce and fix a bug
labels:
- kind/bug
---
<!-- Please use this template for reporting bugs and provide as much info as possible. Not doing so may result in your bug not being addressed in a timely manner. Thanks!-->
**What happened?**
**What did you expect to happen instead?**
**How can we reproduce the bug?** (as minimally and precisely as possible)
My *`devcontainer.json`*:
```
{
"name": "...",
...
}
```
**Local Environment:**
- DevPod Version: [use `devpod version`]
- Operating System: windows | linux | mac
- ARCH of the OS: AMD64 | ARM64 | i386
**DevPod Provider:**
- Cloud Provider: google | aws | azure | digitalOcean
- Kubernetes Provider: [use `kubectl version`]
- Local/remote provider: docker | ssh
- Custom provider: provide imported `provider.yaml` config file
**Anything else we need to know?**
================================================
FILE: .github/ISSUE_TEMPLATE/feature-request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
labels:
- kind/feature
---
**Is your feature request related to a problem?**
**Which solution do you suggest?**
**Which alternative solutions exist?**
**Additional context**
================================================
FILE: .github/devcontainer/Dockerfile
================================================
FROM mcr.microsoft.com/devcontainers/go:1.23-bullseye
ARG TARGETOS
ARG TARGETARCH
# We want to setup our own user later, this removes the built-in VSCode user
# that comes with the base image
RUN sudo userdel -r vscode -f || true && rm -rf /home/vscode
# Install Node.js
RUN apt-get update \
&& apt-get install -y --no-install-recommends curl ca-certificates gnupg \
&& curl -fsSL https://deb.nodesource.com/setup_20.x | bash - \
&& apt-get update \
&& apt-get install -y --no-install-recommends nodejs \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install Protobuf compiler
RUN apt-get update \
&& apt-get install -y --no-install-recommends protobuf-compiler \
&& apt-get clean \
&& rm -rf /var/lib/apt/lists/*
# Install kind
RUN curl -L -o kind "https://kind.sigs.k8s.io/dl/v0.17.0/kind-linux-${TARGETARCH}" && install -c -m 0755 kind /usr/local/bin && rm kind
# Install alacritty terminfo
RUN wget https://raw.githubusercontent.com/alacritty/alacritty/master/extra/alacritty.info \
&& sudo tic -xe alacritty,alacritty-direct alacritty.info \
&& rm alacritty.info
================================================
FILE: .github/devcontainer/devcontainer.json
================================================
{
"name": "DevPod Development Image",
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
"features": {
"ghcr.io/devcontainers/features/common-utils:2": {
"installZsh": true,
"configureZshAsDefaultShell": true,
"installOhMyZsh": true,
"installOhMyZshConfig": true,
"upgradePackages": true,
"username": "devpod"
},
"ghcr.io/devcontainers/features/github-cli:1": {},
"ghcr.io/devcontainers/features/docker-in-docker:2": {
"version": "latest"
},
"ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {
"version": "latest"
},
"ghcr.io/dhoeric/features/k9s:1": {
"version": "latest"
}
}
}
================================================
FILE: .github/licenses.tmpl
================================================
---
title: Open Source Licenses
sidebar_label: OSS Licenses
---
# Devpod dependencies
The following open source dependencies are used to build the [DevPod][] CLI.
[DevPod]: https://devpod.sh
## Go Packages
Some packages may only be included on certain architectures or operating systems.
{{ range . }}
- [{{.Name}}](https://pkg.go.dev/{{.Name}}) ([{{.LicenseName}}]({{.LicenseURL}}))
{{- end }}
================================================
FILE: .github/workflows/build-devcontainer-image.yaml
================================================
name: Build Dev Container
on:
workflow_dispatch:
push:
branches:
- "main"
paths:
- ".github/devcontainer/**"
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
packages: "write"
contents: "write"
pull-requests: "write"
steps:
- name: Checkout
id: checkout
uses: actions/checkout@v1
- name: Log in to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
id: buildx
uses: docker/setup-buildx-action@v1
- name: Prepare DevPod
run: |
curl -L -o devpod "https://github.com/loft-sh/devpod/releases/latest/download/devpod-linux-amd64" \
&& sudo install -c -m 0755 devpod /usr/local/bin \
&& rm -f devpod
devpod provider add docker
- name: "Build and push image"
run: |
for ARCH in amd64 arm64; do
# Build for $ARCH
devpod build . --devcontainer-path .github/devcontainer/devcontainer.json --platform linux/$ARCH --skip-push
ID=$(docker images --format "{{.ID}} {{.CreatedAt}} {{.Tag}}" | sort -rk 2 | grep "devpod" | awk 'NR==1{print $1}')
echo "found image: $ID"
if [ -z "${ID}" ]; then
echo "Image ID empty, exiting"
exit 0
fi
docker image ls
docker tag $ID ghcr.io/loft-sh/devpod:dev-$ARCH
docker push ghcr.io/loft-sh/devpod:dev-$ARCH
done
SUFFIX="${{github.sha}}"
IMAGE_NAME="devpod:dev-$SUFFIX"
echo "IMAGE_NAME=$IMAGE_NAME" >> $GITHUB_ENV
# Combine into multi-arch image
docker manifest create ghcr.io/loft-sh/$IMAGE_NAME \
--amend ghcr.io/loft-sh/devpod:dev-amd64 \
--amend ghcr.io/loft-sh/devpod:dev-arm64
docker manifest push ghcr.io/loft-sh/$IMAGE_NAME
- name: Update devcontainer.json
if: ${{ success() }}
run: |
sed -i "s|\(\"image\": \"\).*|\1ghcr.io/loft-sh/${IMAGE_NAME}\",|" .devcontainer/devcontainer.json
- name: Create Pull Request
if: ${{ success() }}
uses: peter-evans/create-pull-request@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
commit-message: "Update devcontainer image to ghcr.io/loft-sh/${{ env.IMAGE_NAME }}"
title: "Update devcontainer image"
body: "This PR updates the devcontainer image to ghcr.io/loft-sh/${{ env.IMAGE_NAME }}"
branch: "update-devcontainer-${{ github.sha }}"
base: "main"
================================================
FILE: .github/workflows/e2e-tests.yaml
================================================
name: E2E tests
on:
release:
types: [prereleased]
workflow_dispatch: {}
pull_request:
branches:
- main
paths:
- "**.go"
- "pkg/**.sh"
- "providers/**"
- "!**_test.go" # exclude test files to ignore unit test changes
- "e2e/**_test.go" # include test files in e2e again
- ".github/workflows/e2e-tests.yaml"
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
GO111MODULE: on
GOFLAGS: -mod=vendor
jobs:
test-e2e:
runs-on: ubuntu-latest
strategy:
fail-fast: true
max-parallel: 16
matrix:
label:
- "build"
- "ide"
- "integration"
- "machine"
- "machineprovider"
- "provider"
- "ssh"
- "up"
- "up-docker"
- "up-podman"
- "up-docker-compose"
- "up-docker-build"
- "up-docker-compose-build"
- "context"
steps:
- name: Checkout repo
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.21.8
- name: Set up kind k8s cluster
uses: engineerd/setup-kind@v0.5.0
with:
version: "v0.20.0"
image: kindest/node:v1.27.3
- name: Testing kind cluster set-up
run: |
set -x
kubectl cluster-info
kubectl get pods -n kube-system -v 10
echo "kubectl config current-context:" $(kubectl config current-context)
echo "KUBECONFIG env var:" ${KUBECONFIG}
- name: Build binary and copy to the E2E directory
working-directory: ./e2e
run: |
chmod +x ../hack/build-e2e.sh
BUILDDIR=bin SRCDIR=".." ../hack/build-e2e.sh
- name: E2E test
working-directory: ./e2e
run: |
sudo KUBECONFIG=/home/runner/.kube/config \
GH_USERNAME=${GH_USERNAME} \
GH_ACCESS_TOKEN=${GH_ACCESS_TOKEN} \
go test -v -ginkgo.v -timeout 3600s --ginkgo.label-filter=${{ matrix.label }}
env:
GH_USERNAME: ${{ secrets.GH_PRIVATE_REPO_USER_TEST }}
GH_ACCESS_TOKEN: ${{ secrets.GH_PRIVATE_REPO_TOKEN_TEST }}
test-e2e-windows:
runs-on: self-hosted-windows
# We run this only on PRs, for pre-releases we run the full separate workflow
if: ${{ github.event_name == 'pull_request' }}
strategy:
fail-fast: true
max-parallel: 1
matrix:
label:
- "build"
- "ide"
- "ssh"
- "up-docker"
- "up-docker-build"
- "up-docker-compose"
# - "up-docker-wsl"
steps:
- name: Git set line ending
run: |
git config --global core.autocrlf false
- name: Checkout repo
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.21.8
- name: Build binary and copy to the E2E directory
run: |
mkdir e2e\bin
go build -ldflags "-s -w" -o e2e\bin\devpod-windows-amd64.exe
$Env:GOOS = "linux"; $Env:GOARCH = "amd64"; go build -ldflags "-s -w" -o e2e\bin\devpod-linux-amd64
- name: E2E test
working-directory: .\e2e
run: |
go run github.com/onsi/ginkgo/v2/ginkgo -r --timeout=3600s --label-filter=${{ matrix.label }}
- name: Container cleanup
if: ${{ always() }}
run: |
if (Test-Path C:\Users\loft-user\.devpod\) {
Remove-Item -Recurse C:\Users\loft-user\.devpod\
}
sh -c "docker ps -q -a | xargs docker rm -f || :"
sh -c "docker images --format '{{.Repository}}:{{.Tag}},{{.ID}}' | grep -E 'devpod|none|temp|^test' | cut -d',' -f2 | xargs docker rmi -f || :"
sh -c "docker images --format '{{.Tag}}|{{.Digest}}' | grep none | cut -d'|' -f1 | xargs docker rmi -f || :"
================================================
FILE: .github/workflows/e2e-win-full-tests.yaml
================================================
name: E2E Win full tests
on:
release:
types: [prereleased]
workflow_dispatch: {}
concurrency:
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
cancel-in-progress: true
env:
GO111MODULE: on
GOFLAGS: -mod=vendor
jobs:
test-e2e-windows:
runs-on: self-hosted-windows
strategy:
fail-fast: true
max-parallel: 1
matrix:
label:
- "build"
- "ide"
- "ssh"
- "up-docker"
- "up-docker-build"
- "up-docker-compose"
# - "up-docker-wsl"
steps:
- name: Git set line ending
run: |
git config --global core.autocrlf false
- name: Checkout repo
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: 1.21.8
- name: Build binary and copy to the E2E directory
run: |
mkdir e2e\bin
go build -ldflags "-s -w" -o e2e\bin\devpod-windows-amd64.exe
$Env:GOOS = "linux"; $Env:GOARCH = "amd64"; go build -ldflags "-s -w" -o e2e\bin\devpod-linux-amd64
- name: E2E test
working-directory: .\e2e
run: |
go run github.com/onsi/ginkgo/v2/ginkgo -r --timeout=3600s --label-filter=${{ matrix.label }}
- name: Container cleanup
if: ${{ always() }}
run: |
if (Test-Path C:\Users\loft-user\.devpod\) {
Remove-Item -Recurse C:\Users\loft-user\.devpod\
}
sh -c "docker ps -q -a | xargs docker rm -f || :"
sh -c "docker images --format '{{.Repository}}:{{.Tag}},{{.ID}}' | grep -E 'devpod|none|temp|^test' | cut -d',' -f2 | xargs docker rmi -f || :"
sh -c "docker images --format '{{.ID}}|{{.Digest}}' | grep none | cut -d'|' -f1 | xargs docker rmi -f || :"
================================================
FILE: .github/workflows/go-licenses-check.yaml
================================================
name: go-licenses-check
on:
pull_request:
branches:
- main
paths:
- .github/workflows/go-licenses-check.yaml
- go.mod
workflow_dispatch: {}
concurrency:
group: ${{ github.workflow }}-$${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
check-licenses:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version-file: go.mod
- name: Install go-licenses
run: |
go install github.com/google/go-licenses@v1.6.0
- name: Run go-licenses check
run: go-licenses check ./... --ignore github.com/loft-sh
env:
GOPRIVATE: "github.com/loft-sh/*"
================================================
FILE: .github/workflows/go-licenses.yaml
================================================
name: go-licenses
on:
push:
branches:
- main
paths:
- .github/licenses.tmpl
- .github/workflows/go-licenses.yaml
- go.mod
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-$${{ github.head_ref || github.run_id }}
cancel-in-progress: true
jobs:
update-licenses:
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v4
- name: Set up Go
uses: actions/setup-go@v4
with:
go-version-file: go.mod
- name: Install go-licenses
run: |
go install github.com/google/go-licenses@v1.6.0
- name: Run go-licenses
run: go-licenses report ./... > docs/pages/licenses/devpod.mdx --template .github/licenses.tmpl --ignore github.com/loft-sh
- name: Create pull request
uses: peter-evans/create-pull-request@v5
with:
token: ${{ secrets.GH_ACCESS_TOKEN }}
committer: Loft Bot <loft-bot@users.noreply.github.com>
branch: licenses/devpod
commit-message: "license(DevPod): Updated OSS licenses"
title: "license(DevPod): Updated OSS licenses"
body: Triggered by ${{ github.repository }}@${{ github.sha }}
signoff: true
delete-branch: true
================================================
FILE: .github/workflows/golangci-lint.yaml
================================================
name: golangci-lint
on:
push:
tags:
- v*
branches:
- master
- main
pull_request:
permissions:
contents: read
# Optional: allow read access to pull request. Use with `only-new-issues` option.
pull-requests: read
env:
GO111MODULE: on
GOFLAGS: -mod=vendor
jobs:
golangci:
name: lint
runs-on: ubuntu-latest
steps:
- uses: actions/setup-go@v4
with:
go-version: "1.21.8"
- uses: actions/checkout@v3
- name: golangci-lint
uses: golangci/golangci-lint-action@v6
with:
version: v1.60.1
args: --timeout 30m
================================================
FILE: .github/workflows/release.yaml
================================================
name: Publish release
on:
release:
types: [prereleased]
jobs:
create-release:
if: startsWith(github.ref, 'refs/tags/v') == true
permissions:
contents: write
runs-on: ubuntu-22.04
outputs:
package_version: ${{ steps.get-version.outputs.package_version }}
original_package_version: ${{ steps.get-version.outputs.original_package_version }}
release_id: ${{ steps.get-release.outputs.id }}
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Setup Node
uses: actions/setup-node@v3
with:
node-version: 16
- run: npm install semver
- name: Get Version
uses: actions/github-script@v6
id: get-version
with:
script: |
const semver = require("semver")
const refName = `${process.env.GITHUB_REF_NAME}`
let version = refName.split("v")[1]
core.info(`Original Version: ${version}`)
core.setOutput("original_package_version", version)
const parsed = semver.parse(version);
const supportedPreleases = [
{ tag: "alpha", number: 1 },
{ tag: "beta", number: 2 },
{ tag: "rc", number: 3 },
];
const maybePrelease = semver.prerelease(version);
const maybeSupported = supportedPreleases.find(
(p) => p.tag === maybePrelease?.[0]
);
// If we have a prelease and it is in the supported range, then we can use it
if (maybePrelease && maybeSupported) {
version = `${parsed.major}.${parsed.minor}.${parsed.patch}-${
maybeSupported.number
}${maybePrelease[1] ?? 0}`;
}
if(maybePrelease && !maybeSupported) {
core.setFailed(`Unsupported prerelease: ${version}`)
}
core.info(`Version: ${version}`)
core.setOutput("package_version", version)
- name: Get Release
uses: actions/github-script@v6
id: get-release
with:
script: |
// Find the prerelease release in our repo that triggered this workflow
const refName = `${process.env.GITHUB_REF_NAME}`
const res = await github.rest.repos.listReleases({
owner: context.repo.owner,
repo: context.repo.repo,
per_page: 10,
})
const release = res.data.find((r) => r.tag_name === refName && r.prerelease)
if(!release) { core.setFailed("Unable to find prerelease for this workflow") }
core.setOutput("id", release.id)
build-app:
needs: create-release
if: startsWith(github.ref, 'refs/tags/v') == true
permissions:
contents: write
strategy:
fail-fast: false
matrix:
settings:
- host: macos-latest
target: x86_64-apple-darwin
os: darwin
arch: amd64
cli_only: false
- host: macos-latest
target: aarch64-apple-darwin
os: darwin
arch: arm64
cli_only: false
# The WIX version we use for the installer (latest 3.something) doesn't support arm builds - if we need to support arm windows,
# we'd need to switch the installer toolchain to WIX 4.xx, not sure how that works out with tauri
# - host: windows-latest
# target: aarch64-pc-windows-msvc
# arch: arm64
# cli-only: false
- host: windows-latest
target: x86_64-pc-windows-msvc
arch: amd64
cli_only: false
- host: ubuntu-22.04
target: x86_64-unknown-linux-gnu
os: linux
arch: amd64
cli_only: false
- host: ubuntu-22.04
target: aarch64-unknown-linux-gnu
os: linux
arch: arm64
cli_only: true
name: ${{ matrix.settings.target }}
runs-on: ${{ matrix.settings.host }}
env:
GO111MODULE: on
GOFLAGS: -mod=vendor
steps:
- name: Set git to use LF
run: |
git config --global core.autocrlf false
git config --global core.eol lf
- name: Checkout repository
uses: actions/checkout@v3
- name: Apply Version
if: matrix.settings.cli_only == false
run: yarn version --new-version ${{ needs.create-release.outputs.package_version }} --no-git-tag-version
working-directory: "./desktop"
- name: Setup System Dependencies
if: matrix.settings.host == 'ubuntu-22.04' && matrix.settings.cli_only == false
run: |
sudo apt-get update
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev libayatana-appindicator3-dev librsvg2-dev
- name: Rust setup
uses: dtolnay/rust-toolchain@stable
if: matrix.settings.cli_only == false
with:
targets: ${{ matrix.settings.target }}
- name: Rust cache
uses: swatinem/rust-cache@v2
if: matrix.settings.cli_only == false
with:
workspaces: "./desktop/src-tauri -> target"
- name: Go setup
uses: actions/setup-go@v2
with:
go-version: 1.21.8
- name: Build Sidecar CLI
if: matrix.settings.host != 'windows-latest'
run: |
BIN_NAME=devpod-cli-${{ matrix.settings.target }}
GOOS=${{ matrix.settings.os }} GOARCH=${{ matrix.settings.arch }} CGO_ENABLED=0 go build -ldflags "-s -w -X github.com/loft-sh/devpod/pkg/version.version="v${{ needs.create-release.outputs.original_package_version }}" -X github.com/loft-sh/devpod/pkg/telemetry.telemetryPrivateKey=${{ secrets.DEVPOD_TELEMETRY_PRIVATE_KEY }} -X github.com/loft-sh/devpod/pkg/devcontainer/crane.craneSigningKey="${{ secrets.CRANE_PRIVATE_KEY }}"" -o "test/$BIN_NAME"
cp "test/$BIN_NAME" "desktop/src-tauri/bin/$BIN_NAME"
ls desktop/src-tauri/bin
- name: Build Sidecar CLI
if: matrix.settings.host == 'windows-latest'
shell: cmd
run: |
set GOOS=windows
set GOARCH=${{ matrix.settings.arch }}
set BIN_NAME=devpod-cli-${{ matrix.settings.target }}.exe
go build -ldflags "-s -w -X github.com/loft-sh/devpod/pkg/version.version="v${{ needs.create-release.outputs.original_package_version }}" -X github.com/loft-sh/devpod/pkg/telemetry.telemetryPrivateKey=${{ secrets.DEVPOD_TELEMETRY_PRIVATE_KEY }}" -o "test\%BIN_NAME%"
xcopy /F /Y "test\%BIN_NAME%" desktop\src-tauri\bin\*
- name: Sync node version and setup cache
uses: actions/setup-node@v3
if: matrix.settings.cli_only == false
with:
node-version: "lts/*"
cache: "yarn"
cache-dependency-path: "./desktop/yarn.lock"
- name: Install frontend dependencies
if: matrix.settings.cli_only == false
run: yarn install
working-directory: "./desktop"
- name: Install additional ubuntu dependencies
if: matrix.settings.host == 'ubuntu-22.04'
run: |
sudo apt-get update
sudo apt-get install -y libwebkit2gtk-4.1-dev librsvg2-dev patchelf
- name: Build Desktop App
if: matrix.settings.host == 'ubuntu-22.04' && matrix.settings.cli_only == false
uses: tauri-apps/tauri-action@v0.5.15
with:
releaseId: ${{ needs.create-release.outputs.release_id }}
projectPath: "./desktop"
args: "--config src-tauri/tauri-flatpak.conf.json --target ${{ matrix.settings.target }} --bundles appimage,deb,updater"
includeUpdaterJson: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
# AppImage Signing:
SIGN: ${{ secrets.APP_IMAGE_SIGN }}
SIGN_KEY: ${{ secrets.APP_IMAGE_SIGN_KEY }}
APPIMAGETOOL_SIGN_PASSPHRASE: ${{ secrets.APP_IMAGE_SIGN_PASSPHRASE }}
- name: Build Desktop App
if: matrix.settings.host == 'macos-latest' && matrix.settings.cli_only == false
uses: tauri-apps/tauri-action@v0.5.15
with:
releaseId: ${{ needs.create-release.outputs.release_id }}
projectPath: "./desktop"
args: "--target ${{ matrix.settings.target }}"
includeUpdaterJson: true
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
# MacOS Signing:
ENABLE_CODE_SIGNING: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE: ${{ secrets.APPLE_CERTIFICATE }}
APPLE_CERTIFICATE_PASSWORD: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }}
APPLE_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }}
APPLE_TEAM_ID: ${{ secrets.APPLE_TEAM_ID }}
APPLE_ID: ${{ secrets.APPLE_ID }}
APPLE_PASSWORD: ${{ secrets.APPLE_PASSWORD }}
CI: false # https://github.com/tauri-apps/tauri-action/issues/740
- name: Build linux tar.gz
if: matrix.settings.host == 'ubuntu-22.04' && matrix.settings.cli_only == false
id: build-desktop-targz
run: |
cd ./desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/appimage/DevPod.AppDir || exit 1
tar --exclude=usr/bin/xdg-open --exclude=usr/lib --exclude=usr/share/doc --exclude=usr/share/glib-2.0 -zcvf DevPod-desktop.tar.gz usr
mv DevPod-desktop.tar.gz ../../DevPod-${{needs.create-release.outputs.package_version}}.tar.gz
- name: Prepare Windows Signing Tool
if: matrix.settings.host == 'windows-latest' && matrix.settings.cli_only == false
run: |
$destination_path = "$Env:USERPROFILE\code-signing"
$download_url = "$Env:CODESIGNTOOL_DOWNLOAD_URL"
# Create the directory if it doesn't exist
New-Item -ItemType Directory -Force -Path $destination_path | Out-Null
Write-Output "Starting to download CodeSignTool from $download_url"
Invoke-WebRequest -Uri $download_url -OutFile codesigntool.zip
Write-Output "Unzipping codesigntool.zip to $destination_path"
Expand-Archive "codesigntool.zip" -DestinationPath $destination_path
Add-Content -Path $env:GITHUB_PATH -Value $destination_path
# This is requried in addition to setting the PATH because of how CodeSignTool wrote their batch script
"CODE_SIGN_TOOL_PATH=$destination_path" | Out-File -FilePath $env:GITHUB_ENV -Append
env:
CODESIGNTOOL_DOWNLOAD_URL: ${{ vars.CODESIGNTOOL_DOWNLOAD_URL }}
- name: Print Signing Tool Version
if: matrix.settings.host == 'windows-latest' && matrix.settings.cli_only == false
run: |
Write-Output "Attempting to get CodeSignTool version"
CodeSignTool.bat --version
- name: Build Desktop App
if: matrix.settings.host == 'windows-latest' && matrix.settings.cli_only == false
id: build-desktop-app
uses: tauri-apps/tauri-action@v0.5.15
with:
projectPath: "./desktop"
args: " --target ${{ matrix.settings.target }}"
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TAURI_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_SIGNING_PRIVATE_KEY: ${{ secrets.TAURI_PRIVATE_KEY }}
TAURI_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
TAURI_SIGNING_PRIVATE_KEY_PASSWORD: ${{ secrets.TAURI_KEY_PASSWORD }}
CODESIGNTOOL_USERNAME: ${{ secrets.CODESIGNTOOL_USERNAME }}
CODESIGNTOOL_PASSWORD: ${{ secrets.CODESIGNTOOL_PASSWORD }}
CODESIGNTOOL_TOTP_SECRET: ${{ secrets.CODESIGNTOOL_TOTP_SECRET }}
CODESIGNTOOL_CREDENTIAL_ID: ${{ secrets.CODESIGNTOOL_CREDENTIAL_ID }}
- name: Sign Windows Sidecar Binary
if: matrix.settings.host == 'windows-latest'
shell: powershell
env:
CODESIGNTOOL_USERNAME: ${{ secrets.CODESIGNTOOL_USERNAME }}
CODESIGNTOOL_PASSWORD: ${{ secrets.CODESIGNTOOL_PASSWORD }}
CODESIGNTOOL_TOTP_SECRET: ${{ secrets.CODESIGNTOOL_TOTP_SECRET }}
CODESIGNTOOL_CREDENTIAL_ID: ${{ secrets.CODESIGNTOOL_CREDENTIAL_ID }}
run: |
$username = "$Env:CODESIGNTOOL_USERNAME"
$password = "$Env:CODESIGNTOOL_PASSWORD"
$totp_secret = "$Env:CODESIGNTOOL_TOTP_SECRET"
$credential_id = "$Env:CODESIGNTOOL_CREDENTIAL_ID"
$cli_input_file_path = "desktop\src-tauri\bin\devpod-cli-${{ matrix.settings.target }}.exe"
Write-Output "Signing files"
$cli_input_file_path = Resolve-Path "$cli_input_file_path" | select -ExpandProperty Path
CodeSignTool.bat sign -username="$username" -password="$password" -totp_secret="$totp_secret" -credential_id="$credential_id" -input_file_path="$cli_input_file_path" -override
- name: Upload Release Asset
if: matrix.settings.host == 'windows-latest'
uses: actions/github-script@v6
with:
script: |
const fs = require("fs")
const version = "${{ needs.create-release.outputs.package_version }}"
// prepare MSI vars
const msiName = `DevPod_${version}_x64_en-US.msi`
const msiPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/msi/${msiName}`
const msiZipName = `${msiName}.zip`
const msiZipPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/msi/${msiZipName}`
const msiZipSigName = `${msiName}.zip.sig`
const msiZipSigPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/msi/${msiZipSigName}`
// prepare NSIS vars
// the installer itself is suffixed with `.exe` but updater artifacts end with `.nsis.*`
const nsisName = `DevPod_${version}_x64-setup`
const nsisPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/nsis/${nsisName}.exe`
// Let's skip uploading the updater artifacts until we've figured out auto updating for both nsis and msi
// const nsisZipName = `${nsisName}.nsis.zip`
// const nsisZipPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/nsis/${nsisZipName}`
// const nsisZipSigName = `${nsisName}.nsis.zip.sig`
// const nsisZipSigPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/nsis/${nsisZipSigName}`
const cliName = "devpod-windows-${{ matrix.settings.arch }}.exe"
const cliPath = "desktop/src-tauri/bin/devpod-cli-${{ matrix.settings.target }}.exe"
const releaseId = "${{ needs.create-release.outputs.release_id }}"
const releaseAssets = [
{ name: cliName, path: cliPath },
{ name: msiName, path: msiPath },
{ name: msiZipName, path: msiZipPath },
{ name: msiZipSigName, path: msiZipSigPath },
{ name: `${nsisName}.exe`, path: nsisPath },
// { name: nsisZipName, path: nsisZipPath },
// { name: nsisZipSigName, path: nsisZipSigPath },
]
for (const asset of releaseAssets) {
console.log("Attempting to upload release asset: ", asset)
await github.rest.repos.uploadReleaseAsset({
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(asset.path).size
},
name: asset.name,
data: fs.readFileSync(asset.path),
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
})
}
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload CLI Asset
if: matrix.settings.host != 'windows-latest'
uses: actions/github-script@v6
with:
script: |
const fs = require("fs")
const releaseId = "${{ needs.create-release.outputs.release_id }}"
const assetName = "devpod-${{ matrix.settings.os }}-${{ matrix.settings.arch }}"
const assetPath = "desktop/src-tauri/bin/devpod-cli-${{ matrix.settings.target }}"
console.log("Attempting to upload release asset: ", assetName)
await github.rest.repos.uploadReleaseAsset({
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(assetPath).size
},
name: assetName,
data: fs.readFileSync(assetPath),
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
})
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload Tar.gz Asset
if: matrix.settings.host == 'ubuntu-22.04' && matrix.settings.cli_only == false
uses: actions/github-script@v6
with:
script: |
const fs = require("fs")
const releaseId = "${{ needs.create-release.outputs.release_id }}"
const assetName = "DevPod-${{needs.create-release.outputs.package_version}}.tar.gz"
const assetPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/${assetName}`
console.log("Attempting to upload release asset: ", assetName)
await github.rest.repos.uploadReleaseAsset({
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(assetPath).size
},
name: assetName,
data: fs.readFileSync(assetPath),
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
})
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Upload flatpak assets
if: matrix.settings.host == 'ubuntu-22.04' && matrix.settings.cli_only == false
uses: actions/github-script@v6
with:
script: |
const fs = require("fs")
const releaseId = "${{ needs.create-release.outputs.release_id }}"
const assetName = "DevPod.desktop"
const assetPath = `desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/deb/DevPod_${{needs.create-release.outputs.package_version}}_amd64/data/usr/share/applications/${assetName}`
console.log("Attempting to upload release asset: ", assetName)
await github.rest.repos.uploadReleaseAsset({
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(assetPath).size
},
name: assetName,
data: fs.readFileSync(assetPath),
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
})
const mdAssetName = "DevPod.metainfo.xml"
const mdAssetPath = `desktop/flatpak/${mdAssetName}`
console.log("Attempting to upload release asset: ", mdAssetName)
await github.rest.repos.uploadReleaseAsset({
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(mdAssetPath).size
},
name: mdAssetName,
data: fs.readFileSync(mdAssetPath),
owner: context.repo.owner,
repo: context.repo.repo,
release_id: releaseId
})
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
- name: Generate updated flatpak manifest
if: matrix.settings.host == 'ubuntu-22.04' && matrix.settings.cli_only == false
run: |
export VERSION="${{needs.create-release.outputs.package_version}}"
export debPath="desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/deb/DevPod_${{needs.create-release.outputs.package_version}}_amd64.deb"
export desktopPath="desktop/src-tauri/target/${{ matrix.settings.target }}/release/bundle/deb/DevPod_${{needs.create-release.outputs.package_version}}_amd64/data/usr/share/applications/${assetName}/DevPod.desktop"
export metaPath="desktop/flatpak/DevPod.metainfo.xml"
export SHA256=$(sha256sum "${debPath}" | cut -f1 -d ' ')
export DESKTOP_SHA256=$(sha256sum "${desktopPath}" | cut -f1 -d ' ')
export META_SHA256=$(sha256sum "${metaPath}" | cut -f1 -d ' ')
envsubst < desktop/flatpak/sh.loft.devpod.tmpl > desktop/flatpak/sh.loft.devpod.yaml
# - name: Updates flatpak manifest in flathub
# uses: dmnemec/copy_file_to_another_repo_action@master
# env:
# API_TOKEN_GITHUB: ${{ secrets.API_TOKEN_GITHUB }}
# with:
# source_file: 'desktop/flatpak/sh.loft.DevPod.yaml'
# destination_repo: 'flathub/sh.loft.DevPod'
# destination_folder: ''
# user_email: 'bot@loft.sh'
# user_name: 'loftbot'
# commit_message: 'Update flatpak manifest with latest release'
publish-updates:
needs: [build-app, create-release]
if: startsWith(github.ref, 'refs/tags/v') == true
permissions:
contents: write
runs-on: ubuntu-22.04
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Release pro provider
run: |
set -e
VERSION="v${{ needs.create-release.outputs.original_package_version }}"
OUT_DIR="release"
ASSETS="devpod-darwin-amd64 devpod-darwin-arm64 devpod-linux-amd64 devpod-linux-arm64 devpod-windows-amd64.exe"
echo "Prepare output directory $OUT_DIR..."
if [ ! -d "$OUT_DIR" ]; then
mkdir "$OUT_DIR"
else
rm -rf $OUT_DIR
fi
printf "Done\n\n"
echo "Download release assets into $OUT_DIR..."
for asset in $ASSETS; do
printf "\t$asset\n"
gh release download $VERSION --pattern="$asset" --dir="$OUT_DIR"
printf "\tDone\n"
done
printf "Done\n\n"
echo "Generate provider.yaml..."
go run ./hack/pro/main.go $VERSION > ./release/provider.yaml
printf "Done\n\n"
echo "Upload provider.yaml..."
gh release upload $VERSION ./release/provider.yaml --clobber
printf "Done\n\n"
env:
GH_TOKEN: ${{ github.token }}
- name: Update `latest.json`
uses: actions/github-script@v6
with:
retries: 2
retry-exempt-status-codes: 400,401,403
script: |
// At this point, we should have `linux-x86_64`, `darwin-aarch64` and `darwin-x86_64`.
// We need to add the missing platform/arch combinations by hand
const fs = require("fs")
async function fetchAsset(assetID) {
const releaseAsset = await github.rest.repos.getReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: assetID,
headers: { accept: "application/octet-stream" }
})
const res = await fetch(releaseAsset.url, { headers: { accept: "application/octet-stream" } })
if (!res.ok) { core.setFailed(`${await res.text()}`) }
return res
}
const releaseId = "${{ needs.create-release.outputs.release_id }}"
const releaseArgs = { owner: context.repo.owner, repo: context.repo.repo, release_id: releaseId }
const release = await github.rest.repos.getRelease({ ...releaseArgs })
const latestAsset = release.data.assets.find(a => a.name === "latest.json")
core.info(`Downloading ${latestAsset.name} (ID: ${latestAsset.id})`)
const latestRes = await fetchAsset(latestAsset.id)
const latest = await latestRes.json()
const version = latest.version
const infos = [
{ target: "linux-x86_64", sigFile: ".AppImage.tar.gz.sig", packageType: ".tar.gz", originalAssetName: `DevPod_${version}_amd64.AppImage`, desiredAssetName: "DevPod_linux_amd64.AppImage" },
{ target: "darwin-aarch64", sigFile: "aarch64.app.tar.gz.sig", packageType: ".tar.gz", originalAssetName: `DevPod_${version}_aarch64.dmg`, desiredAssetName: "DevPod_macos_aarch64.dmg", originalUpdaterAssetName: "DevPod_aarch64.app.tar.gz", desiredUpdaterAssetName: "DevPod_macos_aarch64.app.tar.gz" },
{ target: "darwin-x86_64", sigFile: "x64.app.tar.gz.sig", packageType: ".tar.gz", originalAssetName: `DevPod_${version}_x64.dmg`, desiredAssetName: "DevPod_macos_x64.dmg", originalUpdaterAssetName: "DevPod_x64.app.tar.gz", desiredUpdaterAssetName: "DevPod_macos_x64.app.tar.gz" },
{ target: "windows-x86_64", sigFile: ".msi.zip.sig", packageType: ".zip", originalAssetName: `DevPod_${version}_x64_en-US.msi`, desiredAssetName: "DevPod_windows_x64_en-US.msi" },
{ originalAssetName: `DevPod-${version}.tar.gz`, desiredAssetName: "DevPod_linux_x86_64.tar.gz" },
]
for (const info of infos) {
// Update latest.json for platform
if (info.target) {
core.info(`Generating update info for ${info.desiredAssetName}`)
const sigAsset = release.data.assets.find(a => a.name.endsWith(info.sigFile))
if (!sigAsset) {
core.warning(`Unable to find sig asset: ${info.sigFile}`)
continue
}
core.info(`Downloading ${sigAsset.name} (ID: ${sigAsset.id})`)
const sig = await fetchAsset(sigAsset.id)
let assetName = `${info.desiredAssetName}${info.packageType}`
if (info.desiredUpdaterAssetName) {
assetName = info.desiredUpdaterAssetName
}
latest.platforms[info.target] = {
signature: await sig.text(),
url: `https://github.com/loft-sh/devpod/releases/download/${process.env.GITHUB_REF_NAME}/${assetName}`,
}
// once we're done with the sig file, delete it
await github.rest.repos.deleteReleaseAsset({
...releaseArgs,
asset_id: sigAsset.id
})
}
const a = release.data.assets.find(a => a.name === info.originalAssetName)
if (!a) {
core.warning(`Unable to find asset: ${info.originalAssetName}`)
continue
}
const assetID = a.id
// Update the asset name
await github.rest.repos.updateReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: assetID,
name: info.desiredAssetName
})
if (info.packageType) {
let name = `${info.originalAssetName}${info.packageType}`
if (info.originalUpdaterAssetName) {
name = info.originalUpdaterAssetName
}
const b = release.data.assets.find(a => a.name === name)
if (!b) {
core.warning(`Unable to find update asset: ${name}`)
continue
}
let desiredName = `${info.desiredAssetName}${info.packageType}`
if (info.desiredUpdaterAssetName) {
desiredName = info.desiredUpdaterAssetName
}
const assetID = b.id
// Update the asset name
await github.rest.repos.updateReleaseAsset({
owner: context.repo.owner,
repo: context.repo.repo,
asset_id: assetID,
name: desiredName
})
}
}
const latestJSON = JSON.stringify(latest)
const latestDestPath = "desktop/latest.json"
core.info(`Writing latest.json to disk (${latestDestPath}): ${latestJSON}`)
fs.writeFileSync(latestDestPath, latestJSON)
// Attempting to upload a previously released asset results in an error so we need to clean up before
if (latestAsset) {
await github.rest.repos.deleteReleaseAsset({
...releaseArgs,
asset_id: latestAsset.id
})
}
await github.rest.repos.uploadReleaseAsset({
...releaseArgs,
headers: {
"content-type": "application/zip",
"content-length": fs.statSync(latestDestPath).size
},
name: "latest.json",
data: fs.readFileSync(latestDestPath),
})
================================================
FILE: .github/workflows/stale.yaml
================================================
name: Close inactive issues
on:
schedule:
- cron: "30 1 * * *"
jobs:
close-issues:
runs-on: ubuntu-latest
permissions:
issues: write
pull-requests: write
steps:
- uses: actions/stale@v5
with:
operations-per-run: 60
days-before-issue-stale: 60
days-before-issue-close: 30
stale-issue-label: stale
stale-issue-message: |
This issue is stale because it has been open for 60 days with no activity.
It will be closed in 30 days on inactivity.
close-issue-message: |
This issue was closed because it has been inactive for 30 days since being marked as stale.
days-before-pr-stale: -1
days-before-pr-close: -1
repo-token: ${{ secrets.GITHUB_TOKEN }}
exempt-all-assignees: true
exempt-issue-labels: >-
in-progress,
assigned,
kind/bug,
kind/enhancement
================================================
FILE: .github/workflows/ui-ci.yaml
================================================
name: UI CI
on:
workflow_dispatch: {}
pull_request:
branches:
- main
- release-*
paths:
- desktop/
jobs:
check:
runs-on: ubuntu-latest
defaults:
run:
working-directory: ./desktop
steps:
- name: checkout
uses: actions/checkout@v4
- name: setup node
uses: actions/setup-node@v4
with:
node-version: "20"
- name: install dependencies
run: yarn install --frozen-lockfile
- name: lint
run: yarn lint:ci
- name: check format
run: yarn format:check
- name: check types
run: yarn types:check
# This only builds the frontend assets, not the full DevPod Desktop app to make it quicker
- name: build
run: yarn build
================================================
FILE: .github/workflows/unit-tests.yaml
================================================
name: Unit tests
on:
workflow_dispatch: {}
pull_request:
types:
- opened
- reopened
- synchronize
- edited
branches:
- main
paths:
- "**.go"
- "hack/unit-tests.sh"
- ".github/workflows/unit-tests.yaml"
- "!/docs/**"
# make sure the pipeline is only running once
concurrency:
group: unit-${{ github.head_ref || github.ref_name }}
cancel-in-progress: true
jobs:
unit-tests:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Set up Go
uses: actions/setup-go@v3
with:
go-version: 1.21.8
- name: Test
run: ./hack/unit-tests.sh
================================================
FILE: .gitignore
================================================
/.idea
.DS_Store
/test
/e2e/bin
/devpod
/devpod.exe
/devpod-cli
# Unit test targets
/main
/profile.out
/package-lock.json
/tags
================================================
FILE: .golangci.yaml
================================================
linters:
# We want to gradually introduce new linters to the project
disable-all: true
enable:
- asasalint
- asciicheck
- bidichk
- decorder
- durationcheck
- errcheck
- errname
- errorlint
- exhaustive
- exportloopref
- ginkgolinter
- gocheckcompilerdirectives
- goimports
- gosimple
- govet
- grouper
- importas
- ineffassign
- makezero
- misspell
- nakedret
- promlinter
- staticcheck
- stylecheck
- typecheck
- tagalign
- unconvert
- unused
- whitespace
# - dupl
# - cyclop
# - funlen
linters-settings:
stylecheck:
checks: ["*", "-ST1003"]
exhaustive:
check:
- switch
- map
ignore-enum-types: "ResourceName|FileMode|ProgrammingLanguage"
# - cyclop
# - funlen
issues:
# Maximum issues count per one linter. Set to 0 to disable. Default is 50.
max-issues-per-linter: 0
# Maximum count of issues with the same text. Set to 0 to disable. Default is 3.
max-same-issues: 0
================================================
FILE: .vscode/launch.json
================================================
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "${workspaceRoot}",
"args": "up examples/simple",
}
]
}
================================================
FILE: .vscode/settings.json
================================================
{
"cSpell.words": [
"devpod",
"perrors"
],
"[mdx]": {
"editor.wordWrap": "on"
},
"rust-analyzer.linkedProjects": ["./desktop/src-tauri/Cargo.toml"],
}
================================================
FILE: COMMUNITY.md
================================================
# Community Calls
This repository contains the maintainer community calls from the DevPod Community. Join us on [Slack](https://slack.loft.sh/) if you have feedback, want to ask questions, or see something covered in the maintainers meeting. The complete Playlist is on [YouTube](https://youtube.com/playlist?list=PL8MSvTvMDqe5hZFjZX9lw1Ecq2xwWivp7&feature=shared).
- [DevPod Maintainers Meeting : 03/07/2024](https://www.youtube.com/live/pYtQtQh6Zp4?si=DPqTYE1JfewMCBdm)
- [DevPod Maintainers Meeting : 02/29/2024](https://www.youtube.com/live/btYC7VpJZws?si=nDBcMk2GDnI5Xtyo)
- [DevPod Maintainers Meeting : 02/22/2024](https://youtu.be/2NmGUsj7LFw?feature=shared)
- [DevPod Maintainers Meeting : 02/19/2024](https://youtu.be/-1EqOf8A-7c?feature=shared)
Feel free to explore past discussions and catch up on what you might have missed.
## Reporting An Incident
Please email hrittik@loft.sh to initiate an incident report. **Please do not make reports via our public slack channel.**
================================================
FILE: CONTRIBUTING.md
================================================
# Development
## Development Setup
1. Clone the repository locally
2. If you want to change something in DevPod agent code:
1. Exchange the URL in [DefaultAgentDownloadURL](./pkg/agent/agent.go) with a
custom public repository release you have created.
2. Build devpod via: `./hack/rebuild.sh`
3. Upload `test/devpod-linux-amd64` and `test/devpod-linux-arm64` to the public
repository release assets.
3. Build devpod via: `./hack/rebuild.sh` (asking for sudo password)
4. Add docker provider via `devpod provider add docker`
5. Configure docker provider via `devpod use provider docker`
6. Start devpod in vscode with `devpod up examples/simple`
## Build from source
Prerequisites CLI:
- [Go 1.20](https://go.dev/doc/install)
Once installed, run
`CGO_ENABLED=0 go build -ldflags "-s -w" -o devpod-cli`
Prerequisites GUI:
- [NodeJS + yarn](https://nodejs.org/en/)
- [Rust](https://www.rust-lang.org/tools/install)
- [Go](https://go.dev/doc/install)
To build the app on Linux, you will need the following dependencies:
```bash
sudo apt-get install libappindicator3-1 libgdk-pixbuf2.0-0 libbsd0 libxdmcp6 \
libwmf-0.2-7 libwmf-0.2-7-gtk libgtk-3-0 libwmf-dev libwebkit2gtk-4.0-37 \
librust-openssl-sys-dev librust-glib-sys-dev
sudo apt-get install -y libgtk-3-dev libwebkit2gtk-4.0-dev \
libayatana-appindicator3-dev librsvg2-dev
```
Once installed, run
- `cd desktop`
- `yarn tauri build --config src-tauri/tauri-dev.conf.json`
The application should be in `desktop/src-tauri/target/release`
## Provider
Head over to [the docs](https://devpod.sh/docs/developing-providers/quickstart)
for an introduction into developing your own providers
### Publish your provider
Once you're provider is ready, update
- `community.yaml`
- `docs/pages/managing-providers/add-provider.mdx`
to get your provider featured both in the documentation and the UI
## Deeplinks
DevPod Desktop can handle deep links to perform various actions, like opening or
importing workspaces.
The scheme is:
protocol: `devpod://`
host: `command`
searchParams: `foo=bar&fizz=buzz`
resulting in a full url string of `devpod://command?foo=bar&fizz=buzz`. For more
information, take a look at the indvidual command sections below.
### Open Workspace
Open a workspace based on a workspace source. Similar to `devpod up`, but shareable
host: `open`
searchParams: `source` (required), `workspace`, `provider`, `ide`
`devpod://open?source=your-url-encoded-source&workspace=my-workspace&provider=docker&ide=vscode`
### Import Workspace
Import a remote DevPod.Pro workspace into your local client
host: `import`
searchParams: `workspace_id` (required), `workspace_uid` (required),
`devpod_pro_host` (required), `options`
================================================
FILE: LICENSE
================================================
Mozilla Public License Version 2.0
==================================
1. Definitions
--------------
1.1. "Contributor"
means each individual or legal entity that creates, contributes to
the creation of, or owns Covered Software.
1.2. "Contributor Version"
means the combination of the Contributions of others (if any) used
by a Contributor and that particular Contributor's Contribution.
1.3. "Contribution"
means Covered Software of a particular Contributor.
1.4. "Covered Software"
means Source Code Form to which the initial Contributor has attached
the notice in Exhibit A, the Executable Form of such Source Code
Form, and Modifications of such Source Code Form, in each case
including portions thereof.
1.5. "Incompatible With Secondary Licenses"
means
(a) that the initial Contributor has attached the notice described
in Exhibit B to the Covered Software; or
(b) that the Covered Software was made available under the terms of
version 1.1 or earlier of the License, but not also under the
terms of a Secondary License.
1.6. "Executable Form"
means any form of the work other than Source Code Form.
1.7. "Larger Work"
means a work that combines Covered Software with other material, in
a separate file or files, that is not Covered Software.
1.8. "License"
means this document.
1.9. "Licensable"
means having the right to grant, to the maximum extent possible,
whether at the time of the initial grant or subsequently, any and
all of the rights conveyed by this License.
1.10. "Modifications"
means any of the following:
(a) any file in Source Code Form that results from an addition to,
deletion from, or modification of the contents of Covered
Software; or
(b) any new file in Source Code Form that contains any Covered
Software.
1.11. "Patent Claims" of a Contributor
means any patent claim(s), including without limitation, method,
process, and apparatus claims, in any patent Licensable by such
Contributor that would be infringed, but for the grant of the
License, by the making, using, selling, offering for sale, having
made, import, or transfer of either its Contributions or its
Contributor Version.
1.12. "Secondary License"
means either the GNU General Public License, Version 2.0, the GNU
Lesser General Public License, Version 2.1, the GNU Affero General
Public License, Version 3.0, or any later versions of those
licenses.
1.13. "Source Code Form"
means the form of the work preferred for making modifications.
1.14. "You" (or "Your")
means an individual or a legal entity exercising rights under this
License. For legal entities, "You" includes any entity that
controls, is controlled by, or is under common control with You. For
purposes of this definition, "control" means (a) the power, direct
or indirect, to cause the direction or management of such entity,
whether by contract or otherwise, or (b) ownership of more than
fifty percent (50%) of the outstanding shares or beneficial
ownership of such entity.
2. License Grants and Conditions
--------------------------------
2.1. Grants
Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:
(a) under intellectual property rights (other than patent or trademark)
Licensable by such Contributor to use, reproduce, make available,
modify, display, perform, distribute, and otherwise exploit its
Contributions, either on an unmodified basis, with Modifications, or
as part of a Larger Work; and
(b) under Patent Claims of such Contributor to make, use, sell, offer
for sale, have made, import, and otherwise transfer either its
Contributions or its Contributor Version.
2.2. Effective Date
The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.
2.3. Limitations on Grant Scope
The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:
(a) for any code that a Contributor has removed from Covered Software;
or
(b) for infringements caused by: (i) Your and any other third party's
modifications of Covered Software, or (ii) the combination of its
Contributions with other software (except as part of its Contributor
Version); or
(c) under Patent Claims infringed by Covered Software in the absence of
its Contributions.
This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).
2.4. Subsequent Licenses
No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).
2.5. Representation
Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.
2.6. Fair Use
This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.
2.7. Conditions
Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.
3. Responsibilities
-------------------
3.1. Distribution of Source Form
All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.
3.2. Distribution of Executable Form
If You distribute Covered Software in Executable Form then:
(a) such Covered Software must also be made available in Source Code
Form, as described in Section 3.1, and You must inform recipients of
the Executable Form how they can obtain a copy of such Source Code
Form by reasonable means in a timely manner, at a charge no more
than the cost of distribution to the recipient; and
(b) You may distribute such Executable Form under the terms of this
License, or sublicense it under different terms, provided that the
license for the Executable Form does not attempt to limit or alter
the recipients' rights in the Source Code Form under this License.
3.3. Distribution of a Larger Work
You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).
3.4. Notices
You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.
3.5. Application of Additional Terms
You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.
4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------
If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.
5. Termination
--------------
5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.
5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.
5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.
************************************************************************
* *
* 6. Disclaimer of Warranty *
* ------------------------- *
* *
* Covered Software is provided under this License on an "as is" *
* basis, without warranty of any kind, either expressed, implied, or *
* statutory, including, without limitation, warranties that the *
* Covered Software is free of defects, merchantable, fit for a *
* particular purpose or non-infringing. The entire risk as to the *
* quality and performance of the Covered Software is with You. *
* Should any Covered Software prove defective in any respect, You *
* (not any Contributor) assume the cost of any necessary servicing, *
* repair, or correction. This disclaimer of warranty constitutes an *
* essential part of this License. No use of any Covered Software is *
* authorized under this License except under this disclaimer. *
* *
************************************************************************
************************************************************************
* *
* 7. Limitation of Liability *
* -------------------------- *
* *
* Under no circumstances and under no legal theory, whether tort *
* (including negligence), contract, or otherwise, shall any *
* Contributor, or anyone who distributes Covered Software as *
* permitted above, be liable to You for any direct, indirect, *
* special, incidental, or consequential damages of any character *
* including, without limitation, damages for lost profits, loss of *
* goodwill, work stoppage, computer failure or malfunction, or any *
* and all other commercial damages or losses, even if such party *
* shall have been informed of the possibility of such damages. This *
* limitation of liability shall not apply to liability for death or *
* personal injury resulting from such party's negligence to the *
* extent applicable law prohibits such limitation. Some *
* jurisdictions do not allow the exclusion or limitation of *
* incidental or consequential damages, so this exclusion and *
* limitation may not apply to You. *
* *
************************************************************************
8. Litigation
-------------
Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.
9. Miscellaneous
----------------
This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.
10. Versions of the License
---------------------------
10.1. New Versions
Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.
10.2. Effect of New Versions
You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.
10.3. Modified Versions
If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).
10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses
If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.
Exhibit A - Source Code Form License Notice
-------------------------------------------
This Source Code Form is subject to the terms of the Mozilla Public
License, v. 2.0. If a copy of the MPL was not distributed with this
file, You can obtain one at http://mozilla.org/MPL/2.0/.
If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.
You may add additional accurate notices of copyright ownership.
Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------
This Source Code Form is "Incompatible With Secondary Licenses", as
defined by the Mozilla Public License, v. 2.0.
================================================
FILE: Makefile
================================================
GOOS := $(shell go env GOOS)
GOARCH := $(shell go env GOARCH)
SKIP_INSTALL := false
# Platform host
PLATFORM_HOST := localhost:8080
# Build the CLI and Desktop
.PHONY: build
build:
SKIP_INSTALL=$(SKIP_INSTALL) BUILD_PLATFORMS=$(GOOS) BUILD_ARCHS=$(GOARCH) ./hack/rebuild.sh
# Run the desktop app
.PHONY: run-desktop
run-desktop: build
cd desktop && yarn desktop:dev:debug
# Run the daemon against loft host
.PHONY: run-daemon
run-daemon: build
devpod pro daemon start --host $(PLATFORM_HOST)
# Namespace to use for the platform
NAMESPACE := loft
# Copy the devpod binary to the platform pod
.PHONY: cp-to-platform
cp-to-platform:
SKIP_INSTALL=true BUILD_PLATFORMS=linux BUILD_ARCHS=$(GOARCH) ./hack/rebuild.sh
POD=$$(kubectl get pod -n $(NAMESPACE) -l app=loft,release=loft -o jsonpath='{.items[0].metadata.name}'); \
echo "Copying ./test/devpod-linux-$(GOARCH) to pod $$POD"; \
kubectl cp -n $(NAMESPACE) ./test/devpod-linux-$(GOARCH) $$POD:/usr/local/bin/devpod
================================================
FILE: README.md
================================================
<br>
<a href="https://www.devpod.sh">
<picture width="500">
<source media="(prefers-color-scheme: dark)" srcset="docs/static/media/devpod_dark.png">
<img alt="DevPod wordmark" width="500" src="docs/static/media/devpod.png">
</picture>
</a>
### **[Website](https://www.devpod.sh)** • **[Quickstart](https://www.devpod.sh/docs/getting-started/install)** • **[Documentation](https://www.devpod.sh/docs/what-is-devpod)** • **[Blog](https://loft.sh/blog)** • **[𝕏 (Twitter)](https://x.com/loft_sh)** • **[Slack](https://slack.loft.sh/)**
[](https://slack.loft.sh/) [](https://devpod.sh/open#https://github.com/loft-sh/devpod)
**[We are hiring!](https://www.loft.sh/careers) Come build the future of remote development environments with us.**
DevPod is a client-only tool to create reproducible developer environments based on a [devcontainer.json](https://containers.dev/) on any backend. Each developer environment runs in a container and is specified through a [devcontainer.json](https://containers.dev/). Through DevPod providers, these environments can be created on any backend, such as the local computer, a Kubernetes cluster, any reachable remote machine, or in a VM in the cloud.

You can think of DevPod as the glue that connects your local IDE to a machine where you want to develop. So depending on the requirements of your project, you can either create a workspace locally on the computer, on a beefy cloud machine with many GPUs, or a spare remote computer. Within DevPod, every workspace is managed the same way, which also makes it easy to switch between workspaces that might be hosted somewhere else.

## Quickstart
Download DevPod Desktop:
- [MacOS Silicon/ARM](https://github.com/loft-sh/devpod/releases/latest/download/DevPod_macos_aarch64.dmg)
- [MacOS Intel/AMD](https://github.com/loft-sh/devpod/releases/latest/download/DevPod_macos_x64.dmg)
- [Windows](https://github.com/loft-sh/devpod/releases/latest/download/DevPod_windows_x64_en-US.msi)
- [Linux AppImage](https://github.com/loft-sh/devpod/releases/latest/download/DevPod_linux_amd64.AppImage)
Take a look at the [DevPod Docs](https://devpod.sh/docs/getting-started/install) for more information.
## Why DevPod?
DevPod reuses the open [DevContainer standard](https://containers.dev/) (used by GitHub Codespaces and VSCode DevContainers) to create a consistent developer experience no matter what backend you want to use.
Compared to hosted services such as Github Codespaces, JetBrains Spaces, or Google Cloud Workstations, DevPod has the following advantages:
* **Cost savings**: DevPod is usually around 5-10 times cheaper than existing services with comparable feature sets because it uses bare virtual machines in any cloud and shuts down unused virtual machines automatically.
* **No vendor lock-in**: Choose whatever cloud provider suits you best, be it the cheapest one or the most powerful, DevPod supports all cloud providers. If you are tired of using a provider, change it with a single command.
* **Local development**: You get the same developer experience also locally, so you don't need to rely on a cloud provider at all.
* **Cross IDE support**: VSCode and the full JetBrains suite is supported, all others can be connected through simple ssh.
* **Client-only**: No need to install a server backend, DevPod runs only on your computer.
* **Open-Source**: DevPod is 100% open-source and extensible. A provider doesn't exist? Just create your own.
* **Rich feature set**: DevPod already supports prebuilds, auto inactivity shutdown, git & docker credentials sync, and many more features to come.
* **Desktop App**: DevPod comes with an easy-to-use desktop application that abstracts all the complexity away. If you want to build your own integration, DevPod offers a feature-rich CLI as well.
================================================
FILE: SECURITY.md
================================================
# Security Policy
We will disclose fixes for vulnerabilities in the release notes and urge you to upgrade once a new release is published.
For upgrading guidelines, see [our official Upgrading Guideline](https://devpod.sh/docs/getting-started/update).
**To receive update warnings in the CLI (as part of the terminal output whenever you run a command), you must use an official release binary as published on the [GitHub releases page](https://github.com/loft-sh/devpod/releases) of this project.**
See the [install instructions for DevPod](https://devpod.sh/docs/getting-started/install) for the recommended methods of downloading an official release binary for your platform. Community maintained release binaries may **not** contain the version number and will therefore not be able to perform a version check.
## Reporting a Vulnerability
Please report vulnerabilities to: [security@loft.sh](mailto:security@loft.sh)
================================================
FILE: cmd/agent/agent.go
================================================
package agent
import (
"os"
"github.com/loft-sh/devpod/cmd/agent/container"
"github.com/loft-sh/devpod/cmd/agent/workspace"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/client/clientimplementation"
"github.com/loft-sh/devpod/pkg/config"
"github.com/loft-sh/devpod/pkg/envfile"
"github.com/loft-sh/log"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var AgentExecutedAnnotation = "loft.sh/agent-executed"
// NewAgentCmd returns a new root command
func NewAgentCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
agentCmd := &cobra.Command{
Use: "agent",
Short: "DevPod Agent",
PersistentPreRunE: func(cobraCmd *cobra.Command, args []string) error {
return AgentPersistentPreRunE(cobraCmd, args, globalFlags)
},
Hidden: true,
}
agentCmd.AddCommand(workspace.NewWorkspaceCmd(globalFlags))
agentCmd.AddCommand(container.NewContainerCmd(globalFlags))
agentCmd.AddCommand(NewDaemonCmd(globalFlags))
agentCmd.AddCommand(NewContainerTunnelCmd(globalFlags))
agentCmd.AddCommand(NewGitCredentialsCmd(globalFlags))
agentCmd.AddCommand(NewGitSSHSignatureCmd(globalFlags))
agentCmd.AddCommand(NewGitSSHSignatureHelperCmd(globalFlags))
agentCmd.AddCommand(NewDockerCredentialsCmd(globalFlags))
return agentCmd
}
func AgentPersistentPreRunE(cobraCmd *cobra.Command, args []string, globalFlags *flags.GlobalFlags) error {
// get top level parent
parent := cobraCmd
for parent.Parent() != nil {
parent = parent.Parent()
}
if parent.Annotations == nil {
parent.Annotations = map[string]string{}
}
parent.Annotations[AgentExecutedAnnotation] = "true"
if globalFlags.LogOutput == "json" {
log.Default.SetFormat(log.JSONFormat)
} else {
log.Default.MakeRaw()
}
if globalFlags.Silent {
log.Default.SetLevel(logrus.FatalLevel)
} else if globalFlags.Debug {
log.Default.SetLevel(logrus.DebugLevel)
} else if os.Getenv(clientimplementation.DevPodDebug) == "true" {
log.Default.SetLevel(logrus.DebugLevel)
}
if globalFlags.DevPodHome != "" {
_ = os.Setenv(config.DEVPOD_HOME, globalFlags.DevPodHome)
}
// apply environment
envfile.Apply(log.Default.ErrorStreamOnly())
return nil
}
================================================
FILE: cmd/agent/container/container.go
================================================
package container
import (
"github.com/loft-sh/devpod/cmd/flags"
"github.com/spf13/cobra"
)
// NewContainerCmd returns a new command
func NewContainerCmd(flags *flags.GlobalFlags) *cobra.Command {
containerCmd := &cobra.Command{
Use: "container",
Short: "Container commands",
}
containerCmd.AddCommand(NewSetupContainerCmd(flags))
containerCmd.AddCommand(NewDaemonCmd())
containerCmd.AddCommand(NewVSCodeAsyncCmd())
containerCmd.AddCommand(NewOpenVSCodeAsyncCmd())
containerCmd.AddCommand(NewCredentialsServerCmd(flags))
containerCmd.AddCommand(NewSetupLoftPlatformAccessCmd(flags))
containerCmd.AddCommand(NewSSHServerCmd(flags))
return containerCmd
}
================================================
FILE: cmd/agent/container/credentials_server.go
================================================
package container
import (
"context"
"encoding/base64"
"encoding/json"
"fmt"
"net"
"os"
"strconv"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent/tunnel"
"github.com/loft-sh/devpod/pkg/agent/tunnelserver"
"github.com/loft-sh/devpod/pkg/credentials"
"github.com/loft-sh/devpod/pkg/dockercredentials"
"github.com/loft-sh/devpod/pkg/gitcredentials"
"github.com/loft-sh/devpod/pkg/gitsshsigning"
"github.com/loft-sh/devpod/pkg/netstat"
portpkg "github.com/loft-sh/devpod/pkg/port"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
const ExitCodeIO int = 64
// CredentialsServerCmd holds the cmd flags
type CredentialsServerCmd struct {
*flags.GlobalFlags
User string
ConfigureGitHelper bool
ConfigureDockerHelper bool
ForwardPorts bool
GitUserSigningKey string
}
// NewCredentialsServerCmd creates a new command
func NewCredentialsServerCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &CredentialsServerCmd{
GlobalFlags: flags,
}
credentialsServerCmd := &cobra.Command{
Use: "credentials-server",
Short: "Starts a credentials server",
Args: cobra.NoArgs,
RunE: func(c *cobra.Command, args []string) error {
port, err := credentials.GetPort()
if err != nil {
return err
}
return cmd.Run(c.Context(), port)
},
}
credentialsServerCmd.Flags().BoolVar(&cmd.ConfigureGitHelper, "configure-git-helper", false, "If true will configure git helper")
credentialsServerCmd.Flags().BoolVar(&cmd.ConfigureDockerHelper, "configure-docker-helper", false, "If true will configure docker helper")
credentialsServerCmd.Flags().BoolVar(&cmd.ForwardPorts, "forward-ports", false, "If true will automatically try to forward open ports within the container")
credentialsServerCmd.Flags().StringVar(&cmd.GitUserSigningKey, "git-user-signing-key", "", "")
credentialsServerCmd.Flags().StringVar(&cmd.User, "user", "", "The user to use")
_ = credentialsServerCmd.MarkFlagRequired("user")
return credentialsServerCmd
}
// Run runs the command logic
func (cmd *CredentialsServerCmd) Run(ctx context.Context, port int) error {
// create a grpc client
tunnelClient, err := tunnelserver.NewTunnelClient(os.Stdin, os.Stdout, true, ExitCodeIO)
if err != nil {
return fmt.Errorf("error creating tunnel client: %w", err)
}
// this message serves as a ping to the client
_, err = tunnelClient.Ping(ctx, &tunnel.Empty{})
if err != nil {
return fmt.Errorf("ping client: %w", err)
}
// create debug logger
log := tunnelserver.NewTunnelLogger(ctx, tunnelClient, cmd.Debug)
// forward ports
if cmd.ForwardPorts {
go func() {
log.Debugf("Start watching & forwarding open ports")
err = forwardPorts(ctx, tunnelClient, log)
if err != nil {
log.Errorf("error forwarding ports: %v", err)
}
}()
}
addr := net.JoinHostPort("localhost", strconv.Itoa(port))
if ok, err := portpkg.IsAvailable(addr); !ok || err != nil {
log.Debugf("Port %d not available, exiting", port)
return nil
}
// configure docker credential helper
if cmd.ConfigureDockerHelper {
err = dockercredentials.ConfigureCredentialsContainer(cmd.User, port, log)
if err != nil {
return err
}
}
// configure git user
err = configureGitUserLocally(ctx, cmd.User, tunnelClient)
if err != nil {
log.Debugf("Error configuring git user: %v", err)
return err
}
// configure git credential helper
if cmd.ConfigureGitHelper {
binaryPath, err := os.Executable()
if err != nil {
return err
}
err = gitcredentials.ConfigureHelper(binaryPath, cmd.User, port)
if err != nil {
return fmt.Errorf("configure git helper: %w", err)
}
// cleanup when we are done
defer func(userName string) {
_ = gitcredentials.RemoveHelper(userName)
}(cmd.User)
}
// configure git ssh signature helper
if cmd.GitUserSigningKey != "" {
decodedKey, err := base64.StdEncoding.DecodeString(cmd.GitUserSigningKey)
if err != nil {
return fmt.Errorf("decode git ssh signature key: %w", err)
}
err = gitsshsigning.ConfigureHelper(cmd.User, string(decodedKey), log)
if err != nil {
return fmt.Errorf("configure git ssh signature helper: %w", err)
}
// cleanup when we are done
defer func(userName string) {
_ = gitsshsigning.RemoveHelper(userName)
}(cmd.User)
}
return credentials.RunCredentialsServer(ctx, port, tunnelClient, log)
}
func configureGitUserLocally(ctx context.Context, userName string, client tunnel.TunnelClient) error {
// get local credentials
localGitUser, err := gitcredentials.GetUser(userName)
if err != nil {
return err
} else if localGitUser.Name != "" && localGitUser.Email != "" {
return nil
}
// set user & email if not found
response, err := client.GitUser(ctx, &tunnel.Empty{})
if err != nil {
return fmt.Errorf("retrieve git user: %w", err)
}
// parse git user from response
gitUser := &gitcredentials.GitUser{}
err = json.Unmarshal([]byte(response.Message), gitUser)
if err != nil {
return fmt.Errorf("decode git user: %w", err)
}
// don't override what is already there
if localGitUser.Name != "" {
gitUser.Name = ""
}
if localGitUser.Email != "" {
gitUser.Email = ""
}
// set git user
err = gitcredentials.SetUser(userName, gitUser)
if err != nil {
return fmt.Errorf("set git user & email: %w", err)
}
return nil
}
func forwardPorts(ctx context.Context, client tunnel.TunnelClient, log log.Logger) error {
return netstat.NewWatcher(&forwarder{ctx: ctx, client: client}, log).Run(ctx)
}
type forwarder struct {
ctx context.Context
client tunnel.TunnelClient
}
func (f *forwarder) Forward(port string) error {
_, err := f.client.ForwardPort(f.ctx, &tunnel.ForwardPortRequest{Port: port})
return err
}
func (f *forwarder) StopForward(port string) error {
_, err := f.client.StopForwardPort(f.ctx, &tunnel.StopForwardPortRequest{Port: port})
return err
}
================================================
FILE: cmd/agent/container/daemon.go
================================================
package container
import (
"context"
"encoding/base64"
"encoding/json"
"fmt"
"os"
"os/exec"
"os/signal"
"strings"
"sync"
"syscall"
"time"
"github.com/loft-sh/devpod/pkg/agent"
agentd "github.com/loft-sh/devpod/pkg/daemon/agent"
"github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/platform/client"
"github.com/loft-sh/devpod/pkg/ts"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
const (
RootDir = "/var/devpod"
DaemonConfigPath = "/var/run/secrets/devpod/daemon_config"
)
type DaemonCmd struct {
Config *agentd.DaemonConfig
Log log.Logger
}
// NewDaemonCmd creates the merged daemon command.
func NewDaemonCmd() *cobra.Command {
cmd := &DaemonCmd{
Config: &agentd.DaemonConfig{},
Log: log.NewStreamLogger(os.Stdout, os.Stderr, logrus.InfoLevel),
}
daemonCmd := &cobra.Command{
Use: "daemon",
Short: "Starts the DevPod network daemon, SSH server and monitors container activity if timeout is set",
Args: cobra.NoArgs,
RunE: cmd.Run,
}
daemonCmd.Flags().StringVar(&cmd.Config.Timeout, "timeout", "", "The timeout to stop the container after")
return daemonCmd
}
func (cmd *DaemonCmd) Run(c *cobra.Command, args []string) error {
ctx := c.Context()
errChan := make(chan error, 4)
var wg sync.WaitGroup
if err := cmd.loadConfig(); err != nil {
return err
}
// Prepare timeout if specified.
var timeoutDuration time.Duration
if cmd.Config.Timeout != "" {
var err error
timeoutDuration, err = time.ParseDuration(cmd.Config.Timeout)
if err != nil {
return errors.Wrap(err, "failed to parse timeout duration")
}
if timeoutDuration > 0 {
if err := setupActivityFile(); err != nil {
return err
}
}
}
ctx, cancel := context.WithCancel(ctx)
defer cancel()
var tasksStarted bool
// Start process reaper.
if os.Getpid() == 1 {
wg.Add(1)
go runReaper(ctx, errChan, &wg)
}
// Start Tailscale networking server.
if cmd.shouldRunNetworkServer() {
tasksStarted = true
wg.Add(1)
go runNetworkServer(ctx, cmd, errChan, &wg)
}
// Start timeout monitor.
if timeoutDuration > 0 {
tasksStarted = true
wg.Add(1)
go runTimeoutMonitor(ctx, timeoutDuration, errChan, &wg)
}
// Start ssh server.
if cmd.shouldRunSsh() {
tasksStarted = true
wg.Add(1)
go runSshServer(ctx, cmd, errChan, &wg)
}
// In case no task is configured, just wait indefinitely.
if !tasksStarted {
wg.Add(1)
go func() {
defer wg.Done()
<-ctx.Done()
}()
}
// Listen for OS termination signals.
go handleSignals(ctx, errChan)
// Wait until an error (or termination signal) occurs.
err := <-errChan
cancel()
wg.Wait()
if err != nil {
cmd.Log.Errorf("Daemon error: %v", err)
os.Exit(1)
}
os.Exit(0)
return nil // Unreachable but needed.
}
// loadConfig loads the daemon configuration from base64-encoded JSON.
// If a CLI-provided timeout exists, it will override the timeout in the config.
func (cmd *DaemonCmd) loadConfig() error {
// check local file
encodedCfg := ""
configBytes, err := os.ReadFile(DaemonConfigPath)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
// check environment variable
encodedCfg = os.Getenv(config.WorkspaceDaemonConfigExtraEnvVar)
} else {
return fmt.Errorf("get daemon config file %s: %w", DaemonConfigPath, err)
}
} else {
encodedCfg = string(configBytes)
}
if strings.TrimSpace(encodedCfg) != "" {
decoded, err := base64.StdEncoding.DecodeString(encodedCfg)
if err != nil {
return fmt.Errorf("error decoding daemon config: %w", err)
}
var cfg agentd.DaemonConfig
if err = json.Unmarshal(decoded, &cfg); err != nil {
return fmt.Errorf("error unmarshalling daemon config: %w", err)
}
if cmd.Config.Timeout != "" {
cfg.Timeout = cmd.Config.Timeout
}
cmd.Config = &cfg
}
return nil
}
// shouldRunNetworkServer returns true if the required platform parameters are present.
func (cmd *DaemonCmd) shouldRunNetworkServer() bool {
return cmd.Config.Platform.AccessKey != "" &&
cmd.Config.Platform.PlatformHost != "" &&
cmd.Config.Platform.WorkspaceHost != ""
}
// shouldRunSsh returns true if at least one SSH configuration value is provided.
func (cmd *DaemonCmd) shouldRunSsh() bool {
return cmd.Config.Ssh.Workdir != "" || cmd.Config.Ssh.User != ""
}
// setupActivityFile creates and sets permissions on the container activity file.
func setupActivityFile() error {
if err := os.WriteFile(agent.ContainerActivityFile, nil, 0777); err != nil {
return err
}
return os.Chmod(agent.ContainerActivityFile, 0777)
}
// runReaper starts the process reaper and waits for context cancellation.
func runReaper(ctx context.Context, errChan chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
agentd.RunProcessReaper()
<-ctx.Done()
}
// runTimeoutMonitor monitors the activity file and signals an error if the timeout is exceeded.
func runTimeoutMonitor(ctx context.Context, duration time.Duration, errChan chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
ticker := time.NewTicker(10 * time.Second)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
stat, err := os.Stat(agent.ContainerActivityFile)
if err != nil {
continue
}
if !stat.ModTime().Add(duration).After(time.Now()) {
errChan <- errors.New("timeout reached, terminating daemon")
return
}
}
}
}
// runNetworkServer starts the network server.
func runNetworkServer(ctx context.Context, cmd *DaemonCmd, errChan chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
if err := os.MkdirAll(RootDir, os.ModePerm); err != nil {
errChan <- err
return
}
logger := initLogging()
config := client.NewConfig()
config.AccessKey = cmd.Config.Platform.AccessKey
config.Host = "https://" + cmd.Config.Platform.PlatformHost
config.Insecure = true
baseClient := client.NewClientFromConfig(config)
if err := baseClient.RefreshSelf(ctx); err != nil {
errChan <- fmt.Errorf("failed to refresh client: %w", err)
return
}
tsServer := ts.NewWorkspaceServer(&ts.WorkspaceServerConfig{
AccessKey: cmd.Config.Platform.AccessKey,
PlatformHost: ts.RemoveProtocol(cmd.Config.Platform.PlatformHost),
WorkspaceHost: cmd.Config.Platform.WorkspaceHost,
Client: baseClient,
RootDir: RootDir,
LogF: func(format string, args ...interface{}) {
logger.Infof(format, args...)
},
}, logger)
if err := tsServer.Start(ctx); err != nil {
errChan <- fmt.Errorf("network server: %w", err)
}
}
// runSshServer starts the SSH server.
func runSshServer(ctx context.Context, cmd *DaemonCmd, errChan chan<- error, wg *sync.WaitGroup) {
defer wg.Done()
binaryPath, err := os.Executable()
if err != nil {
errChan <- err
return
}
args := []string{"agent", "container", "ssh-server"}
if cmd.Config.Ssh.Workdir != "" {
args = append(args, "--workdir", cmd.Config.Ssh.Workdir)
}
if cmd.Config.Ssh.User != "" {
args = append(args, "--remote-user", cmd.Config.Ssh.User)
}
sshCmd := exec.Command(binaryPath, args...)
sshCmd.Stdout = os.Stdout
sshCmd.Stderr = os.Stderr
if err := sshCmd.Start(); err != nil {
errChan <- fmt.Errorf("failed to start SSH server: %w", err)
return
}
done := make(chan struct{})
go func() {
select {
case <-ctx.Done():
if sshCmd.Process != nil {
if err := sshCmd.Process.Signal(syscall.SIGTERM); err != nil {
errChan <- fmt.Errorf("failed to send SIGTERM to SSH server: %w", err)
}
}
case <-done:
}
}()
if err := sshCmd.Wait(); err != nil {
errChan <- fmt.Errorf("SSH server exited abnormally: %w", err)
close(done)
return
}
close(done)
}
// handleSignals listens for OS termination signals and sends an error through errChan.
func handleSignals(ctx context.Context, errChan chan<- error) {
sigChan := make(chan os.Signal, 1)
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM)
select {
case sig := <-sigChan:
errChan <- fmt.Errorf("received signal: %v", sig)
case <-ctx.Done():
}
}
// initLogging initializes logging and returns a combined logger.
func initLogging() log.Logger {
return log.NewStdoutLogger(nil, os.Stdout, os.Stderr, logrus.InfoLevel)
}
================================================
FILE: cmd/agent/container/openvscode_async.go
================================================
package container
import (
"encoding/json"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/compress"
"github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/ide/openvscode"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// OpenVSCodeAsyncCmd holds the cmd flags
type OpenVSCodeAsyncCmd struct {
*flags.GlobalFlags
SetupInfo string
}
// NewOpenVSCodeAsyncCmd creates a new command
func NewOpenVSCodeAsyncCmd() *cobra.Command {
cmd := &OpenVSCodeAsyncCmd{}
vsCodeAsyncCmd := &cobra.Command{
Use: "openvscode-async",
Short: "Starts openvscode",
Args: cobra.NoArgs,
RunE: cmd.Run,
}
vsCodeAsyncCmd.Flags().StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info")
_ = vsCodeAsyncCmd.MarkFlagRequired("setup-info")
return vsCodeAsyncCmd
}
// Run runs the command logic
func (cmd *OpenVSCodeAsyncCmd) Run(_ *cobra.Command, _ []string) error {
log.Default.Debugf("Start setting up container...")
decompressed, err := compress.Decompress(cmd.SetupInfo)
if err != nil {
return err
}
setupInfo := &config.Result{}
err = json.Unmarshal([]byte(decompressed), setupInfo)
if err != nil {
return err
}
// install IDE
err = setupOpenVSCodeExtensions(setupInfo, log.Default)
if err != nil {
return err
}
return nil
}
func setupOpenVSCodeExtensions(setupInfo *config.Result, log log.Logger) error {
vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig)
user := config.GetRemoteUser(setupInfo)
return openvscode.NewOpenVSCodeServer(vsCodeConfiguration.Extensions, "", user, "", "", nil, log).InstallExtensions()
}
================================================
FILE: cmd/agent/container/setup.go
================================================
//go:build !windows
package container
import (
"context"
"crypto/tls"
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"os"
"os/exec"
"path/filepath"
"runtime"
"strconv"
"strings"
"time"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/agent/tunnel"
"github.com/loft-sh/devpod/pkg/agent/tunnelserver"
"github.com/loft-sh/devpod/pkg/command"
"github.com/loft-sh/devpod/pkg/compress"
config2 "github.com/loft-sh/devpod/pkg/config"
"github.com/loft-sh/devpod/pkg/copy"
"github.com/loft-sh/devpod/pkg/credentials"
"github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/devcontainer/setup"
"github.com/loft-sh/devpod/pkg/dockercredentials"
"github.com/loft-sh/devpod/pkg/envfile"
"github.com/loft-sh/devpod/pkg/extract"
"github.com/loft-sh/devpod/pkg/git"
"github.com/loft-sh/devpod/pkg/ide/fleet"
"github.com/loft-sh/devpod/pkg/ide/jetbrains"
"github.com/loft-sh/devpod/pkg/ide/jupyter"
"github.com/loft-sh/devpod/pkg/ide/openvscode"
"github.com/loft-sh/devpod/pkg/ide/rstudio"
"github.com/loft-sh/devpod/pkg/ide/vscode"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/devpod/pkg/single"
"github.com/loft-sh/devpod/pkg/ts"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
var DockerlessImageConfigOutput = "/.dockerless/image.json"
// SetupContainerCmd holds the cmd flags
type SetupContainerCmd struct {
*flags.GlobalFlags
ChownWorkspace bool
StreamMounts bool
InjectGitCredentials bool
ContainerWorkspaceInfo string
SetupInfo string
AccessKey string
PlatformHost string
WorkspaceHost string
}
// NewSetupContainerCmd creates a new command
func NewSetupContainerCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &SetupContainerCmd{
GlobalFlags: flags,
}
setupContainerCmd := &cobra.Command{
Use: "setup",
Short: "Sets up a container",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, args []string) error {
return cmd.Run(context.Background())
},
}
setupContainerCmd.Flags().BoolVar(&cmd.StreamMounts, "stream-mounts", false, "If true, will try to stream the bind mounts from the host")
setupContainerCmd.Flags().BoolVar(&cmd.ChownWorkspace, "chown-workspace", false, "If DevPod should chown the workspace to the remote user")
setupContainerCmd.Flags().BoolVar(&cmd.InjectGitCredentials, "inject-git-credentials", false, "If DevPod should inject git credentials during setup")
setupContainerCmd.Flags().StringVar(&cmd.ContainerWorkspaceInfo, "container-workspace-info", "", "The container workspace info")
setupContainerCmd.Flags().StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info")
setupContainerCmd.Flags().StringVar(&cmd.AccessKey, "access-key", "", "Access Key to use")
setupContainerCmd.Flags().StringVar(&cmd.WorkspaceHost, "workspace-host", "", "Workspace hostname to use")
setupContainerCmd.Flags().StringVar(&cmd.PlatformHost, "platform-host", "", "Platform host")
_ = setupContainerCmd.MarkFlagRequired("setup-info")
return setupContainerCmd
}
// Run runs the command logic
func (cmd *SetupContainerCmd) Run(ctx context.Context) error {
// create a grpc client
tunnelClient, err := tunnelserver.NewTunnelClient(os.Stdin, os.Stdout, true, 0)
if err != nil {
return fmt.Errorf("error creating tunnel client: %w", err)
}
// create debug logger
logger := tunnelserver.NewTunnelLogger(ctx, tunnelClient, cmd.Debug)
logger.Debugf("Created logger")
// this message serves as a ping to the client
_, err = tunnelClient.Ping(ctx, &tunnel.Empty{})
if err != nil {
return errors.Wrap(err, "ping client")
}
// start setting up container
logger.Debugf("Start setting up container...")
workspaceInfo, _, err := agent.DecodeContainerWorkspaceInfo(cmd.ContainerWorkspaceInfo)
if err != nil {
return err
}
decompressed, err := compress.Decompress(cmd.SetupInfo)
if err != nil {
return err
}
setupInfo := &config.Result{}
err = json.Unmarshal([]byte(decompressed), setupInfo)
if err != nil {
return err
}
// sync mounts
if cmd.StreamMounts {
mounts := config.GetMounts(setupInfo)
logger.Debug("Syncing mounts... ", mounts)
for _, m := range mounts {
// If we are resetting the workspace and it's sources, always re stream the mounts
if !workspaceInfo.CLIOptions.Reset {
files, err := os.ReadDir(m.Target)
if err == nil && len(files) > 0 {
logger.Debug("Skip stream mount ", m.Target, " because it's not empty")
continue
}
}
// stream mount
err = streamMount(ctx, workspaceInfo, m, tunnelClient, logger)
if err != nil {
return err
}
}
}
// do dockerless build
err = dockerlessBuild(ctx, setupInfo, &workspaceInfo.Dockerless, tunnelClient, cmd.Debug, logger)
if err != nil {
return fmt.Errorf("dockerless build: %w", err)
}
// fill container env
err = fillContainerEnv(setupInfo)
if err != nil {
return err
}
if cmd.InjectGitCredentials {
// configure git credentials
cancelCtx, cancel := context.WithCancel(ctx)
defer cancel()
cleanupFunc, err := configureSystemGitCredentials(cancelCtx, cancel, tunnelClient, logger)
if err != nil {
logger.Errorf("Error configuring git credentials: %v", err)
} else {
defer cleanupFunc()
}
}
if b, err := workspaceInfo.PullFromInsideContainer.Bool(); err == nil && b {
// check if workspace folder exists and is a git repository.
// skip cloning if it does
_, err := os.Stat(filepath.Join(setupInfo.SubstitutionContext.ContainerWorkspaceFolder, ".git"))
if err == nil && !workspaceInfo.CLIOptions.Recreate {
logger.Debugf("Workspace repository already checked out %s, skipping clone", setupInfo.SubstitutionContext.ContainerWorkspaceFolder)
} else {
if err := agent.CloneRepositoryForWorkspace(ctx,
&workspaceInfo.Source,
&workspaceInfo.Agent,
setupInfo.SubstitutionContext.ContainerWorkspaceFolder,
"",
workspaceInfo.CLIOptions,
true,
logger,
); err != nil {
return err
}
}
}
// setup container
err = setup.SetupContainer(ctx, setupInfo, workspaceInfo.CLIOptions.WorkspaceEnv, cmd.ChownWorkspace, &workspaceInfo.CLIOptions.Platform, tunnelClient, logger)
if err != nil {
return err
}
// install IDE
err = cmd.installIDE(setupInfo, &workspaceInfo.IDE, logger)
if err != nil {
return err
}
// start container daemon if necessary
if !workspaceInfo.CLIOptions.Platform.Enabled && !workspaceInfo.CLIOptions.DisableDaemon && workspaceInfo.ContainerTimeout != "" {
err = single.Single("devpod.daemon.pid", func() (*exec.Cmd, error) {
logger.Debugf("Start DevPod Container Daemon with Inactivity Timeout %s", workspaceInfo.ContainerTimeout)
binaryPath, err := os.Executable()
if err != nil {
return nil, err
}
return exec.Command(binaryPath, "agent", "container", "daemon", "--timeout", workspaceInfo.ContainerTimeout), nil
})
if err != nil {
return err
}
}
out, err := json.Marshal(setupInfo)
if err != nil {
return fmt.Errorf("marshal setup info: %w", err)
}
_, err = tunnelClient.SendResult(ctx, &tunnel.Message{Message: string(out)})
if err != nil {
return fmt.Errorf("send result: %w", err)
}
return nil
}
func fillContainerEnv(setupInfo *config.Result) error {
// set remote-env
if setupInfo.MergedConfig.RemoteEnv == nil {
setupInfo.MergedConfig.RemoteEnv = make(map[string]string)
}
if _, ok := setupInfo.MergedConfig.RemoteEnv["PATH"]; !ok {
setupInfo.MergedConfig.RemoteEnv["PATH"] = "${containerEnv:PATH}"
}
// merge config
newMergedConfig := &config.MergedDevContainerConfig{}
err := config.SubstituteContainerEnv(config.ListToObject(os.Environ()), setupInfo.MergedConfig, newMergedConfig)
if err != nil {
return errors.Wrap(err, "substitute container env")
}
setupInfo.MergedConfig = newMergedConfig
return nil
}
func dockerlessBuild(
ctx context.Context,
setupInfo *config.Result,
dockerlessOptions *provider2.ProviderDockerlessOptions,
client tunnel.TunnelClient,
debug bool,
log log.Logger,
) error {
if os.Getenv("DOCKERLESS") != "true" {
return nil
}
_, err := os.Stat(DockerlessImageConfigOutput)
if err == nil {
log.Debugf("Skip dockerless build, because container was built already")
return nil
}
buildContext := os.Getenv("DOCKERLESS_CONTEXT")
if buildContext == "" {
log.Debugf("Build context is missing for dockerless build")
return nil
}
// check if build info is there
fallbackDir := filepath.Join(config.DevPodDockerlessBuildInfoFolder, config.DevPodContextFeatureFolder)
buildInfoDir := filepath.Join(buildContext, config.DevPodContextFeatureFolder)
_, err = os.Stat(buildInfoDir)
if err != nil {
// try to rename from fallback dir
err = copy.RenameDirectory(fallbackDir, buildInfoDir)
if err != nil {
return fmt.Errorf("rename dir: %w", err)
}
_, err = os.Stat(buildInfoDir)
if err != nil {
return fmt.Errorf("couldn't find build dir %s: %w", buildInfoDir, err)
}
}
binaryPath, err := os.Executable()
if err != nil {
return err
}
// configure credentials
if dockerlessOptions.DisableDockerCredentials != "true" {
var cancel context.CancelFunc
ctx, cancel = context.WithCancel(ctx)
defer cancel()
// configure the docker credentials
dockerCredentialsDir, err := configureDockerCredentials(ctx, cancel, client, log)
if err != nil {
log.Errorf("Error configuring docker credentials: %v", err)
} else {
defer func() {
_ = os.Unsetenv("DOCKER_CONFIG")
_ = os.RemoveAll(dockerCredentialsDir)
}()
}
}
// build args
args := []string{"build", "--ignore-path", binaryPath}
args = append(args, parseIgnorePaths(dockerlessOptions.IgnorePaths)...)
args = append(args, "--build-arg", "TARGETOS="+runtime.GOOS)
args = append(args, "--build-arg", "TARGETARCH="+runtime.GOARCH)
if dockerlessOptions.RegistryCache != "" {
log.Debug("Appending registry cache to dockerless build arguments ", dockerlessOptions.RegistryCache)
args = append(args, "--registry-cache", dockerlessOptions.RegistryCache)
}
// ignore mounts
args = append(args, "--ignore-path", setupInfo.SubstitutionContext.ContainerWorkspaceFolder)
for _, m := range setupInfo.MergedConfig.Mounts {
// check if there already, then we don't touch it
files, err := os.ReadDir(m.Target)
if err == nil && len(files) > 0 {
args = append(args, "--ignore-path", m.Target)
}
}
// write output to log
errWriter := log.Writer(logrus.InfoLevel, false)
defer errWriter.Close()
// start building
log.Infof("Start dockerless building %s %s", "/.dockerless/dockerless", strings.Join(args, " "))
cmd := exec.CommandContext(ctx, "/.dockerless/dockerless", args...)
if debug {
debugWriter := log.Writer(logrus.DebugLevel, false)
defer debugWriter.Close()
cmd.Stdout = debugWriter
}
cmd.Stderr = errWriter
cmd.Env = os.Environ()
err = cmd.Run()
if err != nil {
return err
}
// add container env to envfile.json
rawConfig, err := os.ReadFile(DockerlessImageConfigOutput)
if err != nil {
return err
}
// parse config file
configFile := &v1.ConfigFile{}
err = json.Unmarshal(rawConfig, configFile)
if err != nil {
return fmt.Errorf("parse container config: %w", err)
}
// apply env
envfile.MergeAndApply(config.ListToObject(configFile.Config.Env), log)
// rename build path
_ = os.RemoveAll(fallbackDir)
err = copy.RenameDirectory(buildInfoDir, fallbackDir)
if err != nil {
log.Debugf("Error renaming dir %s: %v", buildInfoDir, err)
return nil
}
return nil
}
func parseIgnorePaths(ignorePaths string) []string {
if strings.TrimSpace(ignorePaths) == "" {
return nil
}
retPaths := []string{}
splitted := strings.Split(ignorePaths, ",")
for _, s := range splitted {
retPaths = append(retPaths, "--ignore-path", strings.TrimSpace(s))
}
return retPaths
}
func configureDockerCredentials(
ctx context.Context,
cancel context.CancelFunc,
client tunnel.TunnelClient,
log log.Logger,
) (string, error) {
serverPort, err := credentials.StartCredentialsServer(ctx, cancel, client, log)
if err != nil {
return "", err
}
dockerCredentials, err := dockercredentials.ConfigureCredentialsDockerless("/.dockerless/.docker", serverPort, log)
if err != nil {
return "", err
}
return dockerCredentials, nil
}
func (cmd *SetupContainerCmd) installIDE(setupInfo *config.Result, ide *provider2.WorkspaceIDEConfig, log log.Logger) error {
switch ide.Name {
case string(config2.IDENone):
return nil
case string(config2.IDEVSCode):
return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorStable, log)
case string(config2.IDEVSCodeInsiders):
return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorInsiders, log)
case string(config2.IDECursor):
return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorCursor, log)
case string(config2.IDEPositron):
return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorPositron, log)
case string(config2.IDECodium):
return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorCodium, log)
case string(config2.IDEWindsurf):
return cmd.setupVSCode(setupInfo, ide.Options, vscode.FlavorWindsurf, log)
case string(config2.IDEOpenVSCode):
return cmd.setupOpenVSCode(setupInfo, ide.Options, log)
case string(config2.IDEGoland):
return jetbrains.NewGolandServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDERustRover):
return jetbrains.NewRustRoverServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDEPyCharm):
return jetbrains.NewPyCharmServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDEPhpStorm):
return jetbrains.NewPhpStorm(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDEIntellij):
return jetbrains.NewIntellij(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDECLion):
return jetbrains.NewCLionServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDERider):
return jetbrains.NewRiderServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDERubyMine):
return jetbrains.NewRubyMineServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDEWebStorm):
return jetbrains.NewWebStormServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDEDataSpell):
return jetbrains.NewDataSpellServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDEFleet):
return fleet.NewFleetServer(config.GetRemoteUser(setupInfo), ide.Options, log).Install(setupInfo.SubstitutionContext.ContainerWorkspaceFolder)
case string(config2.IDEJupyterNotebook):
return jupyter.NewJupyterNotebookServer(setupInfo.SubstitutionContext.ContainerWorkspaceFolder, config.GetRemoteUser(setupInfo), ide.Options, log).Install()
case string(config2.IDERStudio):
err := rstudio.NewRStudioServer(setupInfo.SubstitutionContext.ContainerWorkspaceFolder, config.GetRemoteUser(setupInfo), ide.Options, log).Install()
if err != nil {
log.Errorf("could not install rstudio with error: %w", err)
}
}
return nil
}
func (cmd *SetupContainerCmd) setupVSCode(setupInfo *config.Result, ideOptions map[string]config2.OptionValue, flavor vscode.Flavor, log log.Logger) error {
log.Debugf("Setup %s...", flavor.DisplayName())
vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig)
settings := ""
if len(vsCodeConfiguration.Settings) > 0 {
out, err := json.Marshal(vsCodeConfiguration.Settings)
if err != nil {
return err
}
settings = string(out)
}
user := config.GetRemoteUser(setupInfo)
err := vscode.NewVSCodeServer(vsCodeConfiguration.Extensions, settings, user, ideOptions, flavor, log).Install()
if err != nil {
return err
}
// don't install code-server if we don't have settings or extensions
if len(vsCodeConfiguration.Settings) == 0 && len(vsCodeConfiguration.Extensions) == 0 {
return nil
}
if len(vsCodeConfiguration.Extensions) == 0 {
return nil
}
return single.Single(fmt.Sprintf("%s-async.pid", flavor), func() (*exec.Cmd, error) {
log.Infof("Install extensions '%s' in the background", strings.Join(vsCodeConfiguration.Extensions, ","))
binaryPath, err := os.Executable()
if err != nil {
return nil, err
}
args := []string{
"agent", "container", "vscode-async",
"--setup-info", cmd.SetupInfo,
"--release-channel", string(flavor),
}
return exec.Command(binaryPath, args...), nil
})
}
func (cmd *SetupContainerCmd) setupOpenVSCode(setupInfo *config.Result, ideOptions map[string]config2.OptionValue, log log.Logger) error {
log.Debugf("Setup openvscode...")
vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig)
settings := ""
if len(vsCodeConfiguration.Settings) > 0 {
out, err := json.Marshal(vsCodeConfiguration.Settings)
if err != nil {
return err
}
settings = string(out)
}
user := config.GetRemoteUser(setupInfo)
openVSCode := openvscode.NewOpenVSCodeServer(vsCodeConfiguration.Extensions, settings, user, "0.0.0.0", strconv.Itoa(openvscode.DefaultVSCodePort), ideOptions, log)
// install open vscode
err := openVSCode.Install()
if err != nil {
return err
}
// install extensions in background
if len(vsCodeConfiguration.Extensions) > 0 {
err = single.Single("openvscode-async.pid", func() (*exec.Cmd, error) {
log.Infof("Install extensions '%s' in the background", strings.Join(vsCodeConfiguration.Extensions, ","))
binaryPath, err := os.Executable()
if err != nil {
return nil, err
}
return exec.Command(binaryPath, "agent", "container", "openvscode-async", "--setup-info", cmd.SetupInfo), nil
})
if err != nil {
return errors.Wrap(err, "install extensions")
}
}
// start the server in the background
return openVSCode.Start()
}
func configureSystemGitCredentials(ctx context.Context, cancel context.CancelFunc, client tunnel.TunnelClient, log log.Logger) (func(), error) {
if !command.Exists("git") {
return nil, errors.New("git not found")
}
serverPort, err := credentials.StartCredentialsServer(ctx, cancel, client, log)
if err != nil {
return nil, err
}
binaryPath, err := os.Executable()
if err != nil {
return nil, err
}
gitCredentials := fmt.Sprintf("!'%s' agent git-credentials --port %d", binaryPath, serverPort)
_ = os.Setenv("DEVPOD_GIT_HELPER_PORT", strconv.Itoa(serverPort))
err = git.CommandContext(ctx, git.GetDefaultExtraEnv(false), "config", "--system", "--add", "credential.helper", gitCredentials).Run()
if err != nil {
return nil, fmt.Errorf("add git credential helper: %w", err)
}
cleanup := func() {
log.Debug("Unset setup system credential helper")
err = git.CommandContext(ctx, git.GetDefaultExtraEnv(false), "config", "--system", "--unset", "credential.helper").Run()
if err != nil {
log.Errorf("unset system credential helper %v", err)
}
}
return cleanup, nil
}
func streamMount(ctx context.Context, workspaceInfo *provider2.ContainerWorkspaceInfo, m *config.Mount, tunnelClient tunnel.TunnelClient, logger log.Logger) error {
// if we have a platform workspace socket we connect directly to it
if workspaceInfo.CLIOptions.Platform.Enabled {
// check if the runner proxy socket exists
httpClient := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
},
}
// build the url
logger.Infof("Download %s into DevContainer %s", m.Source, m.Target)
url := fmt.Sprintf(
"https://%s/kubernetes/management/apis/management.loft.sh/v1/namespaces/%s/devpodworkspaceinstances/%s/download?path=%s",
ts.RemoveProtocol(workspaceInfo.CLIOptions.Platform.PlatformHost),
workspaceInfo.CLIOptions.Platform.InstanceNamespace,
workspaceInfo.CLIOptions.Platform.InstanceName,
url.QueryEscape(m.Source),
)
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return fmt.Errorf("create request: %w", err)
}
req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", workspaceInfo.CLIOptions.Platform.AccessKey))
// send the request
resp, err := httpClient.Do(req)
if err != nil {
return fmt.Errorf("download workspace: %w", err)
}
defer resp.Body.Close()
// check if the response is ok
if resp.StatusCode != http.StatusOK {
body, _ := io.ReadAll(resp.Body)
return fmt.Errorf("download workspace: body = %s, status = %s", string(body), resp.Status)
}
// create progress reader
progressReader := &progressReader{
Reader: resp.Body,
Log: logger,
}
// target folder
err = extract.Extract(progressReader, m.Target)
if err != nil {
return fmt.Errorf("stream mount %s: %w", m.String(), err)
}
return nil
}
// stream mount
logger.Infof("Copy %s into DevContainer %s", m.Source, m.Target)
stream, err := tunnelClient.StreamMount(ctx, &tunnel.StreamMountRequest{Mount: m.String()})
if err != nil {
return fmt.Errorf("init stream mount %s: %w", m.String(), err)
}
// target folder
err = extract.Extract(tunnelserver.NewStreamReader(stream, logger), m.Target)
if err != nil {
return fmt.Errorf("stream mount %s: %w", m.String(), err)
}
return nil
}
type progressReader struct {
Reader io.Reader
Log log.Logger
lastMessage time.Time
bytesRead int64
}
func (p *progressReader) Read(b []byte) (n int, err error) {
n, err = p.Reader.Read(b)
p.bytesRead += int64(n)
if time.Since(p.lastMessage) > time.Second*4 {
p.Log.Infof("Downloaded %.2f MB", float64(p.bytesRead)/1024/1024)
p.lastMessage = time.Now()
}
return n, err
}
================================================
FILE: cmd/agent/container/setup_loft_platform_access.go
================================================
package container
import (
"fmt"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/credentials"
"github.com/loft-sh/devpod/pkg/loftconfig"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
type SetupLoftPlatformAccessCmd struct {
*flags.GlobalFlags
Context string
Provider string
Port int
}
// NewSetupLoftPlatformAccessCmd creates a new setup-loft-platform-access command
// This agent command can be used to inject loft platform configuration from local machine to workspace.
func NewSetupLoftPlatformAccessCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &SetupLoftPlatformAccessCmd{
GlobalFlags: flags,
}
setupLoftPlatformAccessCmd := &cobra.Command{
Use: "setup-loft-platform-access",
Short: "used to setup Loft Platform access",
RunE: cmd.Run,
}
setupLoftPlatformAccessCmd.Flags().StringVar(&cmd.Context, "context", "", "context to use")
_ = setupLoftPlatformAccessCmd.Flags().MarkDeprecated("context", "Information should be provided by services server, don't use this flag anymore")
setupLoftPlatformAccessCmd.Flags().StringVar(&cmd.Provider, "provider", "", "provider to use")
_ = setupLoftPlatformAccessCmd.Flags().MarkDeprecated("provider", "Information should be provided by services server, don't use this flag anymore")
setupLoftPlatformAccessCmd.Flags().IntVar(&cmd.Port, "port", 0, "If specified, will use the given port")
_ = setupLoftPlatformAccessCmd.Flags().MarkDeprecated("port", "")
return setupLoftPlatformAccessCmd
}
// Run executes main command logic.
// It fetches Loft Platform credentials from credentials server and sets it up inside the workspace.
func (c *SetupLoftPlatformAccessCmd) Run(_ *cobra.Command, args []string) error {
logger := log.Default.ErrorStreamOnly()
port, err := credentials.GetPort()
if err != nil {
return fmt.Errorf("get port: %w", err)
}
// backwards compatibility, remove in future release
if c.Port > 0 {
port = c.Port
}
loftConfig, err := loftconfig.GetLoftConfig(c.Context, c.Provider, port, logger)
if err != nil {
return err
}
if loftConfig == nil {
logger.Debug("Got empty loft config response, Loft Platform access won't be set up.")
return nil
}
err = loftconfig.AuthDevpodCliToPlatform(loftConfig, logger)
if err != nil {
// log error but don't return to allow other CLIs to install as well
logger.Warnf("unable to authenticate devpod cli: %w", err)
}
err = loftconfig.AuthVClusterCliToPlatform(loftConfig, logger)
if err != nil {
// log error but don't return to allow other CLIs to install as well
logger.Warnf("unable to authenticate vcluster cli: %w", err)
}
return nil
}
================================================
FILE: cmd/agent/container/setup_windows.go
================================================
//go:build windows
package container
import (
"github.com/loft-sh/devpod/cmd/flags"
"github.com/spf13/cobra"
)
func NewSetupContainerCmd(flags *flags.GlobalFlags) *cobra.Command {
return &cobra.Command{
Use: "setup",
Short: "Sets up a container",
Args: cobra.NoArgs,
RunE: func(cmd *cobra.Command, args []string) error {
panic("Windows Containers are not supported")
},
}
}
================================================
FILE: cmd/agent/container/ssh_server.go
================================================
package container
import (
"fmt"
"os"
"path/filepath"
"github.com/loft-sh/devpod/cmd/flags"
helperssh "github.com/loft-sh/devpod/pkg/ssh/server"
"github.com/loft-sh/devpod/pkg/ssh/server/port"
"github.com/loft-sh/log"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
const BaseLogDir = "/var/devpod"
// SSHServerCmd holds the ssh server cmd flags
type SSHServerCmd struct {
*flags.GlobalFlags
Address string
Workdir string
RemoteUser string
}
// NewSSHServerCmd creates a new ssh command
func NewSSHServerCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &SSHServerCmd{
GlobalFlags: flags,
}
sshCmd := &cobra.Command{
Use: "ssh-server",
Short: "Starts the container ssh server",
Args: cobra.NoArgs,
RunE: cmd.Run,
}
sshCmd.Flags().StringVar(&cmd.Address, "address", fmt.Sprintf("127.0.0.1:%d", helperssh.DefaultUserPort), "Address to listen to")
sshCmd.Flags().StringVar(&cmd.RemoteUser, "remote-user", "", "The remote user for this workspace")
sshCmd.Flags().StringVar(&cmd.Workdir, "workdir", "", "Directory where commands will run on the host")
return sshCmd
}
// Run runs the command logic
func (cmd *SSHServerCmd) Run(_ *cobra.Command, _ []string) error {
logger := getFileLogger(cmd.RemoteUser, cmd.Debug)
server, err := helperssh.NewContainerServer(cmd.Address, cmd.Workdir, logger)
if err != nil {
return err
}
// check if ssh is already running at that port
available, err := port.IsAvailable(cmd.Address)
if !available {
if err != nil {
return fmt.Errorf("address %s already in use: %w", cmd.Address, err)
}
log.Default.ErrorStreamOnly().Info("address %s already in use", cmd.Address)
return nil
}
return server.ListenAndServe()
}
func getFileLogger(remoteUser string, debug bool) log.Logger {
logLevel := logrus.InfoLevel
if debug {
logLevel = logrus.DebugLevel
}
fallback := log.NewDiscardLogger(logLevel)
targetFolder := filepath.Join(os.TempDir(), ".devpod")
if remoteUser != "" {
targetFolder = filepath.Join(BaseLogDir, remoteUser)
}
err := os.MkdirAll(targetFolder, 0o755)
if err != nil {
return fallback
}
return log.NewFileLogger(filepath.Join(targetFolder, "ssh.log"), logLevel)
}
================================================
FILE: cmd/agent/container/vscode_async.go
================================================
package container
import (
"encoding/json"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/compress"
"github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/ide/vscode"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
"github.com/spf13/pflag"
)
// VSCodeAsyncCmd holds the cmd flags
type VSCodeAsyncCmd struct {
*flags.GlobalFlags
SetupInfo string
Flavor string
}
// NewVSCodeAsyncCmd creates a new command
func NewVSCodeAsyncCmd() *cobra.Command {
cmd := &VSCodeAsyncCmd{}
vsCodeAsyncCmd := &cobra.Command{
Use: "vscode-async",
Short: "Starts vscode",
Args: cobra.NoArgs,
RunE: cmd.Run,
}
vsCodeAsyncCmd.Flags().StringVar(&cmd.SetupInfo, "setup-info", "", "The container setup info")
_ = vsCodeAsyncCmd.MarkFlagRequired("setup-info")
vsCodeAsyncCmd.Flags().StringVar(&cmd.Flavor, "flavor", string(vscode.FlavorStable), "The flavor of the VSCode distribution")
vsCodeAsyncCmd.Flags().StringVar(&cmd.Flavor, "release-channel", string(vscode.FlavorStable), "The release channel to use for vscode")
_ = vsCodeAsyncCmd.Flags().MarkDeprecated("release-channel", "prefer the --flavor flag")
// gracefully migrate --release-channel to --flavor
vsCodeAsyncCmd.Flags().SetNormalizeFunc(migrateReleaseChannel)
return vsCodeAsyncCmd
}
func migrateReleaseChannel(f *pflag.FlagSet, name string) pflag.NormalizedName {
if name == "release-channel" {
name = "flavor"
}
return pflag.NormalizedName(name)
}
// Run runs the command logic
func (cmd *VSCodeAsyncCmd) Run(_ *cobra.Command, _ []string) error {
log.Default.Debugf("Start setting up container...")
decompressed, err := compress.Decompress(cmd.SetupInfo)
if err != nil {
return err
}
setupInfo := &config.Result{}
err = json.Unmarshal([]byte(decompressed), setupInfo)
if err != nil {
return err
}
// install IDE
err = setupVSCodeExtensions(setupInfo, vscode.Flavor(cmd.Flavor), log.Default)
if err != nil {
return err
}
return nil
}
func setupVSCodeExtensions(setupInfo *config.Result, flavor vscode.Flavor, log log.Logger) error {
vsCodeConfiguration := config.GetVSCodeConfiguration(setupInfo.MergedConfig)
user := config.GetRemoteUser(setupInfo)
return vscode.NewVSCodeServer(vsCodeConfiguration.Extensions, "", user, nil, flavor, log).InstallExtensions()
}
================================================
FILE: cmd/agent/container_tunnel.go
================================================
package agent
import (
"bytes"
"context"
"io"
"os"
"os/signal"
"syscall"
"github.com/loft-sh/devpod/cmd/agent/workspace"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/devcontainer"
"github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/devcontainer/setup"
"github.com/loft-sh/devpod/pkg/encoding"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// ContainerTunnelCmd holds the ws-tunnel cmd flags
type ContainerTunnelCmd struct {
*flags.GlobalFlags
WorkspaceInfo string
User string
}
// NewContainerTunnelCmd creates a new command
func NewContainerTunnelCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &ContainerTunnelCmd{
GlobalFlags: flags,
}
containerTunnelCmd := &cobra.Command{
Use: "container-tunnel",
Short: "Starts a new container ssh tunnel",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.TODO(), log.Default.ErrorStreamOnly())
},
}
containerTunnelCmd.Flags().StringVar(&cmd.User, "user", "", "The user to create the tunnel with")
containerTunnelCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = containerTunnelCmd.MarkFlagRequired("workspace-info")
return containerTunnelCmd
}
// Run runs the command logic
func (cmd *ContainerTunnelCmd) Run(ctx context.Context, log log.Logger) error {
// write workspace info
shouldExit, workspaceInfo, err := agent.WriteWorkspaceInfo(cmd.WorkspaceInfo, log)
if err != nil {
return err
} else if shouldExit {
return nil
}
// make sure content folder exists
_, err = workspace.InitContentFolder(workspaceInfo, log)
if err != nil {
return err
}
// create runner
runner, err := workspace.CreateRunner(workspaceInfo, log)
if err != nil {
return err
}
// wait until devcontainer is started
err = startDevContainer(ctx, workspaceInfo, runner, log)
if err != nil {
return err
}
// handle SIGHUP
sigs := make(chan os.Signal, 1)
signal.Notify(sigs, syscall.SIGHUP)
go func() {
<-sigs
os.Exit(0)
}()
// create tunnel into container.
err = agent.Tunnel(
ctx,
func(ctx context.Context, user string, command string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
return runner.Command(ctx, user, command, stdin, stdout, stderr)
},
cmd.User,
os.Stdin,
os.Stdout,
os.Stderr,
log,
workspaceInfo.InjectTimeout,
)
if err != nil {
return err
}
return nil
}
func startDevContainer(ctx context.Context, workspaceConfig *provider2.AgentWorkspaceInfo, runner devcontainer.Runner, log log.Logger) error {
containerDetails, err := runner.Find(ctx)
if err != nil {
return err
}
// start container if necessary
if containerDetails == nil || containerDetails.State.Status != "running" {
// start container
_, err = StartContainer(ctx, runner, log, workspaceConfig)
if err != nil {
return err
}
} else if encoding.IsLegacyUID(workspaceConfig.Workspace.UID) {
// make sure workspace result is in devcontainer
buf := &bytes.Buffer{}
err = runner.Command(ctx, "root", "cat "+setup.ResultLocation, nil, buf, buf)
if err != nil {
// start container
_, err = StartContainer(ctx, runner, log, workspaceConfig)
if err != nil {
return err
}
}
}
return nil
}
func StartContainer(ctx context.Context, runner devcontainer.Runner, log log.Logger, workspaceConfig *provider2.AgentWorkspaceInfo) (*config.Result, error) {
log.Debugf("Starting DevPod container...")
result, err := runner.Up(ctx, devcontainer.UpOptions{NoBuild: true}, workspaceConfig.InjectTimeout)
if err != nil {
return result, err
}
log.Debugf("Successfully started DevPod container")
return result, err
}
================================================
FILE: cmd/agent/daemon.go
================================================
package agent
import (
"bytes"
"context"
"os"
"path/filepath"
"strings"
"time"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/client/clientimplementation"
"github.com/loft-sh/devpod/pkg/driver/custom"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/log"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// DaemonCmd holds the cmd flags
type DaemonCmd struct {
*flags.GlobalFlags
Interval string
}
// NewDaemonCmd creates a new command
func NewDaemonCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &DaemonCmd{
GlobalFlags: flags,
}
daemonCmd := &cobra.Command{
Use: "daemon",
Short: "Watches for activity and stops the server due to inactivity",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
daemonCmd.Flags().StringVar(&cmd.Interval, "interval", "", "The interval how to poll workspaces")
return daemonCmd
}
func (cmd *DaemonCmd) Run(ctx context.Context) error {
logFolder, err := agent.GetAgentDaemonLogFolder(cmd.AgentDir)
if err != nil {
return err
}
logger := log.NewFileLogger(filepath.Join(logFolder, "agent-daemon.log"), logrus.InfoLevel)
logger.Infof("Starting DevPod Daemon patrol at %s...", logFolder)
// start patrolling
cmd.patrol(logger)
// should never reach this
return nil
}
func (cmd *DaemonCmd) patrol(log log.Logger) {
// make sure we don't immediately resleep on startup
cmd.initialTouch(log)
// parse the daemon interval
interval := time.Second * 60
if cmd.Interval != "" {
parsed, err := time.ParseDuration(cmd.Interval)
if err == nil {
interval = parsed
}
}
// loop over workspace configs and check their last ModTime
for {
time.Sleep(interval)
cmd.doOnce(log)
}
}
func (cmd *DaemonCmd) doOnce(log log.Logger) {
var latestActivity *time.Time
var workspace *provider2.AgentWorkspaceInfo
// get base folder
baseFolder, err := agent.FindAgentHomeFolder(cmd.AgentDir)
if err != nil {
return
}
// get all workspace configs
pattern := baseFolder + "/contexts/*/workspaces/*/" + provider2.WorkspaceConfigFile
matches, err := filepath.Glob(pattern)
if err != nil {
log.Errorf("Error globing pattern %s: %v", pattern, err)
return
}
// check when the last touch was
for _, match := range matches {
activity, activityWorkspace, err := getActivity(match, log)
if err != nil {
log.Errorf("Error checking for inactivity: %v", err)
continue
} else if activity == nil {
continue
}
if latestActivity == nil || activity.After(*latestActivity) {
latestActivity = activity
workspace = activityWorkspace
}
}
// should we run shutdown command?
if latestActivity == nil {
if len(matches) == 0 {
log.Infof("No workspaces found in path '%s'", baseFolder)
} else {
log.Infof("%d workspaces found in path '%s', but none of them had any auto-stop configured or were still running / never completed successfully", len(matches), baseFolder)
}
return
}
// check timeout
timeout := agent.DefaultInactivityTimeout
if workspace.Agent.Timeout != "" {
var err error
timeout, err = time.ParseDuration(workspace.Agent.Timeout)
if err != nil {
log.Errorf("Error parsing inactivity timeout: %v", err)
timeout = agent.DefaultInactivityTimeout
}
}
if latestActivity.Add(timeout).After(time.Now()) {
log.Infof("Workspace '%s' has latest activity at '%s', will auto-stop machine in %s", workspace.Workspace.ID, latestActivity.String(), time.Until(latestActivity.Add(timeout)).String())
return
}
// run shutdown command
cmd.runShutdownCommand(workspace, log)
}
func (cmd *DaemonCmd) runShutdownCommand(workspace *provider2.AgentWorkspaceInfo, log log.Logger) {
// get environ
environ, err := custom.ToEnvironWithBinaries(workspace, log)
if err != nil {
log.Errorf("%v", err)
return
}
// we run the timeout command now
buf := &bytes.Buffer{}
log.Infof("Run shutdown command for workspace %s: %s", workspace.Workspace.ID, strings.Join(workspace.Agent.Exec.Shutdown, " "))
err = clientimplementation.RunCommand(
context.Background(),
workspace.Agent.Exec.Shutdown,
environ,
nil,
buf,
buf,
)
if err != nil {
log.Errorf("Error running %s: %s%w", strings.Join(workspace.Agent.Exec.Shutdown, " "), buf.String(), err)
return
}
log.Infof("Successful ran command: %s", buf.String())
}
func (cmd *DaemonCmd) initialTouch(log log.Logger) {
// get base folder
baseFolder, err := agent.FindAgentHomeFolder(cmd.AgentDir)
if err != nil {
return
}
// get workspace configs
pattern := baseFolder + "/contexts/*/workspaces/*/" + provider2.WorkspaceConfigFile
matches, err := filepath.Glob(pattern)
if err != nil {
log.Errorf("Error globing pattern %s: %v", pattern, err)
return
}
// check when the last touch was
now := time.Now()
for _, match := range matches {
err := os.Chtimes(match, now, now)
if err != nil {
log.Errorf("Error touching workspace config %s: %v", pattern, err)
return
}
}
}
func getActivity(workspaceConfig string, log log.Logger) (*time.Time, *provider2.AgentWorkspaceInfo, error) {
workspace, err := agent.ParseAgentWorkspaceInfo(workspaceConfig)
if err != nil {
log.Errorf("Error reading %s: %v", workspaceConfig, err)
return nil, nil, nil
}
// check if shutdown is configured
if len(workspace.Agent.Exec.Shutdown) == 0 {
return nil, nil, nil
}
// check last access time
stat, err := os.Stat(workspaceConfig)
if err != nil {
return nil, nil, err
}
// check if workspace is locked
t := stat.ModTime()
if agent.HasWorkspaceBusyFile(filepath.Dir(workspaceConfig)) {
t = t.Add(time.Minute * 20)
}
// check if timeout
return &t, workspace, nil
}
================================================
FILE: cmd/agent/docker_credentials.go
================================================
package agent
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net"
"net/http"
"os"
"path/filepath"
"strconv"
"strings"
"time"
"github.com/loft-sh/devpod/cmd/agent/container"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/dockercredentials"
devpodhttp "github.com/loft-sh/devpod/pkg/http"
"github.com/loft-sh/devpod/pkg/ts"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// DockerCredentialsCmd holds the cmd flags
type DockerCredentialsCmd struct {
*flags.GlobalFlags
Port int
}
// NewDockerCredentialsCmd creates a new command
func NewDockerCredentialsCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &DockerCredentialsCmd{
GlobalFlags: flags,
}
dockerCredentialsCmd := &cobra.Command{
Use: "docker-credentials",
Short: "Retrieves docker-credentials from the local machine",
RunE: func(_ *cobra.Command, args []string) error {
return cmd.Run(context.Background(), args, log.Default.ErrorStreamOnly())
},
}
dockerCredentialsCmd.Flags().IntVar(&cmd.Port, "port", 0, "If specified, will use the given port")
_ = dockerCredentialsCmd.MarkFlagRequired("port")
return dockerCredentialsCmd
}
func (cmd *DockerCredentialsCmd) Run(ctx context.Context, args []string, log log.Logger) error {
if len(args) == 0 {
return nil
}
// we only handle get and list
if args[0] == "get" {
return cmd.handleGet(log)
} else if args[0] == "list" {
return cmd.handleList(log)
}
return nil
}
func (cmd *DockerCredentialsCmd) handleList(log log.Logger) error {
rawJSON, err := json.Marshal(&dockercredentials.Request{})
if err != nil {
return err
}
response, err := devpodhttp.GetHTTPClient().Post("http://localhost:"+strconv.Itoa(cmd.Port)+"/docker-credentials", "application/json", bytes.NewReader(rawJSON))
if err != nil {
log.Errorf("Error retrieving list credentials: %v", err)
return nil
}
defer response.Body.Close()
raw, err := io.ReadAll(response.Body)
if err != nil {
log.Errorf("Error reading list credentials: %v", err)
return nil
}
// has the request succeeded?
if response.StatusCode != http.StatusOK {
log.Errorf("Error reading list credentials (%d): %v", response.StatusCode, string(raw))
return nil
}
listResponse := &dockercredentials.ListResponse{}
err = json.Unmarshal(raw, listResponse)
if err != nil {
log.Errorf("Error decoding list credentials: %s%v", string(raw), err)
return nil
}
if listResponse.Registries == nil {
listResponse.Registries = map[string]string{}
}
raw, err = json.Marshal(listResponse.Registries)
if err != nil {
log.Errorf("Error encoding list credentials: %v", err)
return nil
}
// print response to stdout
fmt.Print(string(raw))
return nil
}
func (cmd *DockerCredentialsCmd) handleGet(log log.Logger) error {
url, err := io.ReadAll(os.Stdin)
if err != nil {
return err
} else if len(strings.TrimSpace(string(url))) == 0 {
return fmt.Errorf("no credentials server URL")
}
credentials := getDockerCredentialsFromWorkspaceServer(&dockercredentials.Credentials{ServerURL: strings.TrimSpace(string(url))})
if credentials != nil {
raw, err := json.Marshal(credentials)
if err != nil {
log.Errorf("Error encoding credentials: %v", err)
return nil
}
fmt.Print(string(raw))
return nil
}
rawJSON, err := json.Marshal(&dockercredentials.Request{ServerURL: strings.TrimSpace(string(url))})
if err != nil {
return err
}
response, err := devpodhttp.GetHTTPClient().Post("http://localhost:"+strconv.Itoa(cmd.Port)+"/docker-credentials", "application/json", bytes.NewReader(rawJSON))
if err != nil {
log.Errorf("Error retrieving credentials: %v", err)
return nil
}
defer response.Body.Close()
raw, err := io.ReadAll(response.Body)
if err != nil {
log.Errorf("Error reading credentials: %v", err)
return nil
}
// has the request succeeded?
if response.StatusCode != http.StatusOK {
log.Errorf("Error reading credentials (%d): %v", response.StatusCode, string(raw))
return nil
}
// try to unmarshal
err = json.Unmarshal(raw, &dockercredentials.Credentials{})
if err != nil {
log.Errorf("Error parsing credentials: %v", err)
return nil
}
// print response to stdout
fmt.Print(string(raw))
return nil
}
func getDockerCredentialsFromWorkspaceServer(credentials *dockercredentials.Credentials) *dockercredentials.Credentials {
if _, err := os.Stat(filepath.Join(container.RootDir, ts.RunnerProxySocket)); err != nil {
// workspace server is not running
return nil
}
httpClient := &http.Client{
Transport: &http.Transport{
DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
return net.Dial("unix", filepath.Join(container.RootDir, ts.RunnerProxySocket))
},
},
Timeout: 15 * time.Second,
}
credentials, credentialsErr := requestDockerCredentials(httpClient, credentials, "http://runner-proxy/docker-credentials")
if credentialsErr != nil {
// append error to /var/devpod/docker-credentials.log
file, err := os.OpenFile("/var/devpod/docker-credentials-error.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil
}
defer file.Close()
_, _ = file.WriteString(fmt.Sprintf("get credentials from workspace server: %v\n", credentialsErr))
return nil
}
return credentials
}
func requestDockerCredentials(httpClient *http.Client, credentials *dockercredentials.Credentials, url string) (*dockercredentials.Credentials, error) {
rawJSON, err := json.Marshal(credentials)
if err != nil {
return nil, fmt.Errorf("error marshalling credentials: %w", err)
}
response, err := httpClient.Post(url, "application/json", bytes.NewReader(rawJSON))
if err != nil {
return nil, fmt.Errorf("error retrieving credentials from credentials server: %w", err)
}
defer response.Body.Close()
raw, err := io.ReadAll(response.Body)
if err != nil {
return nil, fmt.Errorf("error reading credentials: %w", err)
}
// has the request succeeded?
if response.StatusCode != http.StatusOK {
return nil, fmt.Errorf("error reading credentials (%d): %s", response.StatusCode, string(raw))
}
credentials = &dockercredentials.Credentials{}
err = json.Unmarshal(raw, credentials)
if err != nil {
return nil, fmt.Errorf("error decoding credentials: %w", err)
}
return credentials, nil
}
================================================
FILE: cmd/agent/git_credentials.go
================================================
package agent
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net"
"net/http"
"os"
"path/filepath"
"strconv"
"github.com/loft-sh/devpod/cmd/agent/container"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/gitcredentials"
devpodhttp "github.com/loft-sh/devpod/pkg/http"
"github.com/loft-sh/devpod/pkg/ts"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// GitCredentialsCmd holds the cmd flags
type GitCredentialsCmd struct {
*flags.GlobalFlags
Port int
}
// NewGitCredentialsCmd creates a new command
func NewGitCredentialsCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &GitCredentialsCmd{
GlobalFlags: flags,
}
gitCredentialsCmd := &cobra.Command{
Use: "git-credentials",
Short: "Retrieves git-credentials from the local machine",
RunE: func(_ *cobra.Command, args []string) error {
return cmd.Run(context.Background(), args, log.Default.ErrorStreamOnly())
},
}
gitCredentialsCmd.Flags().IntVar(&cmd.Port, "port", 0, "If specified, will use the given port")
return gitCredentialsCmd
}
func (cmd *GitCredentialsCmd) Run(ctx context.Context, args []string, log log.Logger) error {
if len(args) == 0 {
return nil
} else if args[0] != "get" {
return nil
}
raw, err := io.ReadAll(os.Stdin)
if err != nil {
return err
}
credentialsReq, err := gitcredentials.Parse(string(raw))
if err != nil {
return err
}
// try to get the credentials from the workspace server first
credentials := getCredentialsFromWorkspaceServer(credentialsReq)
if credentials == nil && cmd.Port != 0 {
// try to get the credentials from the local machine
credentials = getCredentialsFromLocalMachine(credentialsReq, cmd.Port)
}
// if we still don't have credentials, just return nothing
if credentials == nil {
return nil
}
// print response to stdout
fmt.Print(gitcredentials.ToString(credentials))
return nil
}
func getCredentialsFromWorkspaceServer(credentials *gitcredentials.GitCredentials) *gitcredentials.GitCredentials {
if _, err := os.Stat(filepath.Join(container.RootDir, ts.RunnerProxySocket)); err != nil {
// workspace server is not running
return nil
}
httpClient := &http.Client{
Transport: &http.Transport{
DialContext: func(_ context.Context, _, _ string) (net.Conn, error) {
return net.Dial("unix", filepath.Join(container.RootDir, ts.RunnerProxySocket))
},
},
}
credentials, credentialsErr := doRequest(httpClient, credentials, "http://runner-proxy/git-credentials")
if credentialsErr != nil {
// append error to /tmp/git-credentials.log
file, err := os.OpenFile("/tmp/git-credentials-error.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil
}
defer file.Close()
_, _ = file.WriteString(fmt.Sprintf("get credentials from workspace server: %v\n", credentialsErr))
return nil
}
return credentials
}
func getCredentialsFromLocalMachine(credentials *gitcredentials.GitCredentials, port int) *gitcredentials.GitCredentials {
credentials, credentialsErr := doRequest(devpodhttp.GetHTTPClient(), credentials, "http://localhost:"+strconv.Itoa(port)+"/git-credentials")
if credentialsErr != nil {
// append error to /tmp/git-credentials.log
file, err := os.OpenFile("/tmp/git-credentials-error.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
return nil
}
defer file.Close()
_, _ = file.WriteString(fmt.Sprintf("get credentials from local machine: %v\n", credentialsErr))
return nil
}
return credentials
}
func doRequest(httpClient *http.Client, credentials *gitcredentials.GitCredentials, url string) (*gitcredentials.GitCredentials, error) {
rawJSON, err := json.Marshal(credentials)
if err != nil {
return nil, fmt.Errorf("error marshalling credentials: %w", err)
}
response, err := httpClient.Post(url, "application/json", bytes.NewReader(rawJSON))
if err != nil {
return nil, fmt.Errorf("error retrieving credentials from credentials server: %w", err)
}
defer response.Body.Close()
raw, err := io.ReadAll(response.Body)
if err != nil {
return nil, fmt.Errorf("error reading credentials: %w", err)
}
// has the request succeeded?
if response.StatusCode != http.StatusOK {
return nil, fmt.Errorf("error reading credentials (%d): %s", response.StatusCode, string(raw))
}
credentials = &gitcredentials.GitCredentials{}
err = json.Unmarshal(raw, credentials)
if err != nil {
return nil, fmt.Errorf("error decoding credentials: %w", err)
}
return credentials, nil
}
================================================
FILE: cmd/agent/git_ssh_signature.go
================================================
package agent
import (
"errors"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/gitsshsigning"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
type GitSSHSignatureCmd struct {
*flags.GlobalFlags
CertPath string
Namespace string
BufferFile string
Command string
}
// NewGitSSHSignatureCmd creates new git-ssh-signature command
// This agent command can be used as git ssh program by setting
//
// > git config --global gpg.ssh.program "devpod agent git-ssh-signature"
//
// Git by default uses ssh-keygen for signing commits with ssh. This CLI command is a drop-in
// replacement for ssh-keygen and hence needs to support ssh-keygen interface that git uses.
//
// custom-ssh-signature-handler -Y sign -n git -f /Users/johndoe/.ssh/my-key.pub /tmp/.git_signing_buffer_tmp4Euk6d
func NewGitSSHSignatureCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &GitSSHSignatureCmd{
GlobalFlags: flags,
}
gitSshSignatureCmd := &cobra.Command{
Use: "git-ssh-signature",
RunE: func(_ *cobra.Command, args []string) error {
logger := log.GetInstance()
if len(args) < 1 {
logger.Fatalf("Buffer file is required")
}
// Check if the required -Y sign flags are present
if cmd.Command != "sign" {
return errors.New("must include '-Y sign' arguments")
}
// The last argument is the buffer file
cmd.BufferFile = args[len(args)-1]
return gitsshsigning.HandleGitSSHProgramCall(
cmd.CertPath, cmd.Namespace, cmd.BufferFile, logger)
},
}
gitSshSignatureCmd.Flags().StringVarP(&cmd.CertPath, "file", "f", "", "Path to the private key")
gitSshSignatureCmd.Flags().StringVarP(&cmd.Namespace, "namespace", "n", "", "Namespace")
gitSshSignatureCmd.Flags().StringVarP(&cmd.Command, "command", "Y", "sign", "Command - should be 'sign'")
return gitSshSignatureCmd
}
================================================
FILE: cmd/agent/git_ssh_signature_helper.go
================================================
package agent
import (
"fmt"
"os/user"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/gitsshsigning"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
type GitSSHSignatureHelperCmd struct {
*flags.GlobalFlags
CertPath string
}
// NewGitSSHSignatureHelperCmd creates a new git-ssh-signature-helper command
// This agent command can be used to inject the Git SSH signature helper.
//
// This command is used to set up the environment for Git SSH signature verification by configuring
// the necessary helper using a provided signing key path.
//
// Example usage:
//
// git-ssh-signature-helper [signing-key-path]
//
// The signing key path is a required argument for this command. It should be what equal to what you would have set as user.signingkey git config.
func NewGitSSHSignatureHelperCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &GitSSHSignatureCmd{
GlobalFlags: flags,
}
gitSshSignatureHelperCmd := &cobra.Command{
Use: "git-ssh-signature-helper [signing-key-path]",
Short: "used to inject git ssh signature helper",
RunE: func(_ *cobra.Command, args []string) error {
usr, err := user.Current()
if err != nil {
return err
}
if len(args) < 1 {
return fmt.Errorf("gitSigningKey argument is required")
}
cmd.CertPath = args[0]
log := log.GetInstance()
err = gitsshsigning.ConfigureHelper(usr.Username, cmd.CertPath, log)
if err != nil {
return err
}
return nil
},
}
return gitSshSignatureHelperCmd
}
================================================
FILE: cmd/agent/workspace/build.go
================================================
package workspace
import (
"context"
"os"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
// BuildCmd holds the cmd flags
type BuildCmd struct {
*flags.GlobalFlags
WorkspaceInfo string
}
// NewBuildCmd creates a new command
func NewBuildCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &BuildCmd{
GlobalFlags: flags,
}
buildCmd := &cobra.Command{
Use: "build",
Short: "Builds a devcontainer",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
buildCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = buildCmd.MarkFlagRequired("workspace-info")
return buildCmd
}
// Run runs the command logic
func (cmd *BuildCmd) Run(ctx context.Context) error {
// write workspace info
shouldExit, workspaceInfo, err := agent.WriteWorkspaceInfoAndDeleteOld(cmd.WorkspaceInfo, func(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
return deleteWorkspace(ctx, workspaceInfo, log)
}, log.Default.ErrorStreamOnly())
if err != nil {
return err
} else if shouldExit {
return nil
}
// make sure daemon does shut us down while we are doing things
agent.CreateWorkspaceBusyFile(workspaceInfo.Origin)
defer agent.DeleteWorkspaceBusyFile(workspaceInfo.Origin)
// initialize the workspace
cancelCtx, cancel := context.WithCancel(ctx)
defer cancel()
_, logger, credentialsDir, err := initWorkspace(cancelCtx, cancel, workspaceInfo, cmd.Debug, false)
if err != nil {
return err
} else if credentialsDir != "" {
defer func() {
_ = os.RemoveAll(credentialsDir)
}()
}
runner, err := CreateRunner(workspaceInfo, logger)
if err != nil {
return err
}
// if there is no platform specified, we use empty to let
// the builder find out itself.
platforms := workspaceInfo.CLIOptions.Platforms
if len(platforms) == 0 {
platforms = []string{""}
}
// build and push images
for _, platform := range platforms {
// build the image
imageName, err := runner.Build(ctx, provider2.BuildOptions{
CLIOptions: workspaceInfo.CLIOptions,
RegistryCache: workspaceInfo.RegistryCache,
Platform: platform,
ExportCache: true,
})
if err != nil {
logger.Errorf("Error building image: %v", err)
return errors.Wrap(err, "build")
}
if workspaceInfo.CLIOptions.SkipPush {
logger.Donef("Successfully build image %s", imageName)
} else {
logger.Donef("Successfully build and pushed image %s", imageName)
}
}
return nil
}
func deleteWorkspace(ctx context.Context, workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
err := removeContainer(ctx, workspaceInfo, log)
if err != nil {
log.Errorf("Removing container: %v", err)
}
_ = os.RemoveAll(workspaceInfo.Origin)
return nil
}
================================================
FILE: cmd/agent/workspace/delete.go
================================================
package workspace
import (
"context"
"fmt"
"os"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
agentdaemon "github.com/loft-sh/devpod/pkg/daemon/agent"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
// DeleteCmd holds the cmd flags
type DeleteCmd struct {
*flags.GlobalFlags
Container bool
Daemon bool
WorkspaceInfo string
}
// NewDeleteCmd creates a new command
func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &DeleteCmd{
GlobalFlags: flags,
}
deleteCmd := &cobra.Command{
Use: "delete",
Short: "Cleans up a workspace on the remote server",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
deleteCmd.Flags().BoolVar(&cmd.Container, "container", true, "If enabled, cleans up the DevPod container")
deleteCmd.Flags().BoolVar(&cmd.Daemon, "daemon", false, "If enabled, cleans up the DevPod daemon")
deleteCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = deleteCmd.MarkFlagRequired("workspace-info")
return deleteCmd
}
func (cmd *DeleteCmd) Run(ctx context.Context) error {
// get workspace
shouldExit, workspaceInfo, err := agent.WorkspaceInfo(cmd.WorkspaceInfo, log.Default.ErrorStreamOnly())
if err != nil {
return fmt.Errorf("error parsing workspace info: %w", err)
} else if shouldExit {
return nil
}
// remove daemon
if cmd.Daemon {
err = removeDaemon(workspaceInfo, log.Default)
if err != nil {
return errors.Wrap(err, "remove daemon")
}
}
// cleanup docker container
if cmd.Container {
err = removeContainer(ctx, workspaceInfo, log.Default)
if err != nil {
return errors.Wrap(err, "remove container")
}
}
// delete workspace folder
_ = os.RemoveAll(workspaceInfo.Origin)
return nil
}
func removeContainer(ctx context.Context, workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
log.Debugf("Removing DevPod container from server...")
runner, err := CreateRunner(workspaceInfo, log)
if err != nil {
return err
}
if workspaceInfo.Workspace.Source.Container != "" {
log.Infof("Skipping container deletion, since it was not created by DevPod")
} else {
err = runner.Delete(ctx)
if err != nil {
return err
}
log.Debugf("Successfully removed DevPod container from server")
}
return nil
}
func removeDaemon(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
if len(workspaceInfo.Agent.Exec.Shutdown) == 0 {
return nil
}
log.Debugf("Removing DevPod daemon from server...")
err := agentdaemon.RemoveDaemon()
if err != nil {
return errors.Wrap(err, "remove daemon")
}
log.Debugf("Successfully removed DevPod daemon from server")
return nil
}
================================================
FILE: cmd/agent/workspace/install_dotfiles.go
================================================
package workspace
import (
"context"
"os"
"os/exec"
"path/filepath"
"strings"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/git"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// InstallDotfilesCmd holds the installDotfiles cmd flags
type InstallDotfilesCmd struct {
*flags.GlobalFlags
Repository string
InstallScript string
StrictHostKeyChecking bool
}
// NewInstallDotfilesCmd creates a new command
func NewInstallDotfilesCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &InstallDotfilesCmd{
GlobalFlags: flags,
}
installDotfilesCmd := &cobra.Command{
Use: "install-dotfiles",
Short: "installs input dotfiles in the container",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
installDotfilesCmd.Flags().StringVar(&cmd.Repository, "repository", "", "The dotfiles repository")
installDotfilesCmd.Flags().StringVar(&cmd.InstallScript, "install-script", "", "The dotfiles install command to execute")
installDotfilesCmd.Flags().BoolVar(&cmd.StrictHostKeyChecking, "strict-host-key-checking", false, "Set to enable strict host key checking for git cloning via SSH")
return installDotfilesCmd
}
// Run runs the command logic
func (cmd *InstallDotfilesCmd) Run(ctx context.Context) error {
logger := log.Default.ErrorStreamOnly()
targetDir := filepath.Join(os.Getenv("HOME"), "dotfiles")
_, err := os.Stat(targetDir)
if err != nil {
logger.Infof("Cloning dotfiles %s", cmd.Repository)
gitInfo := git.NormalizeRepositoryGitInfo(cmd.Repository)
if err := git.CloneRepository(ctx, gitInfo, targetDir, "", cmd.StrictHostKeyChecking, logger); err != nil {
return err
}
} else {
logger.Info("dotfiles already set up, skipping cloning")
}
logger.Debugf("Entering dotfiles directory")
err = os.Chdir(targetDir)
if err != nil {
return err
}
if cmd.InstallScript != "" {
logger.Infof("Executing install script %s", cmd.InstallScript)
command := "./" + strings.TrimPrefix(cmd.InstallScript, "./")
err := ensureExecutable(command)
if err != nil {
return errors.Wrapf(err, "failed to make install script %s executable", command)
}
scriptCmd := exec.Command(command)
writer := logger.Writer(logrus.InfoLevel, false)
scriptCmd.Stdout = writer
scriptCmd.Stderr = writer
return scriptCmd.Run()
}
logger.Debugf("Install script not specified, trying known locations")
return setupDotfiles(logger)
}
var scriptLocations = []string{
"./install.sh",
"./install",
"./bootstrap.sh",
"./bootstrap",
"./script/bootstrap",
"./setup.sh",
"./setup",
"./setup/setup",
}
func setupDotfiles(logger log.Logger) error {
for _, command := range scriptLocations {
logger.Debugf("Trying executing %s", command)
writer := logger.Writer(logrus.InfoLevel, false)
err := ensureExecutable(command)
if err != nil {
logger.Infof("Failed to make install script %s executable: %v", command, err)
logger.Debug("Trying next location")
continue
}
scriptCmd := exec.Command(command)
scriptCmd.Stdout = writer
scriptCmd.Stderr = writer
err = scriptCmd.Run()
if err != nil {
logger.Infof("Execution of %s was unsuccessful: %v", command, err)
logger.Debug("Trying next location")
continue
}
// we successfully executed one of the commands, let's exit
return nil
}
logger.Info("Finished script locations, trying to link the files")
files, err := os.ReadDir(".")
if err != nil {
return err
}
pwd, err := os.Getwd()
if err != nil {
return err
}
// link dotfiles in directory to home
for _, file := range files {
if strings.HasPrefix(file.Name(), ".") && !file.IsDir() {
logger.Debugf("linking %s in home", file.Name())
// remove existing symlink and relink
if _, err := os.Lstat(filepath.Join(os.Getenv("HOME"), file.Name())); err == nil {
os.Remove(filepath.Join(os.Getenv("HOME"), file.Name()))
}
err = os.Symlink(filepath.Join(pwd, file.Name()), filepath.Join(os.Getenv("HOME"), file.Name()))
if err != nil {
return err
}
}
}
return nil
}
func ensureExecutable(path string) error {
checkCmd := exec.Command("test", "-f", path)
err := checkCmd.Run()
if err != nil {
return errors.Wrapf(err, "install script %s not found", path)
}
chmodCmd := exec.Command("chmod", "+x", path)
err = chmodCmd.Run()
if err != nil {
return errors.Wrapf(err, "failed to make install script %s executable", path)
}
return nil
}
================================================
FILE: cmd/agent/workspace/logs.go
================================================
package workspace
import (
"context"
"fmt"
"os"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/devcontainer"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// LogsCmd holds the cmd flags
type LogsCmd struct {
*flags.GlobalFlags
ID string
}
// NewLogsCmd creates a new command
func NewLogsCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &LogsCmd{
GlobalFlags: flags,
}
c := &cobra.Command{
Use: "logs",
Short: "Returns the workspace container logs",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
c.Flags().StringVar(&cmd.ID, "id", "", "The workspace id")
_ = c.MarkFlagRequired("id")
return c
}
func (cmd *LogsCmd) Run(ctx context.Context) error {
// get workspace info
shouldExit, workspaceInfo, err := agent.ReadAgentWorkspaceInfo(cmd.AgentDir, cmd.Context, cmd.ID, log.Default.ErrorStreamOnly())
if err != nil {
return err
} else if shouldExit {
return nil
}
logger := log.Default.ErrorStreamOnly()
// create new runner
runner, err := devcontainer.NewRunner(agent.ContainerDevPodHelperLocation, agent.DefaultAgentDownloadURL(), workspaceInfo, logger)
if err != nil {
return fmt.Errorf("create runner: %w", err)
}
// write devcontainer logs to stdout
return runner.Logs(ctx, os.Stdout)
}
================================================
FILE: cmd/agent/workspace/logs_daemon.go
================================================
package workspace
import (
"context"
"io"
"os"
"path/filepath"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
// LogsDaemonCmd holds the cmd flags
type LogsDaemonCmd struct {
*flags.GlobalFlags
ID string
}
// NewLogsDaemonCmd creates a new command
func NewLogsDaemonCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &LogsDaemonCmd{
GlobalFlags: flags,
}
logsDaemonCmd := &cobra.Command{
Use: "logs-daemon",
Short: "Returns the daemon logs",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
logsDaemonCmd.Flags().StringVar(&cmd.ID, "id", "", "The workspace id")
_ = logsDaemonCmd.MarkFlagRequired("id")
return logsDaemonCmd
}
func (cmd *LogsDaemonCmd) Run(ctx context.Context) error {
// get workspace
shouldExit, _, err := agent.ReadAgentWorkspaceInfo(cmd.AgentDir, cmd.Context, cmd.ID, log.Default.ErrorStreamOnly())
if err != nil {
return err
} else if shouldExit {
return nil
}
logFolder, err := agent.GetAgentDaemonLogFolder(cmd.AgentDir)
if err != nil {
return err
}
f, err := os.Open(filepath.Join(logFolder, "agent-daemon.log"))
if err != nil {
return errors.Wrap(err, "open agent-daemon.log")
}
defer f.Close()
_, err = io.Copy(os.Stdout, f)
return err
}
================================================
FILE: cmd/agent/workspace/setup_gpg.go
================================================
package workspace
import (
"context"
"encoding/base64"
"fmt"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/credentials"
"github.com/loft-sh/devpod/pkg/gitcredentials"
"github.com/loft-sh/devpod/pkg/gpg"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// SetupGPGCmd holds the setupGPG cmd flags
type SetupGPGCmd struct {
*flags.GlobalFlags
OwnerTrust string
SocketPath string
GitKey string
}
// NewSetupGPGCmd creates a new command
func NewSetupGPGCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &SetupGPGCmd{
GlobalFlags: flags,
}
setupGPGCmd := &cobra.Command{
Use: "setup-gpg",
Short: "setups gpg-agent forwarding in the container",
Args: cobra.NoArgs,
RunE: func(cobraCmd *cobra.Command, _ []string) error {
return cmd.Run(cobraCmd.Context(), log.Default.ErrorStreamOnly())
},
}
setupGPGCmd.Flags().StringVar(&cmd.OwnerTrust, "ownertrust", "", "GPG Owner trust to import in armor form")
setupGPGCmd.Flags().StringVar(&cmd.SocketPath, "socketpath", "", "path to the gpg socket forwarded")
setupGPGCmd.Flags().StringVar(&cmd.GitKey, "gitkey", "", "gpg key to use for git commit signing")
return setupGPGCmd
}
// will forward a local gpg-agent into the remote container
// this works by
//
// - stopping remote gpg-agent and removing the sockets
// - exporting local public keys and owner trust
// - importing those into the container
// - ensuring the gpg-agent is stopped in the container
// - starting a reverse-tunnel of the local unix socket to remote
// - ensuring paths and permissions are correctly set in the remote
func (cmd *SetupGPGCmd) Run(ctx context.Context, log log.Logger) error {
log.Debugf("Initializing gpg-agent forwarding")
log.Debugf("Fetching public key")
rawPublicKeys, err := getPublicKeys(log)
if err != nil {
log.Errorf("Fetch public key: %v", err)
return err
}
log.Debugf("Decoding public key")
publicKey, err := base64.StdEncoding.DecodeString(rawPublicKeys)
if err != nil {
return err
}
log.Debugf("Decoding input owner trust")
ownerTrust, err := base64.StdEncoding.DecodeString(cmd.OwnerTrust)
if err != nil {
return err
}
gpgConf := gpg.GPGConf{
PublicKey: publicKey,
OwnerTrust: ownerTrust,
SocketPath: cmd.SocketPath,
GitKey: cmd.GitKey,
}
log.Debugf("Stopping container gpg-agent")
err = gpgConf.StopGpgAgent()
if err != nil {
log.Errorf("stop container gpg-agent: %v", err)
return err
}
log.Debugf("Importing gpg public key in container")
err = gpgConf.ImportGpgKey()
if err != nil {
log.Errorf("Import gpg public key in container: %v", err)
return err
}
log.Debugf("Importing gpg owner trust in container")
err = gpgConf.ImportOwnerTrust()
if err != nil {
log.Errorf("Import gpg owner trust in container: %v", err)
return err
}
log.Debugf("Ensuring paths existence and permissions")
err = gpgConf.SetupRemoteSocketDirTree()
if err != nil {
log.Errorf("Ensure paths existence and permissions: %v", err)
return err
}
// Now we again kill the agent and remove the socket to really be sure every
// thing is clean
log.Debugf("Ensure stopping container gpg-agent")
err = gpgConf.StopGpgAgent()
if err != nil {
log.Errorf("Ensure stopping container gpg-agent: %v", err)
return err
}
log.Debugf("Setup local gnupg socket links")
err = gpgConf.SetupRemoteSocketLink()
if err != nil {
log.Errorf("Setup local gnupg socket links: %v", err)
return err
}
log.Debugf("Setup gpg.conf")
err = gpgConf.SetupGpgConf()
if err != nil {
log.Errorf("Setup gpg.conf: %v", err)
return err
}
if gpgConf.GitKey != "" {
log.Debugf("Setup git signing key")
err = gitcredentials.SetupGpgGitKey(gpgConf.GitKey)
if err != nil {
log.Errorf("Setup git signing key: %v", err)
return err
}
}
return nil
}
func getPublicKeys(log log.Logger) (string, error) {
port, err := credentials.GetPort()
if err != nil {
return "", fmt.Errorf("get port: %w", err)
}
out, err := credentials.PostWithRetry(port, "gpg-public-keys", nil, log)
if err != nil {
return "", fmt.Errorf("get public gpg keys: %w", err)
}
return string(out), nil
}
================================================
FILE: cmd/agent/workspace/status.go
================================================
package workspace
import (
"context"
"fmt"
"strings"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/client"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// StatusCmd holds the cmd flags
type StatusCmd struct {
*flags.GlobalFlags
WorkspaceInfo string
}
// NewStatusCmd creates a new command
func NewStatusCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &StatusCmd{
GlobalFlags: flags,
}
statusCmd := &cobra.Command{
Use: "status",
Short: "Print the status of a remote container",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background(), log.Default.ErrorStreamOnly())
},
}
statusCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = statusCmd.MarkFlagRequired("workspace-info")
return statusCmd
}
func (cmd *StatusCmd) Run(ctx context.Context, log log.Logger) error {
// get workspace
shouldExit, workspaceInfo, err := agent.WorkspaceInfo(cmd.WorkspaceInfo, log)
if err != nil {
return err
} else if shouldExit {
return nil
}
// create runner
runner, err := CreateRunner(workspaceInfo, log)
if err != nil {
return err
}
// find dev container
containerDetails, err := runner.Find(ctx)
if err != nil {
return err
} else if containerDetails == nil {
fmt.Print(client.StatusNotFound)
return nil
}
// is running?
if strings.ToLower(containerDetails.State.Status) == "running" {
fmt.Print(client.StatusRunning)
return nil
} else if strings.ToLower(containerDetails.State.Status) == "exited" {
fmt.Print(client.StatusStopped)
return nil
}
fmt.Print(client.StatusBusy)
return nil
}
================================================
FILE: cmd/agent/workspace/stop.go
================================================
package workspace
import (
"context"
"fmt"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
// StopCmd holds the cmd flags
type StopCmd struct {
*flags.GlobalFlags
WorkspaceInfo string
}
// NewStopCmd creates a new command
func NewStopCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &StopCmd{
GlobalFlags: flags,
}
stopCmd := &cobra.Command{
Use: "stop",
Short: "Stops a workspace on the remote server",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
stopCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = stopCmd.MarkFlagRequired("workspace-info")
return stopCmd
}
func (cmd *StopCmd) Run(ctx context.Context) error {
// get workspace
shouldExit, workspaceInfo, err := agent.WriteWorkspaceInfo(cmd.WorkspaceInfo, log.Default.ErrorStreamOnly())
if err != nil {
return fmt.Errorf("error parsing workspace info: %w", err)
} else if shouldExit {
return nil
}
// stop docker container
err = stopContainer(ctx, workspaceInfo, log.Default)
if err != nil {
return errors.Wrap(err, "stop container")
}
return nil
}
func stopContainer(ctx context.Context, workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
log.Debugf("Stopping DevPod container...")
runner, err := CreateRunner(workspaceInfo, log)
if err != nil {
return err
}
err = runner.Stop(ctx)
if err != nil {
return err
}
log.Debugf("Successfully stopped DevPod container")
return nil
}
================================================
FILE: cmd/agent/workspace/up.go
================================================
package workspace
import (
"context"
"encoding/json"
"fmt"
"os"
"os/exec"
"path/filepath"
"strconv"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/agent/tunnel"
"github.com/loft-sh/devpod/pkg/agent/tunnelserver"
"github.com/loft-sh/devpod/pkg/binaries"
"github.com/loft-sh/devpod/pkg/client/clientimplementation"
"github.com/loft-sh/devpod/pkg/command"
"github.com/loft-sh/devpod/pkg/credentials"
agentdaemon "github.com/loft-sh/devpod/pkg/daemon/agent"
"github.com/loft-sh/devpod/pkg/devcontainer"
config2 "github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/devcontainer/crane"
"github.com/loft-sh/devpod/pkg/dockercredentials"
"github.com/loft-sh/devpod/pkg/extract"
provider2 "github.com/loft-sh/devpod/pkg/provider"
"github.com/loft-sh/devpod/pkg/util"
"github.com/loft-sh/devpod/scripts"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// UpCmd holds the up cmd flags
type UpCmd struct {
*flags.GlobalFlags
WorkspaceInfo string
}
// NewUpCmd creates a new command
func NewUpCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &UpCmd{
GlobalFlags: flags,
}
upCmd := &cobra.Command{
Use: "up",
Short: "Starts a new devcontainer",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
upCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = upCmd.MarkFlagRequired("workspace-info")
return upCmd
}
// Run runs the command logic
func (cmd *UpCmd) Run(ctx context.Context) error {
// get workspace
shouldExit, workspaceInfo, err := agent.WriteWorkspaceInfoAndDeleteOld(cmd.WorkspaceInfo, func(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
return deleteWorkspace(ctx, workspaceInfo, log)
}, log.Default.ErrorStreamOnly())
if err != nil {
return fmt.Errorf("error parsing workspace info: %w", err)
} else if shouldExit {
return nil
}
// make sure daemon doesn't shut us down while we are doing things
if !workspaceInfo.CLIOptions.Platform.Enabled {
agent.CreateWorkspaceBusyFile(workspaceInfo.Origin)
defer agent.DeleteWorkspaceBusyFile(workspaceInfo.Origin)
}
// initialize the workspace
cancelCtx, cancel := context.WithCancel(ctx)
defer cancel()
tunnelClient, logger, credentialsDir, err := initWorkspace(cancelCtx, cancel, workspaceInfo, cmd.Debug, !workspaceInfo.CLIOptions.Platform.Enabled && !workspaceInfo.CLIOptions.DisableDaemon)
if err != nil {
err1 := clientimplementation.DeleteWorkspaceFolder(workspaceInfo.Workspace.Context, workspaceInfo.Workspace.ID, workspaceInfo.Workspace.SSHConfigPath, logger)
if err1 != nil {
return errors.Wrap(err, err1.Error())
}
return err
} else if credentialsDir != "" {
defer func() {
_ = os.RemoveAll(credentialsDir)
}()
}
// start up
err = cmd.up(ctx, workspaceInfo, tunnelClient, logger)
if err != nil {
return errors.Wrap(err, "devcontainer up")
}
return nil
}
func (cmd *UpCmd) up(ctx context.Context, workspaceInfo *provider2.AgentWorkspaceInfo, tunnelClient tunnel.TunnelClient, logger log.Logger) error {
// create devcontainer
result, err := cmd.devPodUp(ctx, workspaceInfo, logger)
if err != nil {
return err
}
// send result
out, err := json.Marshal(result)
if err != nil {
return err
}
_, err = tunnelClient.SendResult(ctx, &tunnel.Message{Message: string(out)})
if err != nil {
return errors.Wrap(err, "send result")
}
return nil
}
func (cmd *UpCmd) devPodUp(ctx context.Context, workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) (*config2.Result, error) {
runner, err := CreateRunner(workspaceInfo, log)
if err != nil {
return nil, err
}
// start the devcontainer
result, err := runner.Up(ctx, devcontainer.UpOptions{
CLIOptions: workspaceInfo.CLIOptions,
RegistryCache: workspaceInfo.RegistryCache,
}, workspaceInfo.InjectTimeout)
if err != nil {
return nil, err
}
return result, nil
}
func CreateRunner(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) (devcontainer.Runner, error) {
return devcontainer.NewRunner(agent.ContainerDevPodHelperLocation, agent.DefaultAgentDownloadURL(), workspaceInfo, log)
}
func InitContentFolder(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) (bool, error) {
// check if workspace content folder exists
_, err := os.Stat(workspaceInfo.ContentFolder)
if err == nil {
log.Debugf("Workspace Folder already exists %s", workspaceInfo.ContentFolder)
return true, nil
}
// make content dir
log.Debugf("Create content folder %s", workspaceInfo.ContentFolder)
err = os.MkdirAll(workspaceInfo.ContentFolder, 0o777)
if err != nil {
return false, errors.Wrap(err, "make workspace folder")
}
// download provider
binariesDir, err := agent.GetAgentBinariesDir(workspaceInfo.Agent.DataPath, workspaceInfo.Workspace.Context, workspaceInfo.Workspace.ID)
if err != nil {
_ = os.RemoveAll(workspaceInfo.ContentFolder)
return false, fmt.Errorf("error getting workspace %s binaries dir: %w", workspaceInfo.Workspace.ID, err)
}
// download binaries
_, err = binaries.DownloadBinaries(workspaceInfo.Agent.Binaries, binariesDir, log)
if err != nil {
_ = os.RemoveAll(workspaceInfo.ContentFolder)
return false, fmt.Errorf("error downloading workspace %s binaries: %w", workspaceInfo.Workspace.ID, err)
}
// if workspace was already executed, we skip this part
if workspaceInfo.LastDevContainerConfig != nil {
// make sure the devcontainer.json exists
err = ensureLastDevContainerJson(workspaceInfo)
if err != nil {
log.Errorf("Ensure devcontainer.json: %v", err)
}
return true, nil
}
return false, nil
}
func initWorkspace(ctx context.Context, cancel context.CancelFunc, workspaceInfo *provider2.AgentWorkspaceInfo, debug, shouldInstallDaemon bool) (tunnel.TunnelClient, log.Logger, string, error) {
// create a grpc client
tunnelClient, err := tunnelserver.NewTunnelClient(os.Stdin, os.Stdout, true, 0)
if err != nil {
return nil, nil, "", fmt.Errorf("error creating tunnel client: %w", err)
}
// create debug logger
logger := tunnelserver.NewTunnelLogger(ctx, tunnelClient, debug)
logger.Debugf("Created logger")
// this message serves as a ping to the client
_, err = tunnelClient.Ping(ctx, &tunnel.Empty{})
if err != nil {
return nil, nil, "", errors.Wrap(err, "ping client")
}
// get docker credentials
dockerCredentialsDir, gitCredentialsHelper, err := configureCredentials(ctx, cancel, workspaceInfo, tunnelClient, logger)
if err != nil {
logger.Errorf("Error retrieving docker / git credentials: %v", err)
}
// install docker in background
errChan := make(chan error, 2)
go func() {
if !workspaceInfo.Agent.IsDockerDriver() || workspaceInfo.Agent.Docker.Install == "false" {
errChan <- nil
} else {
errChan <- installDocker(logger)
}
}()
// prepare workspace
err = prepareWorkspace(ctx, workspaceInfo, tunnelClient, gitCredentialsHelper, logger)
if err != nil {
return nil, logger, "", err
}
// install daemon
if shouldInstallDaemon {
err = installDaemon(workspaceInfo, logger)
if err != nil {
logger.Errorf("Install DevPod Daemon: %v", err)
}
}
// wait until docker is installed before configuring docker daemon
err = <-errChan
if err != nil {
return nil, nil, "", errors.Wrap(err, "install docker")
}
// If we are provisioning the machine, ensure the daemon has required options
local, err := workspaceInfo.Agent.Local.Bool()
if workspaceInfo.Agent.IsDockerDriver() && err != nil && !local {
errChan <- configureDockerDaemon(ctx, logger)
} else {
logger.Debug("Skipping configuring docker daemon")
errChan <- nil
}
// wait until docker daemon is configured
err = <-errChan
if err != nil {
logger.Warn("Could not find docker daemon config file, if using the registry cache, please ensure the daemon is configured with containerd-snapshotter=true")
logger.Warn("More info at https://docs.docker.com/engine/storage/containerd/")
}
return tunnelClient, logger, dockerCredentialsDir, nil
}
func prepareWorkspace(ctx context.Context, workspaceInfo *provider2.AgentWorkspaceInfo, client tunnel.TunnelClient, helper string, log log.Logger) error {
// change content folder if source is local folder in proxy mode
// to a folder that's known ahead of time inside of DEVPOD_HOME
if workspaceInfo.CLIOptions.Platform.Enabled && workspaceInfo.Workspace.Source.LocalFolder != "" {
workspaceInfo.ContentFolder = agent.GetAgentWorkspaceContentDir(workspaceInfo.Origin)
}
// make sure content folder exists
exists, err := InitContentFolder(workspaceInfo, log)
if err != nil {
return err
} else if exists && !workspaceInfo.CLIOptions.Recreate {
log.Debugf("Workspace exists, skip downloading")
return nil
}
// check what type of workspace this is
if workspaceInfo.Workspace.Source.GitRepository != "" {
if workspaceInfo.CLIOptions.Reset {
log.Info("Resetting git based workspace, removing old content folder")
err = os.RemoveAll(workspaceInfo.ContentFolder)
if err != nil {
log.Warnf("Failed to remove workspace folder, still proceeding: %v", err)
}
}
if workspaceInfo.CLIOptions.Recreate && !workspaceInfo.CLIOptions.Reset && exists {
log.Info("Rebuilding without resetting a git based workspace, keeping old content folder")
return nil
}
if crane.ShouldUse(&workspaceInfo.CLIOptions) {
log.Infof("Pulling devcontainer spec from %v", workspaceInfo.CLIOptions.Platform.EnvironmentTemplate)
return nil
}
return agent.CloneRepositoryForWorkspace(ctx,
&workspaceInfo.Workspace.Source,
&workspaceInfo.Agent,
workspaceInfo.ContentFolder,
helper,
workspaceInfo.CLIOptions,
false,
log,
)
}
if workspaceInfo.Workspace.Source.LocalFolder != "" {
// if we're not sending this to a remote machine, we're already done
if workspaceInfo.ContentFolder == workspaceInfo.Workspace.Source.LocalFolder {
log.Debugf("Local folder %s with local provider; skip downloading", workspaceInfo.ContentFolder)
return nil
}
log.Debugf("Download Local Folder %s", workspaceInfo.ContentFolder)
return downloadLocalFolder(ctx, workspaceInfo.ContentFolder, client, log)
}
if workspaceInfo.Workspace.Source.Image != "" {
log.Debugf("Prepare Image")
return prepareImage(workspaceInfo.ContentFolder, workspaceInfo.Workspace.Source.Image)
}
if workspaceInfo.Workspace.Source.Container != "" {
log.Debugf("Workspace is a container, nothing to do")
return nil
}
return fmt.Errorf("either workspace repository, image, container or local-folder is required")
}
func ensureLastDevContainerJson(workspaceInfo *provider2.AgentWorkspaceInfo) error {
filePath := filepath.Join(workspaceInfo.ContentFolder, filepath.FromSlash(workspaceInfo.LastDevContainerConfig.Path))
_, err := os.Stat(filePath)
if os.IsNotExist(err) {
err = os.MkdirAll(filepath.Dir(filePath), 0o755)
if err != nil {
return fmt.Errorf("create %s: %w", filepath.Dir(filePath), err)
}
raw, err := json.Marshal(workspaceInfo.LastDevContainerConfig.Config)
if err != nil {
return fmt.Errorf("marshal devcontainer.json: %w", err)
}
err = os.WriteFile(filePath, raw, 0o600)
if err != nil {
return fmt.Errorf("write %s: %w", filePath, err)
}
} else if err != nil {
return fmt.Errorf("error stating %s: %w", filePath, err)
}
return nil
}
func configureCredentials(ctx context.Context, cancel context.CancelFunc, workspaceInfo *provider2.AgentWorkspaceInfo, client tunnel.TunnelClient, log log.Logger) (string, string, error) {
if workspaceInfo.Agent.InjectDockerCredentials != "true" && workspaceInfo.Agent.InjectGitCredentials != "true" {
return "", "", nil
}
serverPort, err := credentials.StartCredentialsServer(ctx, cancel, client, log)
if err != nil {
return "", "", err
}
binaryPath, err := os.Executable()
if err != nil {
return "", "", err
}
if workspaceInfo.Origin == "" {
return "", "", fmt.Errorf("workspace folder is not set")
}
dockerCredentials := ""
if workspaceInfo.Agent.InjectDockerCredentials == "true" {
dockerCredentials, err = dockercredentials.ConfigureCredentialsMachine(workspaceInfo.Origin, serverPort, log)
if err != nil {
return "", "", err
}
}
gitCredentials := ""
if workspaceInfo.Agent.InjectGitCredentials == "true" {
gitCredentials = fmt.Sprintf("!'%s' agent git-credentials --port %d", binaryPath, serverPort)
_ = os.Setenv("DEVPOD_GIT_HELPER_PORT", strconv.Itoa(serverPort))
}
return dockerCredentials, gitCredentials, nil
}
func installDaemon(workspaceInfo *provider2.AgentWorkspaceInfo, log log.Logger) error {
if len(workspaceInfo.Agent.Exec.Shutdown) == 0 {
return nil
}
log.Debugf("Installing DevPod daemon into server...")
err := agentdaemon.InstallDaemon(workspaceInfo.Agent.DataPath, workspaceInfo.CLIOptions.DaemonInterval, log)
if err != nil {
return errors.Wrap(err, "install daemon")
}
return nil
}
func downloadLocalFolder(ctx context.Context, workspaceDir string, client tunnel.TunnelClient, log log.Logger) error {
log.Infof("Upload folder to server")
stream, err := client.StreamWorkspace(ctx, &tunnel.Empty{})
if err != nil {
return errors.Wrap(err, "read workspace")
}
err = extract.Extract(tunnelserver.NewStreamReader(stream, log), workspaceDir)
if err != nil {
return errors.Wrap(err, "extract local folder")
}
return nil
}
func prepareImage(workspaceDir, image string) error {
// create a .devcontainer.json with the image
err := os.WriteFile(filepath.Join(workspaceDir, ".devcontainer.json"), []byte(`{
"image": "`+image+`"
}`), 0o600)
if err != nil {
return err
}
return nil
}
func installDocker(log log.Logger) (err error) {
if !command.Exists("docker") {
writer := log.Writer(logrus.InfoLevel, false)
defer writer.Close()
log.Debug("Installing Docker...")
shellCommand := exec.Command("sh", "-c", scripts.InstallDocker)
shellCommand.Stdout = writer
shellCommand.Stderr = writer
err = shellCommand.Run()
}
return err
}
func configureDockerDaemon(ctx context.Context, log log.Logger) (err error) {
log.Info("Configuring docker daemon ...")
// Enable image snapshotter in the dameon
var daemonConfig = []byte(`{
"features": {
"containerd-snapshotter": true
}
}`)
// Check rootless docker
homeDir, err := util.UserHomeDir()
if err != nil {
return err
}
if _, err = os.Stat(fmt.Sprintf("%s/.config/docker", homeDir)); !errors.Is(err, os.ErrNotExist) {
err = os.WriteFile(fmt.Sprintf("%s/.config/docker/daemon.json", homeDir), daemonConfig, 0644)
}
// otherwise assume default
if err != nil {
if err = os.WriteFile("/etc/docker/daemon.json", daemonConfig, 0644); err != nil {
return err
}
}
// reload docker daemon
return exec.CommandContext(ctx, "pkill", "-HUP", "dockerd").Run()
}
================================================
FILE: cmd/agent/workspace/update_config.go
================================================
package workspace
import (
"context"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/log"
"github.com/spf13/cobra"
)
// UpdateConfigCmd holds the cmd flags
type UpdateConfigCmd struct {
*flags.GlobalFlags
WorkspaceInfo string
}
// NewUpdateConfigCmd creates a new command
func NewUpdateConfigCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &UpdateConfigCmd{
GlobalFlags: flags,
}
updateConfigCmd := &cobra.Command{
Use: "update-config",
Short: "Updates the workspace config",
Args: cobra.NoArgs,
RunE: func(_ *cobra.Command, _ []string) error {
return cmd.Run(context.Background())
},
}
updateConfigCmd.Flags().StringVar(&cmd.WorkspaceInfo, "workspace-info", "", "The workspace info")
_ = updateConfigCmd.MarkFlagRequired("workspace-info")
return updateConfigCmd
}
func (cmd *UpdateConfigCmd) Run(ctx context.Context) error {
// write workspace info
shouldExit, _, err := agent.WriteWorkspaceInfo(cmd.WorkspaceInfo, log.Default)
if err != nil {
return err
} else if shouldExit {
return nil
}
return nil
}
================================================
FILE: cmd/agent/workspace/workspace.go
================================================
package workspace
import (
"github.com/loft-sh/devpod/cmd/flags"
"github.com/spf13/cobra"
)
// NewWorkspaceCmd returns a new command
func NewWorkspaceCmd(flags *flags.GlobalFlags) *cobra.Command {
workspaceCmd := &cobra.Command{
Use: "workspace",
Short: "Workspace commands",
}
workspaceCmd.AddCommand(NewUpCmd(flags))
workspaceCmd.AddCommand(NewDeleteCmd(flags))
workspaceCmd.AddCommand(NewStopCmd(flags))
workspaceCmd.AddCommand(NewStatusCmd(flags))
workspaceCmd.AddCommand(NewUpdateConfigCmd(flags))
workspaceCmd.AddCommand(NewBuildCmd(flags))
workspaceCmd.AddCommand(NewLogsDaemonCmd(flags))
workspaceCmd.AddCommand(NewInstallDotfilesCmd(flags))
workspaceCmd.AddCommand(NewSetupGPGCmd(flags))
workspaceCmd.AddCommand(NewLogsCmd(flags))
return workspaceCmd
}
================================================
FILE: cmd/build.go
================================================
package cmd
import (
"context"
"fmt"
"io"
"os"
"github.com/loft-sh/devpod/cmd/flags"
"github.com/loft-sh/devpod/pkg/agent"
"github.com/loft-sh/devpod/pkg/agent/tunnelserver"
"github.com/loft-sh/devpod/pkg/client"
"github.com/loft-sh/devpod/pkg/config"
config2 "github.com/loft-sh/devpod/pkg/devcontainer/config"
"github.com/loft-sh/devpod/pkg/image"
"github.com/loft-sh/devpod/pkg/provider"
workspace2 "github.com/loft-sh/devpod/pkg/workspace"
"github.com/loft-sh/log"
"github.com/pkg/errors"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
)
// BuildCmd holds the cmd flags
type BuildCmd struct {
*flags.GlobalFlags
provider.CLIOptions
ProviderOptions []string
SkipDelete bool
Machine string
}
// NewBuildCmd creates a new command
func NewBuildCmd(flags *flags.GlobalFlags) *cobra.Command {
cmd := &BuildCmd{
GlobalFlags: flags,
}
buildCmd := &cobra.Command{
Use: "build [flags] [workspace-path|workspace-name]",
Short: "Builds a workspace",
RunE: func(cobraCmd *cobra.Command, args []string) error {
ctx := cobraCmd.Context()
devPodConfig, err := config.LoadConfig(cmd.Context, cmd.Provider)
if err != nil {
return err
}
// check permissions
if !cmd.SkipPush && cmd.Repository != "" {
err = image.CheckPushPermissions(cmd.Repository)
if err != nil {
return fmt.Errorf("cannot push to %s, please make sure you have push permissions to repository %s", cmd.Repository, cmd.Repository)
}
}
// validate tags
if len(cmd.Tag) > 0 {
if err := image.ValidateTags(cmd.Tag); err != nil {
return fmt.Errorf("cannot build image, %w", err)
}
}
if devPodConfig.ContextOption(config.ContextOptionSSHStrictHostKeyChecking) == "true" {
cmd.StrictHostKeyChecking = true
}
// create a temporary workspace
exists := workspace2.Exists(ctx, devPodConfig, args, "", cmd.Owner, log.Default)
sshConfigFile, err := os.CreateTemp("", "devpodssh.config")
if err != nil {
return err
}
sshConfigPath := sshConfigFile.Name()
// defer removal of temporary ssh config file
defer os.Remove(sshConfigPath)
baseWorkspaceClient, err := workspace2.Resolve(
ctx,
devPodConfig,
"",
nil,
args,
"",
cmd.Machine,
cmd.ProviderOptions,
false,
cmd.DevContainerImage,
cmd.DevContainerPath,
sshConfigPath,
nil,
cmd.UID,
false,
cmd.Owner,
log.Default,
)
if err != nil {
return err
}
// delete workspace if we have created it
if exists == "" && !cmd.SkipDelete {
defer func() {
err = baseWorkspaceClient.Delete(ctx, client.DeleteOptions{Force: true})
if err != nil {
log.Default.Errorf("Error deleting workspace: %v", err)
}
}()
}
// check if regular workspace client
workspaceClient, ok := baseWorkspaceClient.(client.WorkspaceClient)
if !ok {
return fmt.Errorf("building is currently not supported for proxy providers")
}
return cmd.Run(ctx, workspaceClient)
},
}
buildCmd.Flags().StringVar(&cmd.DevContainerImage, "devcontainer-image", "", "The container image to use, this will override the devcontainer.json value in the project")
buildCmd.Flags().StringVar(&cmd.DevContainerPath, "devcontainer-path", "", "The path to the devcontainer.json relative to the project")
buildCmd.Flags().StringSliceVar(&cmd.ProviderOptions, "provider-option", []string{}, "Provider option in the form KEY=VALUE")
buildCmd.Flags().BoolVar(&cmd.SkipDelete, "skip-delete", false, "If true will not delete the workspace after building it")
buildCmd.Flags().StringVar(&cmd.Machine, "machine", "", "The machine to use for this workspace. The machine needs to exist beforehand or the command will fail. If the workspace already exists, this option has no effect")
buildCmd.Flags().StringVar(&cmd.Repository, "repository", "", "The repository to push to")
buildCmd.Flags().StringSliceVar(&cmd.Tag, "tag", []string{}, "Image Tag(s) in the form of a comma separated list --tag latest,arm64 or multiple flags --tag latest --tag arm64")
buildCmd.Flags().StringSliceVar(&cmd.Platforms, "platform", []string{}, "Set target platform for build")
buildCmd.Flags().BoolVar(&cmd.SkipPush, "skip-push", false, "If true will not push the image to the repository, useful for testing")
buildCmd.Flags().Var(&cmd.GitCloneStrategy, "git-clone-strategy", "The git clone strategy DevPod uses to checkout git based workspaces. Can be full (default), blobless, treeless or shallow")
buildCmd.Flags().BoolVar(&cmd.GitCloneRecursiveSubmodules, "git-clone-recursive-submodules", false, "If true will clone git submodule repositories recursively")
// TESTING
buildCmd.Flags().BoolVar(&cmd.ForceBuild, "force-build", false, "TESTING ONLY")
buildCmd.Flags().BoolVar(&cmd.ForceInternalBuildKit, "force-internal-buildkit", false, "TESTING ONLY")
_ = buildCmd.Flags().MarkHidden("force-build")
_ = buildCmd.Flags().MarkHidden("force-internal-buildkit")
return buildCmd
}
func (cmd *BuildCmd) Run(ctx context.Context, client client.WorkspaceClient) error {
// build workspace
err := cmd.build(ctx, client, log.Default)
if err != nil {
return err
}
return nil
}
func (cmd *BuildCmd) build(ctx context.Context, workspaceClient client.WorkspaceClient, log log.Logger) error {
err := workspaceClient.Lock(ctx)
if err != nil {
return err
}
defer workspaceClient.Unlock()
err = startWait(ctx, workspaceClient, true, log)
if err != nil {
return err
}
log.Infof("Building devcontainer...")
defer log.Debugf("Done building devcontainer")
_, err = buildAgentClient(ctx, workspaceClient, cmd.CLIOptions, "build", log)
return err
}
func buildAgentClient(ctx context.Context, workspaceClient client.WorkspaceClient, cliOptions provider.CLIOptions, agentCommand string, log log.Logger, options ...tunnelserver.Option) (*config2.Result, error) {
// compress info
workspaceInfo, wInfo, err := workspaceClient.AgentInfo(cliOptions)
if err != nil {
return nil, err
}
// create container etc.
command := fmt.Sprintf("'%s' agent workspace %s --workspace-info '%s'", workspaceClient.AgentPath(), agentCommand, workspaceInfo)
if log.GetLevel() == logrus.DebugLevel {
command += " --debug"
}
// create pipes
stdoutReader, stdoutWriter, err := os.Pipe()
if err != nil {
return nil, err
}
stdinReader, stdinWriter, err := os.Pipe()
if err != nil {
return nil, err
}
defer stdoutWriter.Close()
defer stdinWriter.Close()
// start machine on stdio
cancelCtx, cancel := context.WithCancel(ctx)
defer cancel()
errChan := make(chan error, 1)
go func() {
defer log.Debugf("Done executing up command")
defer cancel()
writer := log.ErrorStreamOnly().Writer(logrus.InfoLevel, false)
defer writer.Close()
errChan <- agent.InjectAgentAndExecute(
cancelCtx,
func(ctx context.Context, command string, stdin io.Reader, stdout io.Writer, stderr io.Writer) error {
return workspaceClient.Command(ctx, client.CommandOptions{
Command: command,
Stdin: stdin,
Stdout: stdout,
Stderr: stderr,
})
},
workspaceClient.AgentLocal(),
workspaceClient.AgentPath(),
workspaceClient.AgentURL(),
true,
command,
stdinReader,
stdoutWriter,
writer,
log.ErrorStreamOnly(),
wInfo.InjectTimeout)
}()
// create container etc.
result, err := tunnelserver.RunUpServer(
cancelCtx,
stdoutReader,
stdinWriter,
workspaceClient.AgentInjectGitCredentials(cliOptions),
workspaceClient.AgentInjectDockerCredentials(
Showing preview only (626K chars total). Download the full file or copy to clipboard to get everything.
gitextract_ynafywdj/
├── .devcontainer/
│ ├── devcontainer.json
│ └── post_create.sh
├── .github/
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug-report.md
│ │ └── feature-request.md
│ ├── devcontainer/
│ │ ├── Dockerfile
│ │ └── devcontainer.json
│ ├── licenses.tmpl
│ └── workflows/
│ ├── build-devcontainer-image.yaml
│ ├── e2e-tests.yaml
│ ├── e2e-win-full-tests.yaml
│ ├── go-licenses-check.yaml
│ ├── go-licenses.yaml
│ ├── golangci-lint.yaml
│ ├── release.yaml
│ ├── stale.yaml
│ ├── ui-ci.yaml
│ └── unit-tests.yaml
├── .gitignore
├── .golangci.yaml
├── .vscode/
│ ├── launch.json
│ └── settings.json
├── COMMUNITY.md
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── SECURITY.md
├── cmd/
│ ├── agent/
│ │ ├── agent.go
│ │ ├── container/
│ │ │ ├── container.go
│ │ │ ├── credentials_server.go
│ │ │ ├── daemon.go
│ │ │ ├── openvscode_async.go
│ │ │ ├── setup.go
│ │ │ ├── setup_loft_platform_access.go
│ │ │ ├── setup_windows.go
│ │ │ ├── ssh_server.go
│ │ │ └── vscode_async.go
│ │ ├── container_tunnel.go
│ │ ├── daemon.go
│ │ ├── docker_credentials.go
│ │ ├── git_credentials.go
│ │ ├── git_ssh_signature.go
│ │ ├── git_ssh_signature_helper.go
│ │ └── workspace/
│ │ ├── build.go
│ │ ├── delete.go
│ │ ├── install_dotfiles.go
│ │ ├── logs.go
│ │ ├── logs_daemon.go
│ │ ├── setup_gpg.go
│ │ ├── status.go
│ │ ├── stop.go
│ │ ├── up.go
│ │ ├── update_config.go
│ │ └── workspace.go
│ ├── build.go
│ ├── completion/
│ │ └── suggestions.go
│ ├── context/
│ │ ├── context.go
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── list.go
│ │ ├── options.go
│ │ ├── set_options.go
│ │ └── use.go
│ ├── delete.go
│ ├── export.go
│ ├── flags/
│ │ └── flags.go
│ ├── helper/
│ │ ├── check_provider_update.go
│ │ ├── docker_credentials.go
│ │ ├── fleet_helper.go
│ │ ├── get_image.go
│ │ ├── get_provider_name.go
│ │ ├── get_workspace_config.go
│ │ ├── get_workspace_name.go
│ │ ├── get_workspace_uid.go
│ │ ├── helper.go
│ │ ├── http/
│ │ │ ├── http.go
│ │ │ └── request.go
│ │ ├── json/
│ │ │ ├── get.go
│ │ │ └── json.go
│ │ ├── sh.go
│ │ ├── ssh_client.go
│ │ ├── ssh_git_clone.go
│ │ ├── ssh_server.go
│ │ └── strings/
│ │ └── strings.go
│ ├── ide/
│ │ ├── ide.go
│ │ ├── list.go
│ │ ├── options.go
│ │ ├── set_options.go
│ │ └── use.go
│ ├── import.go
│ ├── list.go
│ ├── logs.go
│ ├── logs_daemon.go
│ ├── machine/
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── inspect.go
│ │ ├── list.go
│ │ ├── machine.go
│ │ ├── ssh.go
│ │ ├── start.go
│ │ ├── status.go
│ │ └── stop.go
│ ├── ping.go
│ ├── pro/
│ │ ├── add/
│ │ │ ├── add.go
│ │ │ └── cluster.go
│ │ ├── check_health.go
│ │ ├── check_update.go
│ │ ├── completion/
│ │ │ └── suggestions.go
│ │ ├── create_workspace.go
│ │ ├── daemon/
│ │ │ ├── daemon.go
│ │ │ ├── netcheck.go
│ │ │ ├── start.go
│ │ │ └── status.go
│ │ ├── delete.go
│ │ ├── flags/
│ │ │ └── flags.go
│ │ ├── import_workspace.go
│ │ ├── list.go
│ │ ├── list_clusters.go
│ │ ├── list_projects.go
│ │ ├── list_templates.go
│ │ ├── list_workspaces.go
│ │ ├── login.go
│ │ ├── pro.go
│ │ ├── provider/
│ │ │ ├── create/
│ │ │ │ ├── create.go
│ │ │ │ └── workspace.go
│ │ │ ├── delete.go
│ │ │ ├── get/
│ │ │ │ ├── get.go
│ │ │ │ ├── self.go
│ │ │ │ ├── version.go
│ │ │ │ └── workspace.go
│ │ │ ├── health.go
│ │ │ ├── list/
│ │ │ │ ├── clusters.go
│ │ │ │ ├── list.go
│ │ │ │ ├── projects.go
│ │ │ │ ├── templates.go
│ │ │ │ └── workspaces.go
│ │ │ ├── provider.go
│ │ │ ├── rebuild.go
│ │ │ ├── ssh.go
│ │ │ ├── status.go
│ │ │ ├── stop.go
│ │ │ ├── up.go
│ │ │ ├── update/
│ │ │ │ ├── update.go
│ │ │ │ └── workspace.go
│ │ │ └── watch/
│ │ │ ├── watch.go
│ │ │ └── workspaces.go
│ │ ├── rebuild.go
│ │ ├── reset/
│ │ │ ├── password.go
│ │ │ └── reset.go
│ │ ├── self.go
│ │ ├── sleep.go
│ │ ├── start.go
│ │ ├── update_provider.go
│ │ ├── update_workspace.go
│ │ ├── version.go
│ │ ├── wakeup.go
│ │ └── watch_workspaces.go
│ ├── profile.go
│ ├── provider/
│ │ ├── add.go
│ │ ├── delete.go
│ │ ├── list-default-providers.go
│ │ ├── list.go
│ │ ├── options.go
│ │ ├── provider.go
│ │ ├── set_options.go
│ │ ├── update.go
│ │ └── use.go
│ ├── root.go
│ ├── ssh.go
│ ├── status.go
│ ├── stop.go
│ ├── troubleshoot.go
│ ├── up.go
│ ├── upgrade.go
│ ├── use/
│ │ └── use.go
│ └── version.go
├── community.yaml
├── desktop/
│ ├── .gitignore
│ ├── .npmrc
│ ├── .prettierignore
│ ├── .prettierrc
│ ├── .vscode/
│ │ └── extensions.json
│ ├── README.md
│ ├── eslint.config.js
│ ├── flatpak/
│ │ ├── DevPod.metainfo.xml
│ │ └── sh.loft.devpod.tmpl
│ ├── index.html
│ ├── package.json
│ ├── src/
│ │ ├── App/
│ │ │ ├── App.tsx
│ │ │ ├── Changelog.tsx
│ │ │ ├── OSSApp.tsx
│ │ │ ├── ProApp.tsx
│ │ │ ├── constants.ts
│ │ │ ├── index.ts
│ │ │ ├── useAppReady.tsx
│ │ │ ├── useChangelogModal.tsx
│ │ │ └── usePreserveLocation.tsx
│ │ ├── ProRoot.tsx
│ │ ├── Theme/
│ │ │ ├── ThemeProvider.tsx
│ │ │ ├── button.ts
│ │ │ ├── card.ts
│ │ │ ├── checkbox.ts
│ │ │ ├── form.ts
│ │ │ ├── index.ts
│ │ │ ├── input.ts
│ │ │ ├── menu.ts
│ │ │ ├── modal.ts
│ │ │ ├── popover.ts
│ │ │ ├── radio.ts
│ │ │ ├── select.ts
│ │ │ ├── switch.ts
│ │ │ ├── tabs.ts
│ │ │ ├── tag.ts
│ │ │ ├── text.ts
│ │ │ ├── textarea.ts
│ │ │ ├── theme.ts
│ │ │ └── themeHooks.tsx
│ │ ├── client/
│ │ │ ├── client.ts
│ │ │ ├── command.ts
│ │ │ ├── commandCache.ts
│ │ │ ├── constants.ts
│ │ │ ├── context/
│ │ │ │ ├── client.ts
│ │ │ │ ├── contextCommands.ts
│ │ │ │ └── index.ts
│ │ │ ├── ides/
│ │ │ │ ├── client.ts
│ │ │ │ ├── ideCommands.ts
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ ├── pro/
│ │ │ │ ├── client.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── proCommands.ts
│ │ │ ├── providers/
│ │ │ │ ├── client.ts
│ │ │ │ ├── index.ts
│ │ │ │ └── providerCommands.ts
│ │ │ ├── tauriClient/
│ │ │ │ └── index.ts
│ │ │ ├── types.ts
│ │ │ └── workspaces/
│ │ │ ├── client.ts
│ │ │ ├── index.ts
│ │ │ └── workspaceCommands.ts
│ │ ├── components/
│ │ │ ├── Animation/
│ │ │ │ ├── Ripple.tsx
│ │ │ │ └── index.ts
│ │ │ ├── AutoComplete/
│ │ │ │ ├── AutoComplete.tsx
│ │ │ │ └── index.ts
│ │ │ ├── BottomActionBar/
│ │ │ │ ├── BottomActionBar.tsx
│ │ │ │ └── index.ts
│ │ │ ├── CardHeader/
│ │ │ │ ├── WorkspaceCardHeader.tsx
│ │ │ │ └── index.ts
│ │ │ ├── DeleteWorkspacesModal/
│ │ │ │ ├── DeleteWorkspacesModal.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Error/
│ │ │ │ ├── ErrorMessageBox.tsx
│ │ │ │ └── index.ts
│ │ │ ├── ExampleCard.tsx
│ │ │ ├── Form/
│ │ │ │ ├── Form.tsx
│ │ │ │ └── index.ts
│ │ │ ├── IDEGroup/
│ │ │ │ ├── IDEGroup.tsx
│ │ │ │ └── index.ts
│ │ │ ├── IDEIcon/
│ │ │ │ ├── IDEIcon.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Layout/
│ │ │ │ ├── NavigationViewLayout.tsx
│ │ │ │ ├── Notifications.tsx
│ │ │ │ ├── ProLayout.tsx
│ │ │ │ ├── ProSwitcher.tsx
│ │ │ │ ├── Sidebar.tsx
│ │ │ │ ├── StatusBar.tsx
│ │ │ │ ├── Toolbar.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── types.ts
│ │ │ ├── ListSelection/
│ │ │ │ ├── ListSelection.tsx
│ │ │ │ └── index.ts
│ │ │ ├── LoftOSSBadge.tsx
│ │ │ ├── Section/
│ │ │ │ ├── CollapsibleSection.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Steps/
│ │ │ │ ├── Steps.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Tag/
│ │ │ │ ├── IconTag.tsx
│ │ │ │ └── index.ts
│ │ │ ├── Terminal/
│ │ │ │ ├── Terminal.tsx
│ │ │ │ ├── TerminalSearchBar.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── useStreamingTerminal.tsx
│ │ │ │ └── useTerminalSearch.tsx
│ │ │ ├── Warning/
│ │ │ │ ├── WarningMessageBox.tsx
│ │ │ │ └── index.ts
│ │ │ ├── WorkspaceOwnerFilter/
│ │ │ │ ├── WorkspaceOwnerFilter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── WorkspaceSorter/
│ │ │ │ ├── WorkspaceSorter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── WorkspaceStatusFilter/
│ │ │ │ ├── WorkspaceStatusFilter.tsx
│ │ │ │ └── index.ts
│ │ │ ├── index.ts
│ │ │ └── useInstallCLI.tsx
│ │ ├── constants.ts
│ │ ├── contexts/
│ │ │ ├── DevPodContext/
│ │ │ │ ├── DevPodProvider/
│ │ │ │ │ ├── DevPodContext.tsx
│ │ │ │ │ ├── DevPodProvider.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Pro/
│ │ │ │ │ ├── ContextSwitcher.tsx
│ │ │ │ │ ├── ProProvider.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useProContext.ts
│ │ │ │ │ ├── useProHost.ts
│ │ │ │ │ ├── useProjectClusters.tsx
│ │ │ │ │ ├── useTemplates.ts
│ │ │ │ │ └── workspaceInstance.ts
│ │ │ │ ├── action/
│ │ │ │ │ ├── action.ts
│ │ │ │ │ ├── actionHistory.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── useAction.ts
│ │ │ │ ├── constants.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── proInstances/
│ │ │ │ │ ├── ProInstancesProvider.tsx
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── useProInstanceManager.ts
│ │ │ │ │ └── useProInstances.tsx
│ │ │ │ ├── useProvider.ts
│ │ │ │ ├── useProviderManager.ts
│ │ │ │ ├── useProviders.ts
│ │ │ │ ├── workspaceStore/
│ │ │ │ │ ├── WorkspaceStoreProvider.tsx
│ │ │ │ │ ├── context.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useWorkspaceStore.ts
│ │ │ │ │ └── workspaceStore.ts
│ │ │ │ └── workspaces/
│ │ │ │ ├── index.ts
│ │ │ │ ├── useAllWorkspaceActions.ts
│ │ │ │ ├── usePollWorkspaces.ts
│ │ │ │ ├── useWorkspace.ts
│ │ │ │ └── useWorkspaces.ts
│ │ │ ├── SettingsContext/
│ │ │ │ ├── SettingsContext.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useSettings.ts
│ │ │ ├── ToolbarContext/
│ │ │ │ ├── ToolbarContext.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useToolbar.ts
│ │ │ └── index.ts
│ │ ├── gen/
│ │ │ ├── Asset.ts
│ │ │ ├── Author.ts
│ │ │ ├── ColorMode.ts
│ │ │ ├── DaemonState.ts
│ │ │ ├── DaemonStatus.ts
│ │ │ ├── Release.ts
│ │ │ ├── Settings.ts
│ │ │ ├── SidebarPosition.ts
│ │ │ ├── Zoom.ts
│ │ │ └── index.ts
│ │ ├── icons/
│ │ │ ├── ArrowCycle.tsx
│ │ │ ├── ArrowDown.tsx
│ │ │ ├── ArrowLeft.tsx
│ │ │ ├── ArrowPath.tsx
│ │ │ ├── ArrowUp.tsx
│ │ │ ├── Bell.tsx
│ │ │ ├── BellDuotone.tsx
│ │ │ ├── Briefcase.tsx
│ │ │ ├── CPU.tsx
│ │ │ ├── CheckCircle.tsx
│ │ │ ├── CircleDuotone.tsx
│ │ │ ├── CircleWithArrow.tsx
│ │ │ ├── Clock.tsx
│ │ │ ├── Close.tsx
│ │ │ ├── Code.tsx
│ │ │ ├── Cog.tsx
│ │ │ ├── CogDuotone.tsx
│ │ │ ├── CogOutlined.tsx
│ │ │ ├── CommandLine.tsx
│ │ │ ├── Connect.tsx
│ │ │ ├── Dashboard.tsx
│ │ │ ├── Database.tsx
│ │ │ ├── DevPodProBadge.tsx
│ │ │ ├── Devpod.tsx
│ │ │ ├── DevpodWordmark.tsx
│ │ │ ├── Ellipsis.tsx
│ │ │ ├── ExclamationCircle.tsx
│ │ │ ├── ExclamationTriangle.tsx
│ │ │ ├── File.tsx
│ │ │ ├── Folder.tsx
│ │ │ ├── Form.tsx
│ │ │ ├── Git.tsx
│ │ │ ├── GitBranch.tsx
│ │ │ ├── GitCommit.tsx
│ │ │ ├── GitPR.tsx
│ │ │ ├── GitSubPath.tsx
│ │ │ ├── Globe.tsx
│ │ │ ├── Gold.tsx
│ │ │ ├── History.tsx
│ │ │ ├── Image.tsx
│ │ │ ├── Laptop.tsx
│ │ │ ├── LockDuotone.tsx
│ │ │ ├── Loft.tsx
│ │ │ ├── LoftDevpodPro.tsx
│ │ │ ├── MatchCase.tsx
│ │ │ ├── Memory.tsx
│ │ │ ├── NotFound.tsx
│ │ │ ├── Parameters.tsx
│ │ │ ├── Pause.tsx
│ │ │ ├── Play.tsx
│ │ │ ├── Plus.tsx
│ │ │ ├── Preset.tsx
│ │ │ ├── ProfileDuotone.tsx
│ │ │ ├── ProviderPlaceholder.tsx
│ │ │ ├── Search.tsx
│ │ │ ├── Sleep.tsx
│ │ │ ├── Stack3D.tsx
│ │ │ ├── Status.tsx
│ │ │ ├── Stop.tsx
│ │ │ ├── Template.tsx
│ │ │ ├── Trash.tsx
│ │ │ ├── User.tsx
│ │ │ ├── WholeWord.tsx
│ │ │ ├── WorkspaceStatus.tsx
│ │ │ ├── defaultProps.tsx
│ │ │ └── index.ts
│ │ ├── images/
│ │ │ └── index.ts
│ │ ├── lib/
│ │ │ ├── debugSettings.ts
│ │ │ ├── eventManager.ts
│ │ │ ├── helpers.ts
│ │ │ ├── index.ts
│ │ │ ├── modals/
│ │ │ │ ├── index.ts
│ │ │ │ ├── useDeleteWorkspaceModal.tsx
│ │ │ │ ├── useLoginProModal.tsx
│ │ │ │ ├── useRebuildWorkspaceModal.tsx
│ │ │ │ ├── useResetWorkspaceModal.tsx
│ │ │ │ └── useStopWorkspaceModal.tsx
│ │ │ ├── platform.ts
│ │ │ ├── pro/
│ │ │ │ ├── constants.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── name.ts
│ │ │ │ ├── parameters.tsx
│ │ │ │ ├── source.ts
│ │ │ │ ├── time.ts
│ │ │ │ └── useConnectionStatus.tsx
│ │ │ ├── randomWords.ts
│ │ │ ├── releases.ts
│ │ │ ├── result.ts
│ │ │ ├── store.ts
│ │ │ ├── systemInfo.ts
│ │ │ ├── types.ts
│ │ │ ├── useDownloadLogs.ts
│ │ │ ├── useFormErrors.ts
│ │ │ ├── useHover.ts
│ │ │ ├── useSelection.ts
│ │ │ ├── useSortWorkspaces.tsx
│ │ │ ├── useStoreTroubleshoot.ts
│ │ │ ├── useUpdate.ts
│ │ │ └── useVersion.ts
│ │ ├── main.tsx
│ │ ├── queryKeys.ts
│ │ ├── routes.tsx
│ │ ├── runner.ts
│ │ ├── types.ts
│ │ ├── useCommunityContributions.ts
│ │ ├── useIDEs.ts
│ │ ├── useWelcomeModal.tsx
│ │ ├── views/
│ │ │ ├── Actions/
│ │ │ │ ├── Action.tsx
│ │ │ │ ├── Actions.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useActionTitle.tsx
│ │ │ ├── Pro/
│ │ │ │ ├── BackToWorkspaces.tsx
│ │ │ │ ├── CreateWorkspace/
│ │ │ │ │ ├── CreateWorkspace.tsx
│ │ │ │ │ ├── CreateWorkspaceForm.tsx
│ │ │ │ │ ├── DevContainerInput.tsx
│ │ │ │ │ ├── IDEInput.tsx
│ │ │ │ │ ├── InfrastructureTemplateInput.tsx
│ │ │ │ │ ├── PresetInput.tsx
│ │ │ │ │ ├── RunnerInput.tsx
│ │ │ │ │ ├── SourceInput.tsx
│ │ │ │ │ ├── UpdateWorkspace.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ └── types.ts
│ │ │ │ ├── Credentials/
│ │ │ │ │ ├── AddGitHTTPCredentials.tsx
│ │ │ │ │ ├── AddGitSSHCredentials.tsx
│ │ │ │ │ ├── Credentials.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── ListWorkspaces.tsx
│ │ │ │ ├── ProInstance.tsx
│ │ │ │ ├── Profile.tsx
│ │ │ │ ├── SelectPreset/
│ │ │ │ │ ├── SelectPreset.tsx
│ │ │ │ │ └── index.ts
│ │ │ │ ├── Settings.tsx
│ │ │ │ ├── Workspace/
│ │ │ │ │ ├── Configuration.tsx
│ │ │ │ │ ├── Logs.tsx
│ │ │ │ │ ├── Tabs.tsx
│ │ │ │ │ ├── Workspace.tsx
│ │ │ │ │ ├── WorkspaceCardHeader.tsx
│ │ │ │ │ ├── WorkspaceDetails.tsx
│ │ │ │ │ ├── WorkspaceInstanceCard.tsx
│ │ │ │ │ ├── WorkspaceStatus.tsx
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── status.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useTemplate.ts
│ │ │ │ ├── helpers.ts
│ │ │ │ └── index.ts
│ │ │ ├── Providers/
│ │ │ │ ├── AddProvider/
│ │ │ │ │ ├── ConfigureProviderOptionsForm.tsx
│ │ │ │ │ ├── LoadingProviderIndicator.tsx
│ │ │ │ │ ├── OptionFormField.tsx
│ │ │ │ │ ├── SetupClonedProvider.tsx
│ │ │ │ │ ├── SetupProviderSourceForm.tsx
│ │ │ │ │ ├── SetupProviderSteps.tsx
│ │ │ │ │ ├── helpers.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ ├── useAddProvider.ts
│ │ │ │ │ ├── useProviderOptions.ts
│ │ │ │ │ └── useSetupProvider.ts
│ │ │ │ ├── ListProviders.tsx
│ │ │ │ ├── Provider.tsx
│ │ │ │ ├── ProviderCard.tsx
│ │ │ │ ├── Providers.tsx
│ │ │ │ ├── helpers.ts
│ │ │ │ ├── index.ts
│ │ │ │ ├── useDeleteProviderModal.tsx
│ │ │ │ ├── useProviderTitle.tsx
│ │ │ │ └── useSetupProviderModal.tsx
│ │ │ ├── Settings/
│ │ │ │ ├── ClearableInput.tsx
│ │ │ │ ├── Settings.tsx
│ │ │ │ ├── index.ts
│ │ │ │ ├── useContextOptions.tsx
│ │ │ │ ├── useIDESettings.tsx
│ │ │ │ └── useSettingsOptions.tsx
│ │ │ ├── Workspaces/
│ │ │ │ ├── CreateWorkspace/
│ │ │ │ │ ├── CreateWorkspace.tsx
│ │ │ │ │ ├── ProviderOptionsPopover.tsx
│ │ │ │ │ ├── WorkspaceSourceInput.tsx
│ │ │ │ │ ├── constants.ts
│ │ │ │ │ ├── index.ts
│ │ │ │ │ ├── types.ts
│ │ │ │ │ └── useCreateWorkspaceForm.tsx
│ │ │ │ ├── ListWorkspaces.tsx
│ │ │ │ ├── WorkspaceCard.tsx
│ │ │ │ ├── WorkspaceControls.tsx
│ │ │ │ ├── WorkspaceStatusBadge.tsx
│ │ │ │ ├── Workspaces.tsx
│ │ │ │ ├── index.ts
│ │ │ │ └── useWorkspaceTitle.tsx
│ │ │ └── index.ts
│ │ └── vite-env.d.ts
│ ├── src-tauri/
│ │ ├── .gitignore
│ │ ├── Cargo.toml
│ │ ├── Info.plist
│ │ ├── bin/
│ │ │ └── .gitkeep
│ │ ├── build.rs
│ │ ├── capabilities/
│ │ │ ├── migrated.json
│ │ │ └── updater.json
│ │ ├── entitlements.plist
│ │ ├── gen/
│ │ │ └── schemas/
│ │ │ ├── acl-manifests.json
│ │ │ ├── capabilities.json
│ │ │ ├── desktop-schema.json
│ │ │ ├── linux-schema.json
│ │ │ ├── macOS-schema.json
│ │ │ └── windows-schema.json
│ │ ├── icons/
│ │ │ └── icon.icns
│ │ ├── sign.bat
│ │ ├── src/
│ │ │ ├── action_logs.rs
│ │ │ ├── commands/
│ │ │ │ ├── config.rs
│ │ │ │ ├── constants.rs
│ │ │ │ ├── delete_pro_instance.rs
│ │ │ │ ├── delete_provider.rs
│ │ │ │ ├── list_pro_instances.rs
│ │ │ │ ├── list_workspaces.rs
│ │ │ │ └── start_daemon.rs
│ │ │ ├── commands.rs
│ │ │ ├── community_contributions.rs
│ │ │ ├── custom_protocol.rs
│ │ │ ├── daemon/
│ │ │ │ └── client.rs
│ │ │ ├── daemon.rs
│ │ │ ├── file_exists.rs
│ │ │ ├── fix_env.rs
│ │ │ ├── get_env.rs
│ │ │ ├── install_cli.rs
│ │ │ ├── logging.rs
│ │ │ ├── main.rs
│ │ │ ├── providers.rs
│ │ │ ├── resource_watcher.rs
│ │ │ ├── server.rs
│ │ │ ├── settings.rs
│ │ │ ├── system_tray.rs
│ │ │ ├── ui_messages.rs
│ │ │ ├── ui_ready.rs
│ │ │ ├── updates.rs
│ │ │ ├── util.rs
│ │ │ └── window.rs
│ │ ├── tauri-dev-linux.conf.json
│ │ ├── tauri-dev.conf.json
│ │ ├── tauri-flatpak.conf.json
│ │ └── tauri.conf.json
│ ├── tsconfig.json
│ ├── tsconfig.node.json
│ ├── update-window/
│ │ ├── index.html
│ │ └── src/
│ │ └── main.tsx
│ └── vite.config.ts
├── docs/
│ ├── .gitignore
│ ├── README.md
│ ├── docusaurus.config.js
│ ├── package.json
│ ├── pages/
│ │ ├── developing-in-workspaces/
│ │ │ ├── connect-to-a-workspace.mdx
│ │ │ ├── create-a-workspace.mdx
│ │ │ ├── credentials.mdx
│ │ │ ├── delete-a-workspace.mdx
│ │ │ ├── devcontainer-json.mdx
│ │ │ ├── dotfiles-in-a-workspace.mdx
│ │ │ ├── environment-variables-in-devcontainer-json.mdx
│ │ │ ├── inactivity-timeout.mdx
│ │ │ ├── prebuild-a-workspace.mdx
│ │ │ ├── stop-a-workspace.mdx
│ │ │ └── what-are-workspaces.mdx
│ │ ├── developing-providers/
│ │ │ ├── agent.mdx
│ │ │ ├── binaries.mdx
│ │ │ ├── driver.mdx
│ │ │ ├── options.mdx
│ │ │ └── quickstart.mdx
│ │ ├── fragments/
│ │ │ ├── add-provider.mdx
│ │ │ ├── setup-virtualbox.mdx
│ │ │ └── virtualbox-ubuntu-22.04.mdx
│ │ ├── getting-started/
│ │ │ ├── install.mdx
│ │ │ ├── quickstart-devpod-cli.mdx
│ │ │ ├── quickstart-jetbrains.mdx
│ │ │ ├── quickstart-ssh.mdx
│ │ │ ├── quickstart-vim.mdx
│ │ │ ├── quickstart-vscode-browser.mdx
│ │ │ ├── quickstart-vscode.mdx
│ │ │ └── update.mdx
│ │ ├── how-it-works/
│ │ │ ├── building-workspaces.mdx
│ │ │ ├── deploy-k8s.mdx
│ │ │ ├── deploy-machines.mdx
│ │ │ ├── deploying-workspaces.mdx
│ │ │ └── overview.mdx
│ │ ├── licenses/
│ │ │ └── devpod.mdx
│ │ ├── managing-machines/
│ │ │ ├── manage-machines.mdx
│ │ │ └── what-are-machines.mdx
│ │ ├── managing-providers/
│ │ │ ├── add-provider.mdx
│ │ │ ├── delete-provider.mdx
│ │ │ ├── update-provider.mdx
│ │ │ └── what-are-providers.mdx
│ │ ├── other-topics/
│ │ │ ├── advanced-guides/
│ │ │ │ └── minikube-vscode-browser.mdx
│ │ │ ├── mobile-support.mdx
│ │ │ └── telemetry.mdx
│ │ ├── quickstart/
│ │ │ ├── browser.mdx
│ │ │ ├── devpod-cli.mdx
│ │ │ ├── jetbrains.mdx
│ │ │ ├── ssh.mdx
│ │ │ ├── vim.mdx
│ │ │ └── vscode.mdx
│ │ ├── troubleshooting/
│ │ │ ├── ide-troubleshooting.mdx
│ │ │ ├── linux-troubleshooting.mdx
│ │ │ ├── troubleshooting.mdx
│ │ │ └── windows-troubleshooting.mdx
│ │ ├── tutorials/
│ │ │ ├── docker-provider-via-wsl.mdx
│ │ │ ├── minikube-vscode-browser.mdx
│ │ │ └── reduce-build-times-with-cache.mdx
│ │ └── what-is-devpod.mdx
│ ├── public/
│ │ └── _redirects
│ ├── sidebars.js
│ ├── src/
│ │ ├── components/
│ │ │ ├── Highlight/
│ │ │ │ ├── Highlight.js
│ │ │ │ └── styles.module.css
│ │ │ └── Step/
│ │ │ ├── Step.js
│ │ │ └── styles.module.css
│ │ ├── css/
│ │ │ └── custom.css
│ │ └── pages/
│ │ ├── index.js
│ │ └── styles.module.css
│ ├── static/
│ │ └── js/
│ │ └── custom.js
│ └── uml/
│ ├── c4_build.puml
│ ├── c4_build_k8s.puml
│ ├── c4_k8s.puml
│ ├── c4_machines.puml
│ ├── c4_workspaces.puml
│ └── up_sequence.puml
├── e2e/
│ ├── README.md
│ ├── devcontainer-feature.json
│ ├── e2e_suite_test.go
│ ├── framework/
│ │ ├── command.go
│ │ ├── exec.go
│ │ ├── framework.go
│ │ ├── helper.go
│ │ ├── server_utils.go
│ │ ├── types.go
│ │ └── util.go
│ └── tests/
│ ├── build/
│ │ ├── build.go
│ │ ├── framework.go
│ │ └── testdata/
│ │ ├── docker/
│ │ │ └── .devcontainer/
│ │ │ ├── Dockerfile
│ │ │ └── devcontainer.json
│ │ ├── docker-compose/
│ │ │ └── .devcontainer/
│ │ │ ├── Dockerfile
│ │ │ ├── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ └── kubernetes/
│ │ └── .devcontainer/
│ │ ├── Dockerfile
│ │ └── devcontainer.json
│ ├── context/
│ │ ├── context.go
│ │ └── framework.go
│ ├── ide/
│ │ ├── framework.go
│ │ ├── ide.go
│ │ └── testdata/
│ │ └── .devcontainer.json
│ ├── integration/
│ │ ├── framework.go
│ │ ├── integration.go
│ │ └── testdata/
│ │ └── .devcontainer.json
│ ├── machine/
│ │ ├── create.go
│ │ ├── delete.go
│ │ ├── framework.go
│ │ └── testdata/
│ │ └── mock-provider.yaml
│ ├── machineprovider/
│ │ ├── framework.go
│ │ ├── machineprovider.go
│ │ └── testdata/
│ │ ├── machineprovider/
│ │ │ ├── .devcontainer.json
│ │ │ ├── provider.yaml
│ │ │ └── test.txt
│ │ └── machineprovider2/
│ │ ├── .devcontainer.json
│ │ ├── provider.yaml
│ │ └── test.txt
│ ├── provider/
│ │ ├── framework.go
│ │ ├── provider.go
│ │ └── testdata/
│ │ └── simple-k8s-provider/
│ │ ├── provider1.yaml
│ │ ├── provider2-update.yaml
│ │ ├── provider2.yaml
│ │ └── provider3.yaml
│ ├── ssh/
│ │ ├── framework.go
│ │ ├── ssh.go
│ │ └── testdata/
│ │ ├── forward-test/
│ │ │ └── .devcontainer.json
│ │ ├── gpg-forwarding/
│ │ │ ├── .devcontainer.json
│ │ │ ├── devcontainer.json
│ │ │ ├── gpg-private.key
│ │ │ └── gpg-public.key
│ │ └── local-test/
│ │ └── devcontainer.json
│ └── up/
│ ├── docker-wsl.go
│ ├── docker.go
│ ├── docker_build.go
│ ├── docker_compose.go
│ ├── docker_compose_build.go
│ ├── framework.go
│ ├── helper.go
│ ├── podman.go
│ ├── testdata/
│ │ ├── docker/
│ │ │ └── .devcontainer.json
│ │ ├── docker-compose/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-capadd/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-container-env/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-container-user/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-env-file/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-extensions/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-features/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-forward-ports/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-lifecycle-array/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-lifecycle-object/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-mounts/
│ │ │ ├── .devcontainer.json
│ │ │ ├── docker-compose.yaml
│ │ │ └── mount2/
│ │ │ └── bar.txt
│ │ ├── docker-compose-multiple-services/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-override-command/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-overrides/
│ │ │ ├── .devcontainer/
│ │ │ │ ├── devcontainer.json
│ │ │ │ └── docker-compose.devcontainer.yaml
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-privileged/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-rebuild-fail/
│ │ │ ├── .devcontainer.json
│ │ │ ├── docker-compose.yaml
│ │ │ └── fail.devcontainer.json
│ │ ├── docker-compose-rebuild-success/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-remote-env/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-remote-user/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-run-services/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-securityOpt/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-subfolder/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-variables/
│ │ │ ├── .devcontainer.json
│ │ │ └── docker-compose.yaml
│ │ ├── docker-compose-with-multi-stage-build/
│ │ │ ├── .devcontainer.json
│ │ │ ├── Dockerfile
│ │ │ └── docker-compose.yaml
│ │ ├── docker-dockerfile-buildcontext/
│ │ │ ├── .devcontainer/
│ │ │ │ └── devcontainer.json
│ │ │ ├── .dockerignore
│ │ │ ├── Dockerfile
│ │ │ └── scripts/
│ │ │ ├── alias.sh
│ │ │ └── install.sh
│ │ ├── docker-features-http-headers/
│ │ │ ├── .devcontainer.json
│ │ │ ├── devcontainer-feature.json
│ │ │ └── install.sh
│ │ ├── docker-features-lifecycle-hooks/
│ │ │ └── .devcontainer.json
│ │ ├── docker-mounts/
│ │ │ ├── .devcontainer.json
│ │ │ ├── mount1/
│ │ │ │ └── foo.txt
│ │ │ └── mount2/
│ │ │ └── bar.txt
│ │ ├── docker-variables/
│ │ │ └── .devcontainer.json
│ │ ├── docker-with-multi-stage-build/
│ │ │ ├── .devcontainer.json
│ │ │ └── Dockerfile
│ │ ├── kubernetes/
│ │ │ ├── .devcontainer.json
│ │ │ └── test_file.txt
│ │ └── no-devcontainer/
│ │ └── empty.go
│ └── up.go
├── examples/
│ ├── build/
│ │ ├── .devcontainer.json
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ └── app/
│ │ └── code
│ ├── build-multi-stage/
│ │ ├── .devcontainer.json
│ │ ├── Dockerfile
│ │ └── README.md
│ ├── compose/
│ │ ├── .devcontainer.json
│ │ ├── Dockerfile
│ │ ├── README.md
│ │ ├── devcontainer.Dockerfile
│ │ ├── devcontainer.Dockerfile2
│ │ └── docker-compose.devcontainer.yml
│ ├── feature/
│ │ ├── .devcontainer.json
│ │ └── afeature/
│ │ ├── devcontainer-feature.json
│ │ └── install.sh
│ ├── multi-devcontainer/
│ │ ├── .devcontainer.json
│ │ ├── proj1/
│ │ │ └── .devcontainer.json
│ │ └── proj2/
│ │ └── .devcontainer.json
│ ├── object-lifecycle-hooks/
│ │ └── .devcontainer.json
│ ├── simple/
│ │ ├── .devcontainer.json
│ │ └── README.md
│ ├── simple-k8s-provider/
│ │ ├── README.md
│ │ └── provider.yaml
│ └── ztunnel/
│ ├── README.md
│ ├── devcontainer.json
│ ├── helloworld.yaml
│ ├── launch.json
│ ├── pod_manifest.yaml
│ └── sleep.yaml
├── go.mod
├── go.sum
├── hack/
│ ├── build-e2e.sh
│ ├── build-grpc.sh
│ ├── dev_devpod_pro.sh
│ ├── gen-desktop.sh
│ ├── pro/
│ │ ├── main.go
│ │ └── provider.yaml
│ ├── rebuild.sh
│ └── unit-tests.sh
├── loadtest/
│ ├── README.md
│ ├── deleteWorkspaces.sh
│ ├── emulateTraffic.sh
│ ├── generateLoad.sh
│ ├── init_monitor.sh
│ ├── monitor.sh
│ ├── run.sh
│ └── startWorkspaces.sh
├── main.go
├── netlify.toml
├── pkg/
│ ├── agent/
│ │ ├── agent.go
│ │ ├── inject.go
│ │ ├── tunnel/
│ │ │ ├── tunnel.pb.go
│ │ │ ├── tunnel.proto
│ │ │ └── tunnel_grpc.pb.go
│ │ ├── tunnelserver/
│ │ │ ├── client.go
│ │ │ ├── logger.go
│ │ │ ├── options.go
│ │ │ ├── stream.go
│ │ │ └── tunnelserver.go
│ │ └── workspace.go
│ ├── binaries/
│ │ └── download.go
│ ├── client/
│ │ ├── client.go
│ │ └── clientimplementation/
│ │ ├── daemonclient/
│ │ │ ├── client.go
│ │ │ ├── create.go
│ │ │ ├── delete.go
│ │ │ ├── form.go
│ │ │ ├── status.go
│ │ │ ├── stop.go
│ │ │ ├── up.go
│ │ │ └── update.go
│ │ ├── machine_client.go
│ │ ├── proxy_client.go
│ │ └── workspace_client.go
│ ├── command/
│ │ ├── command.go
│ │ ├── escape.go
│ │ ├── process.go
│ │ ├── process_supported.go
│ │ ├── process_unsupported.go
│ │ └── user.go
│ ├── compose/
│ │ └── helper.go
│ ├── compress/
│ │ └── compress.go
│ ├── config/
│ │ ├── config.go
│ │ ├── context.go
│ │ ├── context_test.go
│ │ ├── dir.go
│ │ └── ide.go
│ ├── copy/
│ │ ├── copy.go
│ │ ├── copy_supported.go
│ │ └── copy_unsupported.go
│ ├── credentials/
│ │ ├── request.go
│ │ ├── server.go
│ │ └── start.go
│ ├── daemon/
│ │ ├── agent/
│ │ │ ├── daemon.go
│ │ │ ├── reaper_linux.go
│ │ │ └── reaper_stub.go
│ │ └── platform/
│ │ ├── client.go
│ │ ├── daemon.go
│ │ ├── error.go
│ │ ├── error_unix.go
│ │ ├── error_windows.go
│ │ ├── local_server.go
│ │ ├── socket.go
│ │ ├── socket_windows.go
│ │ ├── ts_server.go
│ │ └── workspace_watcher.go
│ ├── devcontainer/
│ │ ├── build/
│ │ │ └── options.go
│ │ ├── build.go
│ │ ├── build_test.go
│ │ ├── buildkit/
│ │ │ ├── buildkit.go
│ │ │ ├── cache.go
│ │ │ ├── conn.go
│ │ │ ├── printer.go
│ │ │ └── remote.go
│ │ ├── compose.go
│ │ ├── config/
│ │ │ ├── build.go
│ │ │ ├── config.go
│ │ │ ├── container_details.go
│ │ │ ├── feature.go
│ │ │ ├── merge.go
│ │ │ ├── metadata.go
│ │ │ ├── parse.go
│ │ │ ├── parse_test.go
│ │ │ ├── prebuild.go
│ │ │ ├── prepareprobe.go
│ │ │ ├── prepareprobe_windows.go
│ │ │ ├── result.go
│ │ │ ├── substitute.go
│ │ │ └── userenvprobe.go
│ │ ├── config.go
│ │ ├── crane/
│ │ │ └── run.go
│ │ ├── delete.go
│ │ ├── feature/
│ │ │ ├── extend.go
│ │ │ ├── features.go
│ │ │ └── options.go
│ │ ├── graph/
│ │ │ ├── graph.go
│ │ │ └── graph_test.go
│ │ ├── helpers.go
│ │ ├── inspect.go
│ │ ├── metadata/
│ │ │ └── metadata.go
│ │ ├── prebuild.go
│ │ ├── run.go
│ │ ├── setup/
│ │ │ ├── lifecyclehooks.go
│ │ │ └── setup.go
│ │ ├── setup.go
│ │ ├── single.go
│ │ └── sshtunnel/
│ │ └── sshtunnel.go
│ ├── docker/
│ │ ├── client.go
│ │ ├── config.go
│ │ └── helper.go
│ ├── dockercredentials/
│ │ └── dockercredentials.go
│ ├── dockerfile/
│ │ ├── parse.go
│ │ ├── parse_test.go
│ │ └── test_Dockerfile
│ ├── download/
│ │ └── download.go
│ ├── driver/
│ │ ├── custom/
│ │ │ └── custom.go
│ │ ├── docker/
│ │ │ ├── build.go
│ │ │ └── docker.go
│ │ ├── docker.go
│ │ ├── drivercreate/
│ │ │ └── create.go
│ │ ├── kubernetes/
│ │ │ ├── client.go
│ │ │ ├── container_status.go
│ │ │ ├── daemonsecret.go
│ │ │ ├── dockersecrets.go
│ │ │ ├── driver.go
│ │ │ ├── find.go
│ │ │ ├── helper.go
│ │ │ ├── init_container.go
│ │ │ ├── pullsecrets.go
│ │ │ ├── pvc.go
│ │ │ ├── registry.go
│ │ │ ├── registry_test.go
│ │ │ ├── run.go
│ │ │ ├── serviceaccount.go
│ │ │ ├── target_architecture.go
│ │ │ ├── throttledlogger/
│ │ │ │ ├── throttled_logger.go
│ │ │ │ ├── timer.go
│ │ │ │ └── timer_test.go
│ │ │ └── wait.go
│ │ └── types.go
│ ├── encoding/
│ │ ├── encoding.go
│ │ └── encoding_test.go
│ ├── envfile/
│ │ └── envfile.go
│ ├── extract/
│ │ ├── compress.go
│ │ ├── extract.go
│ │ └── zip.go
│ ├── file/
│ │ ├── file.go
│ │ ├── file_supported.go
│ │ └── file_unsupported.go
│ ├── git/
│ │ ├── clone.go
│ │ ├── git.go
│ │ ├── git_test.go
│ │ └── install.go
│ ├── gitcredentials/
│ │ └── gitcredentials.go
│ ├── gitsshsigning/
│ │ ├── client.go
│ │ ├── helper.go
│ │ ├── server.go
│ │ └── utils.go
│ ├── gpg/
│ │ └── gpg_forwarding.go
│ ├── http/
│ │ └── http.go
│ ├── id/
│ │ └── id.go
│ ├── ide/
│ │ ├── fleet/
│ │ │ └── fleet.go
│ │ ├── ideparse/
│ │ │ └── parse.go
│ │ ├── jetbrains/
│ │ │ ├── clion.go
│ │ │ ├── dataspell.go
│ │ │ ├── generic.go
│ │ │ ├── goland.go
│ │ │ ├── intellij.go
│ │ │ ├── phpstorm.go
│ │ │ ├── pycharm.go
│ │ │ ├── rider.go
│ │ │ ├── rubymine.go
│ │ │ ├── rustrover.go
│ │ │ └── webstorm.go
│ │ ├── jupyter/
│ │ │ └── jupyter.go
│ │ ├── openvscode/
│ │ │ └── openvscode.go
│ │ ├── rstudio/
│ │ │ └── rstudio.go
│ │ ├── types.go
│ │ ├── vscode/
│ │ │ ├── apk.go
│ │ │ ├── open.go
│ │ │ └── vscode.go
│ │ └── zed/
│ │ ├── zed.go
│ │ └── zed_linux.go
│ ├── image/
│ │ ├── auth.go
│ │ └── image.go
│ ├── inject/
│ │ ├── delayed_writer.go
│ │ ├── download_urls.go
│ │ ├── inject.go
│ │ ├── inject.sh
│ │ └── script.go
│ ├── language/
│ │ └── language.go
│ ├── loftconfig/
│ │ ├── client.go
│ │ ├── config.go
│ │ └── server.go
│ ├── log/
│ │ ├── jsonstream.go
│ │ └── log.go
│ ├── netstat/
│ │ ├── netstat.go
│ │ ├── netstat_util.go
│ │ └── watcher.go
│ ├── open/
│ │ └── open.go
│ ├── options/
│ │ ├── resolve.go
│ │ ├── resolve_test.go
│ │ └── resolver/
│ │ ├── parse.go
│ │ ├── resolve.go
│ │ ├── resolver.go
│ │ ├── sub_options.go
│ │ └── util.go
│ ├── platform/
│ │ ├── annotations/
│ │ │ └── annotations.go
│ │ ├── client/
│ │ │ ├── client.go
│ │ │ └── config.go
│ │ ├── client.go
│ │ ├── config.go
│ │ ├── deploy.go
│ │ ├── env.go
│ │ ├── form/
│ │ │ └── form.go
│ │ ├── instance.go
│ │ ├── kube/
│ │ │ └── kube.go
│ │ ├── kubeconfig.go
│ │ ├── labels/
│ │ │ └── labels.go
│ │ ├── option.go
│ │ ├── owner.go
│ │ ├── parameters/
│ │ │ └── parameters.go
│ │ ├── platform.go
│ │ ├── project/
│ │ │ └── project.go
│ │ ├── remotecommand/
│ │ │ ├── client.go
│ │ │ ├── protocol.go
│ │ │ ├── remotecommand.go
│ │ │ ├── stream.go
│ │ │ └── websocket.go
│ │ ├── user.go
│ │ └── version.go
│ ├── port/
│ │ ├── parse.go
│ │ └── port.go
│ ├── provider/
│ │ ├── dir.go
│ │ ├── env.go
│ │ ├── export.go
│ │ ├── machine.go
│ │ ├── parse.go
│ │ ├── pro.go
│ │ ├── provider.go
│ │ └── workspace.go
│ ├── random/
│ │ └── random.go
│ ├── shell/
│ │ └── shell.go
│ ├── single/
│ │ └── single.go
│ ├── ssh/
│ │ ├── agent/
│ │ │ ├── agent_unix.go
│ │ │ └── agent_windows.go
│ │ ├── config.go
│ │ ├── config_test.go
│ │ ├── connection_counter.go
│ │ ├── forward.go
│ │ ├── helper.go
│ │ ├── keys.go
│ │ ├── server/
│ │ │ ├── agent.go
│ │ │ ├── exec.go
│ │ │ ├── exit.go
│ │ │ ├── port/
│ │ │ │ └── port.go
│ │ │ ├── pty_supported.go
│ │ │ ├── pty_unsupported.go
│ │ │ ├── sftp_handler.go
│ │ │ ├── ssh.go
│ │ │ ├── ssh_container.go
│ │ │ └── workdir.go
│ │ ├── ssh_add.go
│ │ ├── ssh_supported.go
│ │ └── ssh_unsupported.go
│ ├── stdio/
│ │ ├── conn.go
│ │ └── listener.go
│ ├── telemetry/
│ │ ├── collect.go
│ │ ├── helpers.go
│ │ └── noop.go
│ ├── template/
│ │ └── fill.go
│ ├── token/
│ │ └── token.go
│ ├── ts/
│ │ ├── addr.go
│ │ ├── derp.go
│ │ ├── ssh.go
│ │ ├── util.go
│ │ └── workspace_server.go
│ ├── tunnel/
│ │ ├── container.go
│ │ ├── direct.go
│ │ ├── forwarder.go
│ │ └── services.go
│ ├── types/
│ │ ├── option.go
│ │ ├── streams.go
│ │ ├── time.go
│ │ ├── types.go
│ │ └── types_test.go
│ ├── upgrade/
│ │ └── upgrade.go
│ ├── util/
│ │ ├── hash/
│ │ │ └── hash.go
│ │ ├── homedir.go
│ │ ├── homedir_test.go
│ │ └── rand.go
│ ├── version/
│ │ └── version.go
│ └── workspace/
│ ├── delete.go
│ ├── id.go
│ ├── id_test.go
│ ├── image.go
│ ├── list.go
│ ├── machine.go
│ ├── pro.go
│ ├── provider.go
│ └── workspace.go
├── providers/
│ ├── docker/
│ │ └── provider.yaml
│ ├── kubernetes/
│ │ └── provider.yaml
│ ├── pro/
│ │ └── provider.yaml
│ └── providers.go
├── scripts/
│ ├── install_docker.sh
│ └── scripts.go
└── vendor/
├── cel.dev/
│ └── expr/
│ ├── .bazelversion
│ ├── .gitattributes
│ ├── .gitignore
│ ├── BUILD.bazel
│ ├── CODE_OF_CONDUCT.md
│ ├── CONTRIBUTING.md
│ ├── GOVERNANCE.md
│ ├── LICENSE
│ ├── MAINTAINERS.md
│ ├── MODULE.bazel
│ ├── README.md
│ ├── WORKSPACE
│ ├── WORKSPACE.bzlmod
│ ├── checked.pb.go
│ ├── cloudbuild.yaml
│ ├── eval.pb.go
│ ├── explain.pb.go
│ ├── regen_go_proto.sh
│ ├── regen_go_proto_canonical_protos.sh
│ ├── syntax.pb.go
│ └── value.pb.go
├── cloud.google.com/
│ └── go/
│ └── compute/
│ └── metadata/
│ ├── CHANGES.md
│ ├── LICENSE
│ ├── README.md
│ ├── metadata.go
│ ├── retry.go
│ ├── retry_linux.go
│ ├── syscheck.go
│ ├── syscheck_linux.go
│ └── syscheck_windows.go
├── filippo.io/
│ └── edwards25519/
│ ├── LICENSE
│ ├── README.md
│ ├── doc.go
│ ├── edwards25519.go
│ ├── extra.go
│ ├── field/
│ │ ├── fe.go
│ │ ├── fe_amd64.go
│ │ ├── fe_amd64.s
│ │ ├── fe_amd64_noasm.go
│ │ ├── fe_arm64.go
│ │ ├── fe_arm64.s
│ │ ├── fe_arm64_noasm.go
│ │ ├── fe_extra.go
│ │ └── fe_generic.go
│ ├── scalar.go
│ ├── scalar_fiat.go
│ ├── scalarmult.go
│ └── tables.go
├── github.com/
│ ├── AdaLogics/
│ │ └── go-fuzz-headers/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── consumer.go
│ │ ├── funcs.go
│ │ └── sql.go
│ ├── AlecAivazis/
│ │ └── survey/
│ │ └── v2/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── confirm.go
│ │ ├── core/
│ │ │ ├── template.go
│ │ │ └── write.go
│ │ ├── editor.go
│ │ ├── filter.go
│ │ ├── input.go
│ │ ├── multiline.go
│ │ ├── multiselect.go
│ │ ├── password.go
│ │ ├── renderer.go
│ │ ├── select.go
│ │ ├── survey.go
│ │ ├── terminal/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ ├── buffered_reader.go
│ │ │ ├── cursor.go
│ │ │ ├── cursor_windows.go
│ │ │ ├── display.go
│ │ │ ├── display_posix.go
│ │ │ ├── display_windows.go
│ │ │ ├── error.go
│ │ │ ├── output.go
│ │ │ ├── output_windows.go
│ │ │ ├── runereader.go
│ │ │ ├── runereader_bsd.go
│ │ │ ├── runereader_linux.go
│ │ │ ├── runereader_posix.go
│ │ │ ├── runereader_ppc64le.go
│ │ │ ├── runereader_windows.go
│ │ │ ├── sequences.go
│ │ │ ├── stdio.go
│ │ │ ├── syscall_windows.go
│ │ │ └── terminal.go
│ │ ├── transform.go
│ │ └── validate.go
│ ├── Azure/
│ │ ├── azure-sdk-for-go/
│ │ │ ├── LICENSE.txt
│ │ │ ├── NOTICE.txt
│ │ │ ├── services/
│ │ │ │ └── preview/
│ │ │ │ └── containerregistry/
│ │ │ │ └── runtime/
│ │ │ │ └── 2019-08-15-preview/
│ │ │ │ └── containerregistry/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── accesstokens.go
│ │ │ │ ├── blob.go
│ │ │ │ ├── client.go
│ │ │ │ ├── dataplane_meta.json
│ │ │ │ ├── manifests.go
│ │ │ │ ├── models.go
│ │ │ │ ├── refreshtokens.go
│ │ │ │ ├── repository.go
│ │ │ │ ├── tag.go
│ │ │ │ ├── v2support.go
│ │ │ │ └── version.go
│ │ │ └── version/
│ │ │ └── version.go
│ │ └── go-ansiterm/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── constants.go
│ │ ├── context.go
│ │ ├── csi_entry_state.go
│ │ ├── csi_param_state.go
│ │ ├── escape_intermediate_state.go
│ │ ├── escape_state.go
│ │ ├── event_handler.go
│ │ ├── ground_state.go
│ │ ├── osc_string_state.go
│ │ ├── parser.go
│ │ ├── parser_action_helpers.go
│ │ ├── parser_actions.go
│ │ ├── states.go
│ │ ├── utilities.go
│ │ └── winterm/
│ │ ├── ansi.go
│ │ ├── api.go
│ │ ├── attr_translation.go
│ │ ├── cursor_helpers.go
│ │ ├── erase_helpers.go
│ │ ├── scroll_helper.go
│ │ ├── utilities.go
│ │ └── win_event_handler.go
│ ├── BurntSushi/
│ │ └── toml/
│ │ ├── .gitignore
│ │ ├── COPYING
│ │ ├── README.md
│ │ ├── decode.go
│ │ ├── deprecated.go
│ │ ├── doc.go
│ │ ├── encode.go
│ │ ├── error.go
│ │ ├── internal/
│ │ │ └── tz.go
│ │ ├── lex.go
│ │ ├── meta.go
│ │ ├── parse.go
│ │ ├── type_fields.go
│ │ └── type_toml.go
│ ├── Microsoft/
│ │ └── go-winio/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODEOWNERS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── backup.go
│ │ ├── doc.go
│ │ ├── ea.go
│ │ ├── file.go
│ │ ├── fileinfo.go
│ │ ├── hvsock.go
│ │ ├── internal/
│ │ │ ├── fs/
│ │ │ │ ├── doc.go
│ │ │ │ ├── fs.go
│ │ │ │ ├── security.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ ├── socket/
│ │ │ │ ├── rawaddr.go
│ │ │ │ ├── socket.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ └── stringbuffer/
│ │ │ └── wstring.go
│ │ ├── pipe.go
│ │ ├── pkg/
│ │ │ └── guid/
│ │ │ ├── guid.go
│ │ │ ├── guid_nonwindows.go
│ │ │ ├── guid_windows.go
│ │ │ └── variant_string.go
│ │ ├── privilege.go
│ │ ├── reparse.go
│ │ ├── sd.go
│ │ ├── syscall.go
│ │ └── zsyscall_windows.go
│ ├── NYTimes/
│ │ └── gziphandler/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── gzip.go
│ │ └── gzip_go18.go
│ ├── PaesslerAG/
│ │ ├── gval/
│ │ │ ├── .gitignore
│ │ │ ├── .travis.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── evaluable.go
│ │ │ ├── functions.go
│ │ │ ├── gval.go
│ │ │ ├── language.go
│ │ │ ├── operator.go
│ │ │ ├── parse.go
│ │ │ └── parser.go
│ │ └── jsonpath/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── jsonpath.go
│ │ ├── parse.go
│ │ ├── path.go
│ │ ├── placeholder.go
│ │ ├── selector.go
│ │ └── test.sh
│ ├── acarl005/
│ │ └── stripansi/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── stripansi.go
│ ├── akutz/
│ │ └── memconn/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── VERSION
│ │ ├── memconn.go
│ │ ├── memconn_addr.go
│ │ ├── memconn_conn.go
│ │ ├── memconn_listener.go
│ │ ├── memconn_pipe.go
│ │ └── memconn_provider.go
│ ├── alessio/
│ │ └── shellescape/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── .goreleaser.yml
│ │ ├── AUTHORS
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── shellescape.go
│ ├── alexbrainman/
│ │ └── sspi/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── buffer.go
│ │ ├── internal/
│ │ │ └── common/
│ │ │ └── common.go
│ │ ├── mksyscall.go
│ │ ├── negotiate/
│ │ │ └── negotiate.go
│ │ ├── sspi.go
│ │ ├── syscall.go
│ │ └── zsyscall_windows.go
│ ├── anmitsu/
│ │ └── go-shlex/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── shlex.go
│ ├── antlr4-go/
│ │ └── antlr/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── antlrdoc.go
│ │ ├── atn.go
│ │ ├── atn_config.go
│ │ ├── atn_config_set.go
│ │ ├── atn_deserialization_options.go
│ │ ├── atn_deserializer.go
│ │ ├── atn_simulator.go
│ │ ├── atn_state.go
│ │ ├── atn_type.go
│ │ ├── char_stream.go
│ │ ├── common_token_factory.go
│ │ ├── common_token_stream.go
│ │ ├── comparators.go
│ │ ├── configuration.go
│ │ ├── dfa.go
│ │ ├── dfa_serializer.go
│ │ ├── dfa_state.go
│ │ ├── diagnostic_error_listener.go
│ │ ├── error_listener.go
│ │ ├── error_strategy.go
│ │ ├── errors.go
│ │ ├── file_stream.go
│ │ ├── input_stream.go
│ │ ├── int_stream.go
│ │ ├── interval_set.go
│ │ ├── jcollect.go
│ │ ├── lexer.go
│ │ ├── lexer_action.go
│ │ ├── lexer_action_executor.go
│ │ ├── lexer_atn_simulator.go
│ │ ├── ll1_analyzer.go
│ │ ├── mutex.go
│ │ ├── mutex_nomutex.go
│ │ ├── nostatistics.go
│ │ ├── parser.go
│ │ ├── parser_atn_simulator.go
│ │ ├── parser_rule_context.go
│ │ ├── prediction_context.go
│ │ ├── prediction_context_cache.go
│ │ ├── prediction_mode.go
│ │ ├── recognizer.go
│ │ ├── rule_context.go
│ │ ├── semantic_context.go
│ │ ├── statistics.go
│ │ ├── stats_data.go
│ │ ├── token.go
│ │ ├── token_source.go
│ │ ├── token_stream.go
│ │ ├── tokenstream_rewriter.go
│ │ ├── trace_listener.go
│ │ ├── transition.go
│ │ ├── tree.go
│ │ ├── trees.go
│ │ └── utils.go
│ ├── asaskevich/
│ │ └── govalidator/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── arrays.go
│ │ ├── converter.go
│ │ ├── doc.go
│ │ ├── error.go
│ │ ├── numerics.go
│ │ ├── patterns.go
│ │ ├── types.go
│ │ ├── utils.go
│ │ ├── validator.go
│ │ └── wercker.yml
│ ├── atotto/
│ │ └── clipboard/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── clipboard.go
│ │ ├── clipboard_darwin.go
│ │ ├── clipboard_plan9.go
│ │ ├── clipboard_unix.go
│ │ └── clipboard_windows.go
│ ├── aws/
│ │ ├── aws-sdk-go-v2/
│ │ │ ├── LICENSE.txt
│ │ │ ├── NOTICE.txt
│ │ │ ├── aws/
│ │ │ │ ├── accountid_endpoint_mode.go
│ │ │ │ ├── arn/
│ │ │ │ │ └── arn.go
│ │ │ │ ├── config.go
│ │ │ │ ├── context.go
│ │ │ │ ├── credential_cache.go
│ │ │ │ ├── credentials.go
│ │ │ │ ├── defaults/
│ │ │ │ │ ├── auto.go
│ │ │ │ │ ├── configuration.go
│ │ │ │ │ ├── defaults.go
│ │ │ │ │ └── doc.go
│ │ │ │ ├── defaultsmode.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── from_ptr.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── logging.go
│ │ │ │ ├── logging_generate.go
│ │ │ │ ├── middleware/
│ │ │ │ │ ├── metadata.go
│ │ │ │ │ ├── middleware.go
│ │ │ │ │ ├── osname.go
│ │ │ │ │ ├── osname_go115.go
│ │ │ │ │ ├── private/
│ │ │ │ │ │ └── metrics/
│ │ │ │ │ │ └── metrics.go
│ │ │ │ │ ├── recursion_detection.go
│ │ │ │ │ ├── request_id.go
│ │ │ │ │ ├── request_id_retriever.go
│ │ │ │ │ └── user_agent.go
│ │ │ │ ├── protocol/
│ │ │ │ │ ├── query/
│ │ │ │ │ │ ├── array.go
│ │ │ │ │ │ ├── encoder.go
│ │ │ │ │ │ ├── map.go
│ │ │ │ │ │ ├── middleware.go
│ │ │ │ │ │ ├── object.go
│ │ │ │ │ │ └── value.go
│ │ │ │ │ ├── restjson/
│ │ │ │ │ │ └── decoder_util.go
│ │ │ │ │ └── xml/
│ │ │ │ │ └── error_utils.go
│ │ │ │ ├── ratelimit/
│ │ │ │ │ ├── none.go
│ │ │ │ │ ├── token_bucket.go
│ │ │ │ │ └── token_rate_limit.go
│ │ │ │ ├── request.go
│ │ │ │ ├── retry/
│ │ │ │ │ ├── adaptive.go
│ │ │ │ │ ├── adaptive_ratelimit.go
│ │ │ │ │ ├── adaptive_token_bucket.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── jitter_backoff.go
│ │ │ │ │ ├── metadata.go
│ │ │ │ │ ├── middleware.go
│ │ │ │ │ ├── retry.go
│ │ │ │ │ ├── retryable_error.go
│ │ │ │ │ ├── standard.go
│ │ │ │ │ ├── throttle_error.go
│ │ │ │ │ └── timeout_error.go
│ │ │ │ ├── retryer.go
│ │ │ │ ├── runtime.go
│ │ │ │ ├── signer/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ └── v4/
│ │ │ │ │ │ ├── cache.go
│ │ │ │ │ │ ├── const.go
│ │ │ │ │ │ ├── header_rules.go
│ │ │ │ │ │ ├── headers.go
│ │ │ │ │ │ ├── hmac.go
│ │ │ │ │ │ ├── host.go
│ │ │ │ │ │ ├── scope.go
│ │ │ │ │ │ ├── time.go
│ │ │ │ │ │ └── util.go
│ │ │ │ │ └── v4/
│ │ │ │ │ ├── middleware.go
│ │ │ │ │ ├── presign_middleware.go
│ │ │ │ │ ├── stream.go
│ │ │ │ │ └── v4.go
│ │ │ │ ├── to_ptr.go
│ │ │ │ ├── transport/
│ │ │ │ │ └── http/
│ │ │ │ │ ├── client.go
│ │ │ │ │ ├── content_type.go
│ │ │ │ │ ├── response_error.go
│ │ │ │ │ ├── response_error_middleware.go
│ │ │ │ │ └── timeout_read_closer.go
│ │ │ │ ├── types.go
│ │ │ │ └── version.go
│ │ │ ├── config/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── config.go
│ │ │ │ ├── defaultsmode.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── env_config.go
│ │ │ │ ├── generate.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── load_options.go
│ │ │ │ ├── local.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── resolve.go
│ │ │ │ ├── resolve_bearer_token.go
│ │ │ │ ├── resolve_credentials.go
│ │ │ │ └── shared_config.go
│ │ │ ├── credentials/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── doc.go
│ │ │ │ ├── ec2rolecreds/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ └── provider.go
│ │ │ │ ├── endpointcreds/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ └── client/
│ │ │ │ │ │ ├── auth.go
│ │ │ │ │ │ ├── client.go
│ │ │ │ │ │ ├── endpoints.go
│ │ │ │ │ │ └── middleware.go
│ │ │ │ │ └── provider.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── processcreds/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ └── provider.go
│ │ │ │ ├── ssocreds/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── sso_cached_token.go
│ │ │ │ │ ├── sso_credentials_provider.go
│ │ │ │ │ └── sso_token_provider.go
│ │ │ │ ├── static_provider.go
│ │ │ │ └── stscreds/
│ │ │ │ ├── assume_role_provider.go
│ │ │ │ └── web_identity_provider.go
│ │ │ ├── feature/
│ │ │ │ └── ec2/
│ │ │ │ └── imds/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_GetDynamicData.go
│ │ │ │ ├── api_op_GetIAMInfo.go
│ │ │ │ ├── api_op_GetInstanceIdentityDocument.go
│ │ │ │ ├── api_op_GetMetadata.go
│ │ │ │ ├── api_op_GetRegion.go
│ │ │ │ ├── api_op_GetToken.go
│ │ │ │ ├── api_op_GetUserData.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── config/
│ │ │ │ │ └── resolvers.go
│ │ │ │ ├── request_middleware.go
│ │ │ │ └── token_provider.go
│ │ │ ├── internal/
│ │ │ │ ├── auth/
│ │ │ │ │ ├── auth.go
│ │ │ │ │ ├── scheme.go
│ │ │ │ │ └── smithy/
│ │ │ │ │ ├── bearer_token_adapter.go
│ │ │ │ │ ├── bearer_token_signer_adapter.go
│ │ │ │ │ ├── credentials_adapter.go
│ │ │ │ │ ├── smithy.go
│ │ │ │ │ └── v4signer_adapter.go
│ │ │ │ ├── configsources/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── endpoints.go
│ │ │ │ │ └── go_module_metadata.go
│ │ │ │ ├── context/
│ │ │ │ │ └── context.go
│ │ │ │ ├── endpoints/
│ │ │ │ │ ├── awsrulesfn/
│ │ │ │ │ │ ├── arn.go
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── generate.go
│ │ │ │ │ │ ├── host.go
│ │ │ │ │ │ ├── partition.go
│ │ │ │ │ │ ├── partitions.go
│ │ │ │ │ │ └── partitions.json
│ │ │ │ │ ├── endpoints.go
│ │ │ │ │ └── v2/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── endpoints.go
│ │ │ │ │ └── go_module_metadata.go
│ │ │ │ ├── ini/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── go_module_metadata.go
│ │ │ │ │ ├── ini.go
│ │ │ │ │ ├── parse.go
│ │ │ │ │ ├── sections.go
│ │ │ │ │ ├── strings.go
│ │ │ │ │ ├── token.go
│ │ │ │ │ ├── tokenize.go
│ │ │ │ │ └── value.go
│ │ │ │ ├── middleware/
│ │ │ │ │ └── middleware.go
│ │ │ │ ├── rand/
│ │ │ │ │ └── rand.go
│ │ │ │ ├── sdk/
│ │ │ │ │ ├── interfaces.go
│ │ │ │ │ └── time.go
│ │ │ │ ├── sdkio/
│ │ │ │ │ └── byte.go
│ │ │ │ ├── shareddefaults/
│ │ │ │ │ └── shared_config.go
│ │ │ │ ├── strings/
│ │ │ │ │ └── strings.go
│ │ │ │ ├── sync/
│ │ │ │ │ └── singleflight/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ ├── docs.go
│ │ │ │ │ └── singleflight.go
│ │ │ │ └── timeconv/
│ │ │ │ └── duration.go
│ │ │ └── service/
│ │ │ ├── ecr/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_BatchCheckLayerAvailability.go
│ │ │ │ ├── api_op_BatchDeleteImage.go
│ │ │ │ ├── api_op_BatchGetImage.go
│ │ │ │ ├── api_op_BatchGetRepositoryScanningConfiguration.go
│ │ │ │ ├── api_op_CompleteLayerUpload.go
│ │ │ │ ├── api_op_CreatePullThroughCacheRule.go
│ │ │ │ ├── api_op_CreateRepository.go
│ │ │ │ ├── api_op_DeleteLifecyclePolicy.go
│ │ │ │ ├── api_op_DeletePullThroughCacheRule.go
│ │ │ │ ├── api_op_DeleteRegistryPolicy.go
│ │ │ │ ├── api_op_DeleteRepository.go
│ │ │ │ ├── api_op_DeleteRepositoryPolicy.go
│ │ │ │ ├── api_op_DescribeImageReplicationStatus.go
│ │ │ │ ├── api_op_DescribeImageScanFindings.go
│ │ │ │ ├── api_op_DescribeImages.go
│ │ │ │ ├── api_op_DescribePullThroughCacheRules.go
│ │ │ │ ├── api_op_DescribeRegistry.go
│ │ │ │ ├── api_op_DescribeRepositories.go
│ │ │ │ ├── api_op_GetAuthorizationToken.go
│ │ │ │ ├── api_op_GetDownloadUrlForLayer.go
│ │ │ │ ├── api_op_GetLifecyclePolicy.go
│ │ │ │ ├── api_op_GetLifecyclePolicyPreview.go
│ │ │ │ ├── api_op_GetRegistryPolicy.go
│ │ │ │ ├── api_op_GetRegistryScanningConfiguration.go
│ │ │ │ ├── api_op_GetRepositoryPolicy.go
│ │ │ │ ├── api_op_InitiateLayerUpload.go
│ │ │ │ ├── api_op_ListImages.go
│ │ │ │ ├── api_op_ListTagsForResource.go
│ │ │ │ ├── api_op_PutImage.go
│ │ │ │ ├── api_op_PutImageScanningConfiguration.go
│ │ │ │ ├── api_op_PutImageTagMutability.go
│ │ │ │ ├── api_op_PutLifecyclePolicy.go
│ │ │ │ ├── api_op_PutRegistryPolicy.go
│ │ │ │ ├── api_op_PutRegistryScanningConfiguration.go
│ │ │ │ ├── api_op_PutReplicationConfiguration.go
│ │ │ │ ├── api_op_SetRepositoryPolicy.go
│ │ │ │ ├── api_op_StartImageScan.go
│ │ │ │ ├── api_op_StartLifecyclePolicyPreview.go
│ │ │ │ ├── api_op_TagResource.go
│ │ │ │ ├── api_op_UntagResource.go
│ │ │ │ ├── api_op_UploadLayerPart.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── enums.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── ecrpublic/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_BatchCheckLayerAvailability.go
│ │ │ │ ├── api_op_BatchDeleteImage.go
│ │ │ │ ├── api_op_CompleteLayerUpload.go
│ │ │ │ ├── api_op_CreateRepository.go
│ │ │ │ ├── api_op_DeleteRepository.go
│ │ │ │ ├── api_op_DeleteRepositoryPolicy.go
│ │ │ │ ├── api_op_DescribeImageTags.go
│ │ │ │ ├── api_op_DescribeImages.go
│ │ │ │ ├── api_op_DescribeRegistries.go
│ │ │ │ ├── api_op_DescribeRepositories.go
│ │ │ │ ├── api_op_GetAuthorizationToken.go
│ │ │ │ ├── api_op_GetRegistryCatalogData.go
│ │ │ │ ├── api_op_GetRepositoryCatalogData.go
│ │ │ │ ├── api_op_GetRepositoryPolicy.go
│ │ │ │ ├── api_op_InitiateLayerUpload.go
│ │ │ │ ├── api_op_ListTagsForResource.go
│ │ │ │ ├── api_op_PutImage.go
│ │ │ │ ├── api_op_PutRegistryCatalogData.go
│ │ │ │ ├── api_op_PutRepositoryCatalogData.go
│ │ │ │ ├── api_op_SetRepositoryPolicy.go
│ │ │ │ ├── api_op_TagResource.go
│ │ │ │ ├── api_op_UntagResource.go
│ │ │ │ ├── api_op_UploadLayerPart.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── enums.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── internal/
│ │ │ │ ├── accept-encoding/
│ │ │ │ │ ├── CHANGELOG.md
│ │ │ │ │ ├── LICENSE.txt
│ │ │ │ │ ├── accept_encoding_gzip.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ └── go_module_metadata.go
│ │ │ │ └── presigned-url/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── context.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ └── middleware.go
│ │ │ ├── ssm/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_AddTagsToResource.go
│ │ │ │ ├── api_op_AssociateOpsItemRelatedItem.go
│ │ │ │ ├── api_op_CancelCommand.go
│ │ │ │ ├── api_op_CancelMaintenanceWindowExecution.go
│ │ │ │ ├── api_op_CreateActivation.go
│ │ │ │ ├── api_op_CreateAssociation.go
│ │ │ │ ├── api_op_CreateAssociationBatch.go
│ │ │ │ ├── api_op_CreateDocument.go
│ │ │ │ ├── api_op_CreateMaintenanceWindow.go
│ │ │ │ ├── api_op_CreateOpsItem.go
│ │ │ │ ├── api_op_CreateOpsMetadata.go
│ │ │ │ ├── api_op_CreatePatchBaseline.go
│ │ │ │ ├── api_op_CreateResourceDataSync.go
│ │ │ │ ├── api_op_DeleteActivation.go
│ │ │ │ ├── api_op_DeleteAssociation.go
│ │ │ │ ├── api_op_DeleteDocument.go
│ │ │ │ ├── api_op_DeleteInventory.go
│ │ │ │ ├── api_op_DeleteMaintenanceWindow.go
│ │ │ │ ├── api_op_DeleteOpsItem.go
│ │ │ │ ├── api_op_DeleteOpsMetadata.go
│ │ │ │ ├── api_op_DeleteParameter.go
│ │ │ │ ├── api_op_DeleteParameters.go
│ │ │ │ ├── api_op_DeletePatchBaseline.go
│ │ │ │ ├── api_op_DeleteResourceDataSync.go
│ │ │ │ ├── api_op_DeleteResourcePolicy.go
│ │ │ │ ├── api_op_DeregisterManagedInstance.go
│ │ │ │ ├── api_op_DeregisterPatchBaselineForPatchGroup.go
│ │ │ │ ├── api_op_DeregisterTargetFromMaintenanceWindow.go
│ │ │ │ ├── api_op_DeregisterTaskFromMaintenanceWindow.go
│ │ │ │ ├── api_op_DescribeActivations.go
│ │ │ │ ├── api_op_DescribeAssociation.go
│ │ │ │ ├── api_op_DescribeAssociationExecutionTargets.go
│ │ │ │ ├── api_op_DescribeAssociationExecutions.go
│ │ │ │ ├── api_op_DescribeAutomationExecutions.go
│ │ │ │ ├── api_op_DescribeAutomationStepExecutions.go
│ │ │ │ ├── api_op_DescribeAvailablePatches.go
│ │ │ │ ├── api_op_DescribeDocument.go
│ │ │ │ ├── api_op_DescribeDocumentPermission.go
│ │ │ │ ├── api_op_DescribeEffectiveInstanceAssociations.go
│ │ │ │ ├── api_op_DescribeEffectivePatchesForPatchBaseline.go
│ │ │ │ ├── api_op_DescribeInstanceAssociationsStatus.go
│ │ │ │ ├── api_op_DescribeInstanceInformation.go
│ │ │ │ ├── api_op_DescribeInstancePatchStates.go
│ │ │ │ ├── api_op_DescribeInstancePatchStatesForPatchGroup.go
│ │ │ │ ├── api_op_DescribeInstancePatches.go
│ │ │ │ ├── api_op_DescribeInventoryDeletions.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowExecutionTaskInvocations.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowExecutionTasks.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowExecutions.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowSchedule.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowTargets.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowTasks.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindows.go
│ │ │ │ ├── api_op_DescribeMaintenanceWindowsForTarget.go
│ │ │ │ ├── api_op_DescribeOpsItems.go
│ │ │ │ ├── api_op_DescribeParameters.go
│ │ │ │ ├── api_op_DescribePatchBaselines.go
│ │ │ │ ├── api_op_DescribePatchGroupState.go
│ │ │ │ ├── api_op_DescribePatchGroups.go
│ │ │ │ ├── api_op_DescribePatchProperties.go
│ │ │ │ ├── api_op_DescribeSessions.go
│ │ │ │ ├── api_op_DisassociateOpsItemRelatedItem.go
│ │ │ │ ├── api_op_GetAutomationExecution.go
│ │ │ │ ├── api_op_GetCalendarState.go
│ │ │ │ ├── api_op_GetCommandInvocation.go
│ │ │ │ ├── api_op_GetConnectionStatus.go
│ │ │ │ ├── api_op_GetDefaultPatchBaseline.go
│ │ │ │ ├── api_op_GetDeployablePatchSnapshotForInstance.go
│ │ │ │ ├── api_op_GetDocument.go
│ │ │ │ ├── api_op_GetInventory.go
│ │ │ │ ├── api_op_GetInventorySchema.go
│ │ │ │ ├── api_op_GetMaintenanceWindow.go
│ │ │ │ ├── api_op_GetMaintenanceWindowExecution.go
│ │ │ │ ├── api_op_GetMaintenanceWindowExecutionTask.go
│ │ │ │ ├── api_op_GetMaintenanceWindowExecutionTaskInvocation.go
│ │ │ │ ├── api_op_GetMaintenanceWindowTask.go
│ │ │ │ ├── api_op_GetOpsItem.go
│ │ │ │ ├── api_op_GetOpsMetadata.go
│ │ │ │ ├── api_op_GetOpsSummary.go
│ │ │ │ ├── api_op_GetParameter.go
│ │ │ │ ├── api_op_GetParameterHistory.go
│ │ │ │ ├── api_op_GetParameters.go
│ │ │ │ ├── api_op_GetParametersByPath.go
│ │ │ │ ├── api_op_GetPatchBaseline.go
│ │ │ │ ├── api_op_GetPatchBaselineForPatchGroup.go
│ │ │ │ ├── api_op_GetResourcePolicies.go
│ │ │ │ ├── api_op_GetServiceSetting.go
│ │ │ │ ├── api_op_LabelParameterVersion.go
│ │ │ │ ├── api_op_ListAssociationVersions.go
│ │ │ │ ├── api_op_ListAssociations.go
│ │ │ │ ├── api_op_ListCommandInvocations.go
│ │ │ │ ├── api_op_ListCommands.go
│ │ │ │ ├── api_op_ListComplianceItems.go
│ │ │ │ ├── api_op_ListComplianceSummaries.go
│ │ │ │ ├── api_op_ListDocumentMetadataHistory.go
│ │ │ │ ├── api_op_ListDocumentVersions.go
│ │ │ │ ├── api_op_ListDocuments.go
│ │ │ │ ├── api_op_ListInventoryEntries.go
│ │ │ │ ├── api_op_ListOpsItemEvents.go
│ │ │ │ ├── api_op_ListOpsItemRelatedItems.go
│ │ │ │ ├── api_op_ListOpsMetadata.go
│ │ │ │ ├── api_op_ListResourceComplianceSummaries.go
│ │ │ │ ├── api_op_ListResourceDataSync.go
│ │ │ │ ├── api_op_ListTagsForResource.go
│ │ │ │ ├── api_op_ModifyDocumentPermission.go
│ │ │ │ ├── api_op_PutComplianceItems.go
│ │ │ │ ├── api_op_PutInventory.go
│ │ │ │ ├── api_op_PutParameter.go
│ │ │ │ ├── api_op_PutResourcePolicy.go
│ │ │ │ ├── api_op_RegisterDefaultPatchBaseline.go
│ │ │ │ ├── api_op_RegisterPatchBaselineForPatchGroup.go
│ │ │ │ ├── api_op_RegisterTargetWithMaintenanceWindow.go
│ │ │ │ ├── api_op_RegisterTaskWithMaintenanceWindow.go
│ │ │ │ ├── api_op_RemoveTagsFromResource.go
│ │ │ │ ├── api_op_ResetServiceSetting.go
│ │ │ │ ├── api_op_ResumeSession.go
│ │ │ │ ├── api_op_SendAutomationSignal.go
│ │ │ │ ├── api_op_SendCommand.go
│ │ │ │ ├── api_op_StartAssociationsOnce.go
│ │ │ │ ├── api_op_StartAutomationExecution.go
│ │ │ │ ├── api_op_StartChangeRequestExecution.go
│ │ │ │ ├── api_op_StartSession.go
│ │ │ │ ├── api_op_StopAutomationExecution.go
│ │ │ │ ├── api_op_TerminateSession.go
│ │ │ │ ├── api_op_UnlabelParameterVersion.go
│ │ │ │ ├── api_op_UpdateAssociation.go
│ │ │ │ ├── api_op_UpdateAssociationStatus.go
│ │ │ │ ├── api_op_UpdateDocument.go
│ │ │ │ ├── api_op_UpdateDocumentDefaultVersion.go
│ │ │ │ ├── api_op_UpdateDocumentMetadata.go
│ │ │ │ ├── api_op_UpdateMaintenanceWindow.go
│ │ │ │ ├── api_op_UpdateMaintenanceWindowTarget.go
│ │ │ │ ├── api_op_UpdateMaintenanceWindowTask.go
│ │ │ │ ├── api_op_UpdateManagedInstanceRole.go
│ │ │ │ ├── api_op_UpdateOpsItem.go
│ │ │ │ ├── api_op_UpdateOpsMetadata.go
│ │ │ │ ├── api_op_UpdatePatchBaseline.go
│ │ │ │ ├── api_op_UpdateResourceDataSync.go
│ │ │ │ ├── api_op_UpdateServiceSetting.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── options.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── enums.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── sso/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_GetRoleCredentials.go
│ │ │ │ ├── api_op_ListAccountRoles.go
│ │ │ │ ├── api_op_ListAccounts.go
│ │ │ │ ├── api_op_Logout.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── options.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ ├── ssooidc/
│ │ │ │ ├── CHANGELOG.md
│ │ │ │ ├── LICENSE.txt
│ │ │ │ ├── api_client.go
│ │ │ │ ├── api_op_CreateToken.go
│ │ │ │ ├── api_op_CreateTokenWithIAM.go
│ │ │ │ ├── api_op_RegisterClient.go
│ │ │ │ ├── api_op_StartDeviceAuthorization.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── deserializers.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── endpoints.go
│ │ │ │ ├── generated.json
│ │ │ │ ├── go_module_metadata.go
│ │ │ │ ├── internal/
│ │ │ │ │ └── endpoints/
│ │ │ │ │ └── endpoints.go
│ │ │ │ ├── options.go
│ │ │ │ ├── serializers.go
│ │ │ │ ├── types/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── types.go
│ │ │ │ └── validators.go
│ │ │ └── sts/
│ │ │ ├── CHANGELOG.md
│ │ │ ├── LICENSE.txt
│ │ │ ├── api_client.go
│ │ │ ├── api_op_AssumeRole.go
│ │ │ ├── api_op_AssumeRoleWithSAML.go
│ │ │ ├── api_op_AssumeRoleWithWebIdentity.go
│ │ │ ├── api_op_DecodeAuthorizationMessage.go
│ │ │ ├── api_op_GetAccessKeyInfo.go
│ │ │ ├── api_op_GetCallerIdentity.go
│ │ │ ├── api_op_GetFederationToken.go
│ │ │ ├── api_op_GetSessionToken.go
│ │ │ ├── auth.go
│ │ │ ├── deserializers.go
│ │ │ ├── doc.go
│ │ │ ├── endpoints.go
│ │ │ ├── generated.json
│ │ │ ├── go_module_metadata.go
│ │ │ ├── internal/
│ │ │ │ └── endpoints/
│ │ │ │ └── endpoints.go
│ │ │ ├── options.go
│ │ │ ├── serializers.go
│ │ │ ├── types/
│ │ │ │ ├── errors.go
│ │ │ │ └── types.go
│ │ │ └── validators.go
│ │ └── smithy-go/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── CHANGELOG.md
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── NOTICE
│ │ ├── README.md
│ │ ├── auth/
│ │ │ ├── auth.go
│ │ │ ├── bearer/
│ │ │ │ ├── docs.go
│ │ │ │ ├── middleware.go
│ │ │ │ ├── token.go
│ │ │ │ └── token_cache.go
│ │ │ ├── identity.go
│ │ │ ├── option.go
│ │ │ └── scheme_id.go
│ │ ├── context/
│ │ │ └── suppress_expired.go
│ │ ├── doc.go
│ │ ├── document/
│ │ │ ├── doc.go
│ │ │ ├── document.go
│ │ │ └── errors.go
│ │ ├── document.go
│ │ ├── encoding/
│ │ │ ├── doc.go
│ │ │ ├── encoding.go
│ │ │ ├── httpbinding/
│ │ │ │ ├── encode.go
│ │ │ │ ├── header.go
│ │ │ │ ├── path_replace.go
│ │ │ │ ├── query.go
│ │ │ │ └── uri.go
│ │ │ ├── json/
│ │ │ │ ├── array.go
│ │ │ │ ├── constants.go
│ │ │ │ ├── decoder_util.go
│ │ │ │ ├── encoder.go
│ │ │ │ ├── escape.go
│ │ │ │ ├── object.go
│ │ │ │ └── value.go
│ │ │ └── xml/
│ │ │ ├── array.go
│ │ │ ├── constants.go
│ │ │ ├── doc.go
│ │ │ ├── element.go
│ │ │ ├── encoder.go
│ │ │ ├── error_utils.go
│ │ │ ├── escape.go
│ │ │ ├── map.go
│ │ │ ├── value.go
│ │ │ └── xml_decoder.go
│ │ ├── endpoints/
│ │ │ └── endpoint.go
│ │ ├── errors.go
│ │ ├── go_module_metadata.go
│ │ ├── internal/
│ │ │ └── sync/
│ │ │ └── singleflight/
│ │ │ ├── LICENSE
│ │ │ ├── docs.go
│ │ │ └── singleflight.go
│ │ ├── io/
│ │ │ ├── byte.go
│ │ │ ├── doc.go
│ │ │ ├── reader.go
│ │ │ └── ringbuffer.go
│ │ ├── local-mod-replace.sh
│ │ ├── logging/
│ │ │ └── logger.go
│ │ ├── middleware/
│ │ │ ├── doc.go
│ │ │ ├── logging.go
│ │ │ ├── metadata.go
│ │ │ ├── middleware.go
│ │ │ ├── ordered_group.go
│ │ │ ├── stack.go
│ │ │ ├── stack_values.go
│ │ │ ├── step_build.go
│ │ │ ├── step_deserialize.go
│ │ │ ├── step_finalize.go
│ │ │ ├── step_initialize.go
│ │ │ └── step_serialize.go
│ │ ├── modman.toml
│ │ ├── private/
│ │ │ └── requestcompression/
│ │ │ ├── gzip.go
│ │ │ ├── middleware_capture_request_compression.go
│ │ │ └── request_compression.go
│ │ ├── properties.go
│ │ ├── ptr/
│ │ │ ├── doc.go
│ │ │ ├── from_ptr.go
│ │ │ ├── gen_scalars.go
│ │ │ └── to_ptr.go
│ │ ├── rand/
│ │ │ ├── doc.go
│ │ │ ├── rand.go
│ │ │ └── uuid.go
│ │ ├── time/
│ │ │ └── time.go
│ │ ├── transport/
│ │ │ └── http/
│ │ │ ├── auth.go
│ │ │ ├── auth_schemes.go
│ │ │ ├── checksum_middleware.go
│ │ │ ├── client.go
│ │ │ ├── doc.go
│ │ │ ├── headerlist.go
│ │ │ ├── host.go
│ │ │ ├── internal/
│ │ │ │ └── io/
│ │ │ │ └── safe.go
│ │ │ ├── md5_checksum.go
│ │ │ ├── middleware_close_response_body.go
│ │ │ ├── middleware_content_length.go
│ │ │ ├── middleware_header_comment.go
│ │ │ ├── middleware_headers.go
│ │ │ ├── middleware_http_logging.go
│ │ │ ├── middleware_metadata.go
│ │ │ ├── middleware_min_proto.go
│ │ │ ├── properties.go
│ │ │ ├── request.go
│ │ │ ├── response.go
│ │ │ ├── time.go
│ │ │ ├── url.go
│ │ │ └── user_agent.go
│ │ ├── validation.go
│ │ └── waiter/
│ │ ├── logger.go
│ │ └── waiter.go
│ ├── awslabs/
│ │ └── amazon-ecr-credential-helper/
│ │ └── ecr-login/
│ │ ├── LICENSE
│ │ ├── api/
│ │ │ ├── client.go
│ │ │ └── factory.go
│ │ ├── cache/
│ │ │ ├── build.go
│ │ │ ├── credentials.go
│ │ │ ├── file.go
│ │ │ └── null.go
│ │ ├── config/
│ │ │ ├── cache_dir.go
│ │ │ └── log.go
│ │ ├── ecr.go
│ │ └── version/
│ │ └── version.go
│ ├── aymanbagabas/
│ │ └── go-osc52/
│ │ └── v2/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── osc52.go
│ ├── beorn7/
│ │ └── perks/
│ │ ├── LICENSE
│ │ └── quantile/
│ │ ├── exampledata.txt
│ │ └── stream.go
│ ├── bits-and-blooms/
│ │ └── bitset/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── azure-pipelines.yml
│ │ ├── bitset.go
│ │ ├── popcnt.go
│ │ ├── popcnt_19.go
│ │ ├── popcnt_amd64.go
│ │ ├── popcnt_amd64.s
│ │ ├── popcnt_generic.go
│ │ ├── select.go
│ │ ├── trailing_zeros_18.go
│ │ └── trailing_zeros_19.go
│ ├── blang/
│ │ └── semver/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── json.go
│ │ ├── package.json
│ │ ├── range.go
│ │ ├── semver.go
│ │ ├── sort.go
│ │ ├── sql.go
│ │ └── v4/
│ │ ├── LICENSE
│ │ ├── json.go
│ │ ├── range.go
│ │ ├── semver.go
│ │ ├── sort.go
│ │ └── sql.go
│ ├── bmatcuk/
│ │ └── doublestar/
│ │ └── v4/
│ │ ├── .codecov.yml
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── UPGRADING.md
│ │ ├── doublestar.go
│ │ ├── glob.go
│ │ ├── globoptions.go
│ │ ├── globwalk.go
│ │ ├── match.go
│ │ ├── utils.go
│ │ └── validate.go
│ ├── catppuccin/
│ │ └── go/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .goreleaser.yaml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── frappe.go
│ │ ├── latte.go
│ │ ├── macchiato.go
│ │ ├── main.go
│ │ └── mocha.go
│ ├── cenkalti/
│ │ └── backoff/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── backoff.go
│ │ ├── context.go
│ │ ├── exponential.go
│ │ ├── retry.go
│ │ ├── ticker.go
│ │ ├── timer.go
│ │ └── tries.go
│ ├── cespare/
│ │ └── xxhash/
│ │ └── v2/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── testall.sh
│ │ ├── xxhash.go
│ │ ├── xxhash_amd64.s
│ │ ├── xxhash_arm64.s
│ │ ├── xxhash_asm.go
│ │ ├── xxhash_other.go
│ │ ├── xxhash_safe.go
│ │ └── xxhash_unsafe.go
│ ├── charmbracelet/
│ │ ├── bubbles/
│ │ │ ├── LICENSE
│ │ │ ├── cursor/
│ │ │ │ └── cursor.go
│ │ │ ├── filepicker/
│ │ │ │ ├── filepicker.go
│ │ │ │ ├── hidden_unix.go
│ │ │ │ └── hidden_windows.go
│ │ │ ├── help/
│ │ │ │ └── help.go
│ │ │ ├── key/
│ │ │ │ └── key.go
│ │ │ ├── runeutil/
│ │ │ │ └── runeutil.go
│ │ │ ├── spinner/
│ │ │ │ └── spinner.go
│ │ │ ├── textarea/
│ │ │ │ ├── memoization/
│ │ │ │ │ └── memoization.go
│ │ │ │ └── textarea.go
│ │ │ ├── textinput/
│ │ │ │ └── textinput.go
│ │ │ └── viewport/
│ │ │ ├── keymap.go
│ │ │ └── viewport.go
│ │ ├── bubbletea/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .golangci-soft.yml
│ │ │ ├── .golangci.yml
│ │ │ ├── .goreleaser.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── commands.go
│ │ │ ├── exec.go
│ │ │ ├── focus.go
│ │ │ ├── inputreader_other.go
│ │ │ ├── inputreader_windows.go
│ │ │ ├── key.go
│ │ │ ├── key_other.go
│ │ │ ├── key_sequences.go
│ │ │ ├── key_windows.go
│ │ │ ├── logging.go
│ │ │ ├── mouse.go
│ │ │ ├── nil_renderer.go
│ │ │ ├── options.go
│ │ │ ├── renderer.go
│ │ │ ├── screen.go
│ │ │ ├── signals_unix.go
│ │ │ ├── signals_windows.go
│ │ │ ├── standard_renderer.go
│ │ │ ├── tea.go
│ │ │ ├── tea_init.go
│ │ │ ├── tty.go
│ │ │ ├── tty_unix.go
│ │ │ └── tty_windows.go
│ │ ├── huh/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .golangci-soft.yml
│ │ │ ├── .golangci.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── SECURITY.md
│ │ │ ├── accessibility/
│ │ │ │ └── accessibility.go
│ │ │ ├── accessor.go
│ │ │ ├── clamp.go
│ │ │ ├── eval.go
│ │ │ ├── field_confirm.go
│ │ │ ├── field_filepicker.go
│ │ │ ├── field_input.go
│ │ │ ├── field_multiselect.go
│ │ │ ├── field_note.go
│ │ │ ├── field_select.go
│ │ │ ├── field_text.go
│ │ │ ├── form.go
│ │ │ ├── group.go
│ │ │ ├── internal/
│ │ │ │ └── selector/
│ │ │ │ └── selector.go
│ │ │ ├── keymap.go
│ │ │ ├── layout.go
│ │ │ ├── option.go
│ │ │ ├── run.go
│ │ │ ├── theme.go
│ │ │ └── validate.go
│ │ ├── lipgloss/
│ │ │ ├── .gitignore
│ │ │ ├── .golangci-soft.yml
│ │ │ ├── .golangci.yml
│ │ │ ├── .goreleaser.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── align.go
│ │ │ ├── ansi_unix.go
│ │ │ ├── ansi_windows.go
│ │ │ ├── borders.go
│ │ │ ├── color.go
│ │ │ ├── get.go
│ │ │ ├── join.go
│ │ │ ├── position.go
│ │ │ ├── renderer.go
│ │ │ ├── runes.go
│ │ │ ├── set.go
│ │ │ ├── size.go
│ │ │ ├── style.go
│ │ │ ├── unset.go
│ │ │ └── whitespace.go
│ │ └── x/
│ │ ├── ansi/
│ │ │ ├── LICENSE
│ │ │ ├── ansi.go
│ │ │ ├── ascii.go
│ │ │ ├── background.go
│ │ │ ├── c0.go
│ │ │ ├── c1.go
│ │ │ ├── clipboard.go
│ │ │ ├── color.go
│ │ │ ├── csi.go
│ │ │ ├── ctrl.go
│ │ │ ├── cursor.go
│ │ │ ├── dcs.go
│ │ │ ├── doc.go
│ │ │ ├── hyperlink.go
│ │ │ ├── kitty.go
│ │ │ ├── mode.go
│ │ │ ├── osc.go
│ │ │ ├── params.go
│ │ │ ├── parser/
│ │ │ │ ├── const.go
│ │ │ │ ├── seq.go
│ │ │ │ └── transition_table.go
│ │ │ ├── parser.go
│ │ │ ├── parser_decode.go
│ │ │ ├── passthrough.go
│ │ │ ├── screen.go
│ │ │ ├── sequence.go
│ │ │ ├── style.go
│ │ │ ├── termcap.go
│ │ │ ├── title.go
│ │ │ ├── truncate.go
│ │ │ ├── util.go
│ │ │ ├── width.go
│ │ │ ├── wrap.go
│ │ │ └── xterm.go
│ │ ├── exp/
│ │ │ └── strings/
│ │ │ ├── LICENSE
│ │ │ └── join.go
│ │ └── term/
│ │ ├── LICENSE
│ │ ├── term.go
│ │ ├── term_other.go
│ │ ├── term_unix.go
│ │ ├── term_unix_bsd.go
│ │ ├── term_unix_other.go
│ │ ├── term_windows.go
│ │ ├── terminal.go
│ │ └── util.go
│ ├── chrismellard/
│ │ └── docker-credential-acr-env/
│ │ ├── LICENSE
│ │ └── pkg/
│ │ ├── credhelper/
│ │ │ └── helper.go
│ │ ├── registry/
│ │ │ ├── const.go
│ │ │ └── registry.go
│ │ └── token/
│ │ └── token.go
│ ├── coder/
│ │ └── websocket/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── accept.go
│ │ ├── close.go
│ │ ├── compress.go
│ │ ├── conn.go
│ │ ├── dial.go
│ │ ├── doc.go
│ │ ├── frame.go
│ │ ├── internal/
│ │ │ ├── bpool/
│ │ │ │ └── bpool.go
│ │ │ ├── errd/
│ │ │ │ └── wrap.go
│ │ │ ├── util/
│ │ │ │ └── util.go
│ │ │ ├── wsjs/
│ │ │ │ └── wsjs_js.go
│ │ │ └── xsync/
│ │ │ ├── go.go
│ │ │ └── int64.go
│ │ ├── make.sh
│ │ ├── mask.go
│ │ ├── mask_amd64.s
│ │ ├── mask_arm64.s
│ │ ├── mask_asm.go
│ │ ├── mask_go.go
│ │ ├── netconn.go
│ │ ├── netconn_js.go
│ │ ├── netconn_notjs.go
│ │ ├── read.go
│ │ ├── stringer.go
│ │ ├── write.go
│ │ └── ws_js.go
│ ├── compose-spec/
│ │ └── compose-go/
│ │ └── v2/
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ ├── cli/
│ │ │ └── options.go
│ │ ├── consts/
│ │ │ └── consts.go
│ │ ├── dotenv/
│ │ │ ├── LICENSE
│ │ │ ├── env.go
│ │ │ ├── godotenv.go
│ │ │ └── parser.go
│ │ ├── errdefs/
│ │ │ └── errors.go
│ │ ├── format/
│ │ │ └── volume.go
│ │ ├── graph/
│ │ │ ├── cycle.go
│ │ │ ├── graph.go
│ │ │ ├── services.go
│ │ │ └── traversal.go
│ │ ├── interpolation/
│ │ │ └── interpolation.go
│ │ ├── loader/
│ │ │ ├── environment.go
│ │ │ ├── example1.env
│ │ │ ├── example2.env
│ │ │ ├── extends.go
│ │ │ ├── fix.go
│ │ │ ├── full-example.yml
│ │ │ ├── include.go
│ │ │ ├── interpolate.go
│ │ │ ├── loader.go
│ │ │ ├── mapstructure.go
│ │ │ ├── normalize.go
│ │ │ ├── paths.go
│ │ │ ├── reset.go
│ │ │ └── validate.go
│ │ ├── override/
│ │ │ ├── extends.go
│ │ │ ├── merge.go
│ │ │ └── uncity.go
│ │ ├── paths/
│ │ │ ├── context.go
│ │ │ ├── extends.go
│ │ │ ├── home.go
│ │ │ ├── resolve.go
│ │ │ ├── unix.go
│ │ │ └── windows_path.go
│ │ ├── schema/
│ │ │ ├── compose-spec.json
│ │ │ ├── schema.go
│ │ │ └── using-variables.yaml
│ │ ├── template/
│ │ │ ├── template.go
│ │ │ └── variables.go
│ │ ├── transform/
│ │ │ ├── build.go
│ │ │ ├── canonical.go
│ │ │ ├── defaults.go
│ │ │ ├── dependson.go
│ │ │ ├── device.go
│ │ │ ├── envfile.go
│ │ │ ├── extends.go
│ │ │ ├── external.go
│ │ │ ├── include.go
│ │ │ ├── mapping.go
│ │ │ ├── ports.go
│ │ │ ├── secrets.go
│ │ │ ├── services.go
│ │ │ ├── ssh.go
│ │ │ ├── ulimits.go
│ │ │ └── volume.go
│ │ ├── tree/
│ │ │ └── path.go
│ │ ├── types/
│ │ │ ├── bytes.go
│ │ │ ├── command.go
│ │ │ ├── config.go
│ │ │ ├── derived.gen.go
│ │ │ ├── develop.go
│ │ │ ├── device.go
│ │ │ ├── duration.go
│ │ │ ├── envfile.go
│ │ │ ├── healthcheck.go
│ │ │ ├── hostList.go
│ │ │ ├── labels.go
│ │ │ ├── mapping.go
│ │ │ ├── options.go
│ │ │ ├── project.go
│ │ │ ├── services.go
│ │ │ ├── ssh.go
│ │ │ ├── stringOrList.go
│ │ │ └── types.go
│ │ ├── utils/
│ │ │ ├── collectionutils.go
│ │ │ ├── pathutils.go
│ │ │ ├── set.go
│ │ │ └── stringutils.go
│ │ └── validation/
│ │ ├── external.go
│ │ ├── validation.go
│ │ └── volume.go
│ ├── containerd/
│ │ ├── console/
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── console.go
│ │ │ ├── console_linux.go
│ │ │ ├── console_other.go
│ │ │ ├── console_unix.go
│ │ │ ├── console_windows.go
│ │ │ ├── pty_freebsd_cgo.go
│ │ │ ├── pty_freebsd_nocgo.go
│ │ │ ├── pty_unix.go
│ │ │ ├── pty_zos.go
│ │ │ ├── tc_darwin.go
│ │ │ ├── tc_freebsd_cgo.go
│ │ │ ├── tc_freebsd_nocgo.go
│ │ │ ├── tc_linux.go
│ │ │ ├── tc_netbsd.go
│ │ │ ├── tc_openbsd_cgo.go
│ │ │ ├── tc_openbsd_nocgo.go
│ │ │ ├── tc_unix.go
│ │ │ └── tc_zos.go
│ │ ├── containerd/
│ │ │ ├── api/
│ │ │ │ ├── LICENSE
│ │ │ │ └── services/
│ │ │ │ └── content/
│ │ │ │ └── v1/
│ │ │ │ ├── content.pb.go
│ │ │ │ ├── content.proto
│ │ │ │ ├── content_grpc.pb.go
│ │ │ │ ├── content_ttrpc.pb.go
│ │ │ │ └── doc.go
│ │ │ └── v2/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── core/
│ │ │ │ ├── content/
│ │ │ │ │ ├── adaptor.go
│ │ │ │ │ ├── content.go
│ │ │ │ │ ├── helpers.go
│ │ │ │ │ └── proxy/
│ │ │ │ │ ├── content_reader.go
│ │ │ │ │ ├── content_store.go
│ │ │ │ │ └── content_writer.go
│ │ │ │ ├── images/
│ │ │ │ │ ├── annotations.go
│ │ │ │ │ ├── diffid.go
│ │ │ │ │ ├── handlers.go
│ │ │ │ │ ├── image.go
│ │ │ │ │ ├── importexport.go
│ │ │ │ │ ├── labels.go
│ │ │ │ │ └── mediatypes.go
│ │ │ │ ├── leases/
│ │ │ │ │ ├── context.go
│ │ │ │ │ ├── grpc.go
│ │ │ │ │ ├── id.go
│ │ │ │ │ └── lease.go
│ │ │ │ └── remotes/
│ │ │ │ ├── docker/
│ │ │ │ │ ├── auth/
│ │ │ │ │ │ ├── fetch.go
│ │ │ │ │ │ └── parse.go
│ │ │ │ │ ├── authorizer.go
│ │ │ │ │ ├── converter.go
│ │ │ │ │ ├── converter_fuzz.go
│ │ │ │ │ ├── errcode.go
│ │ │ │ │ ├── errdesc.go
│ │ │ │ │ ├── fetcher.go
│ │ │ │ │ ├── fetcher_fuzz.go
│ │ │ │ │ ├── handler.go
│ │ │ │ │ ├── httpreadseeker.go
│ │ │ │ │ ├── pusher.go
│ │ │ │ │ ├── registry.go
│ │ │ │ │ ├── resolver.go
│ │ │ │ │ ├── resolver_unix.go
│ │ │ │ │ ├── resolver_windows.go
│ │ │ │ │ ├── schema1/
│ │ │ │ │ │ └── converter.go
│ │ │ │ │ ├── scope.go
│ │ │ │ │ └── status.go
│ │ │ │ ├── errors/
│ │ │ │ │ └── errors.go
│ │ │ │ ├── handlers.go
│ │ │ │ └── resolver.go
│ │ │ ├── defaults/
│ │ │ │ ├── defaults.go
│ │ │ │ ├── defaults_darwin.go
│ │ │ │ ├── defaults_differ_windows.go
│ │ │ │ ├── defaults_freebsd.go
│ │ │ │ ├── defaults_linux.go
│ │ │ │ ├── defaults_snapshotter_linux.go
│ │ │ │ ├── defaults_snapshotter_unix.go
│ │ │ │ ├── defaults_snapshotter_windows.go
│ │ │ │ ├── defaults_unix.go
│ │ │ │ ├── defaults_windows.go
│ │ │ │ └── doc.go
│ │ │ ├── internal/
│ │ │ │ ├── fsverity/
│ │ │ │ │ ├── fsverity_linux.go
│ │ │ │ │ └── fsverity_other.go
│ │ │ │ └── randutil/
│ │ │ │ └── randutil.go
│ │ │ ├── pkg/
│ │ │ │ ├── archive/
│ │ │ │ │ └── compression/
│ │ │ │ │ ├── compression.go
│ │ │ │ │ └── compression_fuzzer.go
│ │ │ │ ├── deprecation/
│ │ │ │ │ └── deprecation.go
│ │ │ │ ├── filters/
│ │ │ │ │ ├── adaptor.go
│ │ │ │ │ ├── filter.go
│ │ │ │ │ ├── parser.go
│ │ │ │ │ ├── quote.go
│ │ │ │ │ └── scanner.go
│ │ │ │ ├── identifiers/
│ │ │ │ │ └── validate.go
│ │ │ │ ├── kernelversion/
│ │ │ │ │ └── kernel_linux.go
│ │ │ │ ├── labels/
│ │ │ │ │ ├── labels.go
│ │ │ │ │ └── validate.go
│ │ │ │ ├── namespaces/
│ │ │ │ │ ├── context.go
│ │ │ │ │ ├── grpc.go
│ │ │ │ │ ├── store.go
│ │ │ │ │ └── ttrpc.go
│ │ │ │ ├── protobuf/
│ │ │ │ │ ├── compare.go
│ │ │ │ │ ├── timestamp.go
│ │ │ │ │ └── types/
│ │ │ │ │ └── types.go
│ │ │ │ ├── reference/
│ │ │ │ │ └── reference.go
│ │ │ │ └── tracing/
│ │ │ │ ├── helpers.go
│ │ │ │ ├── log.go
│ │ │ │ └── tracing.go
│ │ │ ├── plugins/
│ │ │ │ ├── content/
│ │ │ │ │ └── local/
│ │ │ │ │ ├── content_local_fuzzer.go
│ │ │ │ │ ├── locks.go
│ │ │ │ │ ├── readerat.go
│ │ │ │ │ ├── store.go
│ │ │ │ │ ├── store_bsd.go
│ │ │ │ │ ├── store_openbsd.go
│ │ │ │ │ ├── store_unix.go
│ │ │ │ │ ├── store_windows.go
│ │ │ │ │ ├── test_helper.go
│ │ │ │ │ └── writer.go
│ │ │ │ └── services/
│ │ │ │ └── content/
│ │ │ │ └── contentserver/
│ │ │ │ └── contentserver.go
│ │ │ └── version/
│ │ │ └── version.go
│ │ ├── continuity/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ └── sysx/
│ │ │ ├── README.md
│ │ │ ├── nodata_linux.go
│ │ │ ├── nodata_solaris.go
│ │ │ ├── nodata_unix.go
│ │ │ ├── xattr.go
│ │ │ └── xattr_unsupported.go
│ │ ├── errdefs/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── errors.go
│ │ │ ├── pkg/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── errgrpc/
│ │ │ │ │ └── grpc.go
│ │ │ │ └── internal/
│ │ │ │ ├── cause/
│ │ │ │ │ └── cause.go
│ │ │ │ └── types/
│ │ │ │ └── collapsible.go
│ │ │ └── resolve.go
│ │ ├── log/
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── context.go
│ │ ├── platforms/
│ │ │ ├── .gitattributes
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── compare.go
│ │ │ ├── cpuinfo.go
│ │ │ ├── cpuinfo_linux.go
│ │ │ ├── cpuinfo_other.go
│ │ │ ├── database.go
│ │ │ ├── defaults.go
│ │ │ ├── defaults_darwin.go
│ │ │ ├── defaults_freebsd.go
│ │ │ ├── defaults_unix.go
│ │ │ ├── defaults_windows.go
│ │ │ ├── errors.go
│ │ │ ├── platform_windows_compat.go
│ │ │ └── platforms.go
│ │ ├── stargz-snapshotter/
│ │ │ └── estargz/
│ │ │ ├── LICENSE
│ │ │ ├── build.go
│ │ │ ├── errorutil/
│ │ │ │ └── errors.go
│ │ │ ├── estargz.go
│ │ │ ├── gzip.go
│ │ │ ├── testutil.go
│ │ │ └── types.go
│ │ ├── ttrpc/
│ │ │ ├── .gitattributes
│ │ │ ├── .gitignore
│ │ │ ├── .golangci.yml
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── PROTOCOL.md
│ │ │ ├── Protobuild.toml
│ │ │ ├── README.md
│ │ │ ├── channel.go
│ │ │ ├── client.go
│ │ │ ├── codec.go
│ │ │ ├── config.go
│ │ │ ├── doc.go
│ │ │ ├── errors.go
│ │ │ ├── handshake.go
│ │ │ ├── interceptor.go
│ │ │ ├── metadata.go
│ │ │ ├── request.pb.go
│ │ │ ├── request.proto
│ │ │ ├── server.go
│ │ │ ├── services.go
│ │ │ ├── stream.go
│ │ │ ├── stream_server.go
│ │ │ ├── test.proto
│ │ │ └── unixcreds_linux.go
│ │ └── typeurl/
│ │ └── v2/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── doc.go
│ │ ├── types.go
│ │ └── types_gogo.go
│ ├── containers/
│ │ ├── image/
│ │ │ └── v5/
│ │ │ ├── LICENSE
│ │ │ ├── docker/
│ │ │ │ └── reference/
│ │ │ │ ├── README.md
│ │ │ │ ├── helpers.go
│ │ │ │ ├── normalize.go
│ │ │ │ ├── reference.go
│ │ │ │ ├── regexp-additions.go
│ │ │ │ └── regexp.go
│ │ │ ├── internal/
│ │ │ │ ├── multierr/
│ │ │ │ │ └── multierr.go
│ │ │ │ ├── rootless/
│ │ │ │ │ └── rootless.go
│ │ │ │ └── set/
│ │ │ │ └── set.go
│ │ │ ├── pkg/
│ │ │ │ ├── compression/
│ │ │ │ │ ├── internal/
│ │ │ │ │ │ └── types.go
│ │ │ │ │ └── types/
│ │ │ │ │ └── types.go
│ │ │ │ ├── docker/
│ │ │ │ │ └── config/
│ │ │ │ │ └── config.go
│ │ │ │ └── sysregistriesv2/
│ │ │ │ ├── paths_common.go
│ │ │ │ ├── paths_freebsd.go
│ │ │ │ ├── shortnames.go
│ │ │ │ └── system_registries_v2.go
│ │ │ └── types/
│ │ │ └── types.go
│ │ └── storage/
│ │ ├── AUTHORS
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ └── pkg/
│ │ ├── fileutils/
│ │ │ ├── exists_freebsd.go
│ │ │ ├── exists_unix.go
│ │ │ ├── exists_windows.go
│ │ │ ├── fileutils.go
│ │ │ ├── fileutils_darwin.go
│ │ │ ├── fileutils_solaris.go
│ │ │ ├── fileutils_unix.go
│ │ │ └── fileutils_windows.go
│ │ ├── homedir/
│ │ │ ├── homedir.go
│ │ │ ├── homedir_unix.go
│ │ │ └── homedir_windows.go
│ │ ├── idtools/
│ │ │ ├── idtools.go
│ │ │ ├── idtools_supported.go
│ │ │ ├── idtools_unix.go
│ │ │ ├── idtools_unsupported.go
│ │ │ ├── idtools_windows.go
│ │ │ ├── parser.go
│ │ │ ├── usergroupadd_linux.go
│ │ │ ├── usergroupadd_unsupported.go
│ │ │ └── utils_unix.go
│ │ ├── ioutils/
│ │ │ ├── buffer.go
│ │ │ ├── bytespipe.go
│ │ │ ├── fswriters.go
│ │ │ ├── fswriters_linux.go
│ │ │ ├── fswriters_other.go
│ │ │ ├── readers.go
│ │ │ ├── temp_unix.go
│ │ │ ├── temp_windows.go
│ │ │ ├── writeflusher.go
│ │ │ └── writers.go
│ │ ├── lockfile/
│ │ │ ├── lastwrite.go
│ │ │ ├── lockfile.go
│ │ │ ├── lockfile_unix.go
│ │ │ └── lockfile_windows.go
│ │ ├── longpath/
│ │ │ └── longpath.go
│ │ ├── mount/
│ │ │ ├── flags.go
│ │ │ ├── flags_freebsd.go
│ │ │ ├── flags_linux.go
│ │ │ ├── flags_unsupported.go
│ │ │ ├── mount.go
│ │ │ ├── mounter_freebsd.go
│ │ │ ├── mounter_linux.go
│ │ │ ├── mounter_unsupported.go
│ │ │ ├── mountinfo.go
│ │ │ ├── mountinfo_linux.go
│ │ │ ├── sharedsubtree_linux.go
│ │ │ ├── unmount_unix.go
│ │ │ └── unmount_unsupported.go
│ │ ├── reexec/
│ │ │ ├── README.md
│ │ │ ├── command_freebsd.go
│ │ │ ├── command_linux.go
│ │ │ ├── command_unix.go
│ │ │ ├── command_unsupported.go
│ │ │ ├── command_windows.go
│ │ │ └── reexec.go
│ │ ├── regexp/
│ │ │ ├── regexp.go
│ │ │ ├── regexp_dontprecompile.go
│ │ │ └── regexp_precompile.go
│ │ ├── system/
│ │ │ ├── chmod.go
│ │ │ ├── chtimes.go
│ │ │ ├── chtimes_unix.go
│ │ │ ├── chtimes_windows.go
│ │ │ ├── errors.go
│ │ │ ├── exitcode.go
│ │ │ ├── init.go
│ │ │ ├── init_windows.go
│ │ │ ├── lchflags_bsd.go
│ │ │ ├── lchown.go
│ │ │ ├── lcow_unix.go
│ │ │ ├── lcow_windows.go
│ │ │ ├── lstat_unix.go
│ │ │ ├── lstat_windows.go
│ │ │ ├── meminfo.go
│ │ │ ├── meminfo_freebsd.go
│ │ │ ├── meminfo_linux.go
│ │ │ ├── meminfo_solaris.go
│ │ │ ├── meminfo_unsupported.go
│ │ │ ├── meminfo_windows.go
│ │ │ ├── mknod.go
│ │ │ ├── mknod_freebsd.go
│ │ │ ├── mknod_windows.go
│ │ │ ├── path.go
│ │ │ ├── path_unix.go
│ │ │ ├── path_windows.go
│ │ │ ├── process_unix.go
│ │ │ ├── rm.go
│ │ │ ├── rm_common.go
│ │ │ ├── rm_freebsd.go
│ │ │ ├── stat_common.go
│ │ │ ├── stat_darwin.go
│ │ │ ├── stat_freebsd.go
│ │ │ ├── stat_linux.go
│ │ │ ├── stat_openbsd.go
│ │ │ ├── stat_solaris.go
│ │ │ ├── stat_unix.go
│ │ │ ├── stat_windows.go
│ │ │ ├── syscall_unix.go
│ │ │ ├── syscall_windows.go
│ │ │ ├── umask.go
│ │ │ ├── umask_windows.go
│ │ │ ├── utimes_freebsd.go
│ │ │ ├── utimes_linux.go
│ │ │ ├── utimes_unsupported.go
│ │ │ ├── xattrs_darwin.go
│ │ │ ├── xattrs_linux.go
│ │ │ └── xattrs_unsupported.go
│ │ └── unshare/
│ │ ├── getenv_linux_cgo.go
│ │ ├── getenv_linux_nocgo.go
│ │ ├── unshare.c
│ │ ├── unshare.go
│ │ ├── unshare_cgo.go
│ │ ├── unshare_darwin.go
│ │ ├── unshare_freebsd.c
│ │ ├── unshare_freebsd.go
│ │ ├── unshare_gccgo.go
│ │ ├── unshare_linux.go
│ │ ├── unshare_unsupported.go
│ │ └── unshare_unsupported_cgo.go
│ ├── coreos/
│ │ ├── go-iptables/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ └── iptables/
│ │ │ ├── iptables.go
│ │ │ └── lock.go
│ │ ├── go-semver/
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ └── semver/
│ │ │ ├── semver.go
│ │ │ └── sort.go
│ │ └── go-systemd/
│ │ └── v22/
│ │ ├── LICENSE
│ │ ├── NOTICE
│ │ ├── daemon/
│ │ │ ├── sdnotify.go
│ │ │ └── watchdog.go
│ │ └── journal/
│ │ ├── journal.go
│ │ ├── journal_unix.go
│ │ └── journal_windows.go
│ ├── creack/
│ │ └── pty/
│ │ ├── .editorconfig
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── Dockerfile.golang
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── asm_solaris_amd64.s
│ │ ├── doc.go
│ │ ├── ioctl.go
│ │ ├── ioctl_bsd.go
│ │ ├── ioctl_inner.go
│ │ ├── ioctl_legacy.go
│ │ ├── ioctl_solaris.go
│ │ ├── ioctl_unsupported.go
│ │ ├── mktypes.bash
│ │ ├── pty_darwin.go
│ │ ├── pty_dragonfly.go
│ │ ├── pty_freebsd.go
│ │ ├── pty_linux.go
│ │ ├── pty_netbsd.go
│ │ ├── pty_openbsd.go
│ │ ├── pty_solaris.go
│ │ ├── pty_unsupported.go
│ │ ├── run.go
│ │ ├── start.go
│ │ ├── start_windows.go
│ │ ├── test_crosscompile.sh
│ │ ├── winsize.go
│ │ ├── winsize_unix.go
│ │ ├── winsize_unsupported.go
│ │ ├── ztypes_386.go
│ │ ├── ztypes_amd64.go
│ │ ├── ztypes_arm.go
│ │ ├── ztypes_arm64.go
│ │ ├── ztypes_dragonfly_amd64.go
│ │ ├── ztypes_freebsd_386.go
│ │ ├── ztypes_freebsd_amd64.go
│ │ ├── ztypes_freebsd_arm.go
│ │ ├── ztypes_freebsd_arm64.go
│ │ ├── ztypes_freebsd_ppc64.go
│ │ ├── ztypes_freebsd_riscv64.go
│ │ ├── ztypes_loong64.go
│ │ ├── ztypes_mipsx.go
│ │ ├── ztypes_netbsd_32bit_int.go
│ │ ├── ztypes_openbsd_32bit_int.go
│ │ ├── ztypes_ppc.go
│ │ ├── ztypes_ppc64.go
│ │ ├── ztypes_ppc64le.go
│ │ ├── ztypes_riscvx.go
│ │ ├── ztypes_s390x.go
│ │ └── ztypes_sparcx.go
│ ├── davecgh/
│ │ └── go-spew/
│ │ ├── LICENSE
│ │ └── spew/
│ │ ├── bypass.go
│ │ ├── bypasssafe.go
│ │ ├── common.go
│ │ ├── config.go
│ │ ├── doc.go
│ │ ├── dump.go
│ │ ├── format.go
│ │ └── spew.go
│ ├── dblohm7/
│ │ └── wingoes/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── com/
│ │ │ ├── api.go
│ │ │ ├── automation/
│ │ │ │ ├── automation.go
│ │ │ │ ├── mksyscall.go
│ │ │ │ ├── types.go
│ │ │ │ └── zsyscall_windows.go
│ │ │ ├── com.go
│ │ │ ├── globalopts.go
│ │ │ ├── guid.go
│ │ │ ├── interface.go
│ │ │ ├── mksyscall.go
│ │ │ ├── object.go
│ │ │ ├── process.go
│ │ │ ├── stream.go
│ │ │ ├── stream_not386.go
│ │ │ ├── stream_windows_386.go
│ │ │ ├── types.go
│ │ │ ├── unknown.go
│ │ │ └── zsyscall_windows.go
│ │ ├── error.go
│ │ ├── guid.go
│ │ ├── guid_notwindows.go
│ │ ├── guid_windows.go
│ │ ├── hresult.go
│ │ ├── internal/
│ │ │ └── types.go
│ │ ├── osversion.go
│ │ ├── pe/
│ │ │ ├── oh.go
│ │ │ ├── pe.go
│ │ │ ├── pe_386.go
│ │ │ ├── pe_amd64.go
│ │ │ ├── pe_arm64.go
│ │ │ ├── pe_notwindows.go
│ │ │ ├── pe_windows.go
│ │ │ └── version.go
│ │ ├── time.go
│ │ └── util.go
│ ├── denisbrodbeck/
│ │ └── machineid/
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── README.md
│ │ ├── helper.go
│ │ ├── id.go
│ │ ├── id_bsd.go
│ │ ├── id_darwin.go
│ │ ├── id_linux.go
│ │ ├── id_windows.go
│ │ └── makefile
│ ├── digitalocean/
│ │ └── go-smbios/
│ │ ├── AUTHORS
│ │ ├── LICENSE.md
│ │ └── smbios/
│ │ ├── decoder.go
│ │ ├── doc.go
│ │ ├── entrypoint.go
│ │ ├── fuzz.go
│ │ ├── stream_linux.go
│ │ ├── stream_memory.go
│ │ ├── stream_others.go
│ │ ├── stream_unix.go
│ │ ├── stream_windows.go
│ │ └── structure.go
│ ├── dimchansky/
│ │ └── utfbom/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── utfbom.go
│ ├── distribution/
│ │ └── reference/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE-OF-CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── GOVERNANCE.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── helpers.go
│ │ ├── normalize.go
│ │ ├── reference.go
│ │ ├── regexp.go
│ │ └── sort.go
│ ├── docker/
│ │ ├── cli/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ └── cli/
│ │ │ └── config/
│ │ │ ├── config.go
│ │ │ ├── configfile/
│ │ │ │ ├── file.go
│ │ │ │ ├── file_unix.go
│ │ │ │ └── file_windows.go
│ │ │ ├── credentials/
│ │ │ │ ├── credentials.go
│ │ │ │ ├── default_store.go
│ │ │ │ ├── default_store_darwin.go
│ │ │ │ ├── default_store_linux.go
│ │ │ │ ├── default_store_unsupported.go
│ │ │ │ ├── default_store_windows.go
│ │ │ │ ├── file_store.go
│ │ │ │ └── native_store.go
│ │ │ └── types/
│ │ │ └── authconfig.go
│ │ ├── distribution/
│ │ │ ├── LICENSE
│ │ │ └── registry/
│ │ │ └── client/
│ │ │ └── auth/
│ │ │ └── challenge/
│ │ │ ├── addr.go
│ │ │ └── authchallenge.go
│ │ ├── docker/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ ├── NOTICE
│ │ │ ├── api/
│ │ │ │ ├── README.md
│ │ │ │ ├── common.go
│ │ │ │ ├── swagger-gen.yaml
│ │ │ │ ├── swagger.yaml
│ │ │ │ └── types/
│ │ │ │ ├── blkiodev/
│ │ │ │ │ └── blkio.go
│ │ │ │ ├── checkpoint/
│ │ │ │ │ ├── list.go
│ │ │ │ │ └── options.go
│ │ │ │ ├── client.go
│ │ │ │ ├── container/
│ │ │ │ │ ├── change_type.go
│ │ │ │ │ ├── change_types.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── container_top.go
│ │ │ │ │ ├── container_update.go
│ │ │ │ │ ├── create_request.go
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── errors.go
│ │ │ │ │ ├── exec.go
│ │ │ │ │ ├── filesystem_change.go
│ │ │ │ │ ├── hostconfig.go
│ │ │ │ │ ├── hostconfig_unix.go
│ │ │ │ │ ├── hostconfig_windows.go
│ │ │ │ │ ├── options.go
│ │ │ │ │ ├── stats.go
│ │ │ │ │ ├── wait_exit_error.go
│ │ │ │ │ ├── wait_response.go
│ │ │ │ │ └── waitcondition.go
│ │ │ │ ├── error_response.go
│ │ │ │ ├── error_response_ext.go
│ │ │ │ ├── events/
│ │ │ │ │ └── events.go
│ │ │ │ ├── filters/
│ │ │ │ │ ├── errors.go
│ │ │ │ │ └── parse.go
│ │ │ │ ├── graph_driver_data.go
│ │ │ │ ├── id_response.go
│ │ │ │ ├── image/
│ │ │ │ │ ├── delete_response.go
│ │ │ │ │ ├── image.go
│ │ │ │ │ ├── image_history.go
│ │ │ │ │ ├── manifest.go
│ │ │ │ │ ├── opts.go
│ │ │ │ │ └── summary.go
│ │ │ │ ├── mount/
│ │ │ │ │ └── mount.go
│ │ │ │ ├── network/
│ │ │ │ │ ├── create_response.go
│ │ │ │ │ ├── endpoint.go
│ │ │ │ │ ├── ipam.go
│ │ │ │ │ └── network.go
│ │ │ │ ├── plugin.go
│ │ │ │ ├── plugin_device.go
│ │ │ │ ├── plugin_env.go
│ │ │ │ ├── plugin_interface_type.go
│ │ │ │ ├── plugin_mount.go
│ │ │ │ ├── plugin_responses.go
│ │ │ │ ├── port.go
│ │ │ │ ├── registry/
│ │ │ │ │ ├── authconfig.go
│ │ │ │ │ ├── authenticate.go
│ │ │ │ │ ├── registry.go
│ │ │ │ │ └── search.go
│ │ │ │ ├── strslice/
│ │ │ │ │ └── strslice.go
│ │ │ │ ├── swarm/
│ │ │ │ │ ├── common.go
│ │ │ │ │ ├── config.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── network.go
│ │ │ │ │ ├── node.go
│ │ │ │ │ ├── runtime/
│ │ │ │ │ │ ├── gen.go
│ │ │ │ │ │ ├── plugin.pb.go
│ │ │ │ │ │ └── plugin.proto
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ ├── secret.go
│ │ │ │ │ ├── service.go
│ │ │ │ │ ├── service_create_response.go
│ │ │ │ │ ├── service_update_response.go
│ │ │ │ │ ├── swarm.go
│ │ │ │ │ └── task.go
│ │ │ │ ├── system/
│ │ │ │ │ ├── info.go
│ │ │ │ │ ├── runtime.go
│ │ │ │ │ └── security_opts.go
│ │ │ │ ├── time/
│ │ │ │ │ └── timestamp.go
│ │ │ │ ├── types.go
│ │ │ │ ├── types_deprecated.go
│ │ │ │ ├── versions/
│ │ │ │ │ └── compare.go
│ │ │ │ └── volume/
│ │ │ │ ├── cluster_volume.go
│ │ │ │ ├── create_options.go
│ │ │ │ ├── list_response.go
│ │ │ │ ├── options.go
│ │ │ │ ├── volume.go
│ │ │ │ └── volume_update.go
│ │ │ ├── client/
│ │ │ │ ├── README.md
│ │ │ │ ├── build_cancel.go
│ │ │ │ ├── build_prune.go
│ │ │ │ ├── checkpoint_create.go
│ │ │ │ ├── checkpoint_delete.go
│ │ │ │ ├── checkpoint_list.go
│ │ │ │ ├── client.go
│ │ │ │ ├── client_deprecated.go
│ │ │ │ ├── client_unix.go
│ │ │ │ ├── client_windows.go
│ │ │ │ ├── config_create.go
│ │ │ │ ├── config_inspect.go
│ │ │ │ ├── config_list.go
│ │ │ │ ├── config_remove.go
│ │ │ │ ├── config_update.go
│ │ │ │ ├── container_attach.go
│ │ │ │ ├── container_commit.go
│ │ │ │ ├── container_copy.go
│ │ │ │ ├── container_create.go
│ │ │ │ ├── container_diff.go
│ │ │ │ ├── container_exec.go
│ │ │ │ ├── container_export.go
│ │ │ │ ├── container_inspect.go
│ │ │ │ ├── container_kill.go
│ │ │ │ ├── container_list.go
│ │ │ │ ├── container_logs.go
│ │ │ │ ├── container_pause.go
│ │ │ │ ├── container_prune.go
│ │ │ │ ├── container_remove.go
│ │ │ │ ├── container_rename.go
│ │ │ │ ├── container_resize.go
│ │ │ │ ├── container_restart.go
│ │ │ │ ├── container_start.go
│ │ │ │ ├── container_stats.go
│ │ │ │ ├── container_stop.go
│ │ │ │ ├── container_top.go
│ │ │ │ ├── container_unpause.go
│ │ │ │ ├── container_update.go
│ │ │ │ ├── container_wait.go
│ │ │ │ ├── disk_usage.go
│ │ │ │ ├── distribution_inspect.go
│ │ │ │ ├── envvars.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── events.go
│ │ │ │ ├── hijack.go
│ │ │ │ ├── image_build.go
│ │ │ │ ├── image_create.go
│ │ │ │ ├── image_history.go
│ │ │ │ ├── image_import.go
│ │ │ │ ├── image_inspect.go
│ │ │ │ ├── image_list.go
│ │ │ │ ├── image_load.go
│ │ │ │ ├── image_prune.go
│ │ │ │ ├── image_pull.go
│ │ │ │ ├── image_push.go
│ │ │ │ ├── image_remove.go
│ │ │ │ ├── image_save.go
│ │ │ │ ├── image_search.go
│ │ │ │ ├── image_tag.go
│ │ │ │ ├── info.go
│ │ │ │ ├── interface.go
│ │ │ │ ├── interface_experimental.go
│ │ │ │ ├── interface_stable.go
│ │ │ │ ├── login.go
│ │ │ │ ├── network_connect.go
│ │ │ │ ├── network_create.go
│ │ │ │ ├── network_disconnect.go
│ │ │ │ ├── network_inspect.go
│ │ │ │ ├── network_list.go
│ │ │ │ ├── network_prune.go
│ │ │ │ ├── network_remove.go
│ │ │ │ ├── node_inspect.go
│ │ │ │ ├── node_list.go
│ │ │ │ ├── node_remove.go
│ │ │ │ ├── node_update.go
│ │ │ │ ├── options.go
│ │ │ │ ├── ping.go
│ │ │ │ ├── plugin_create.go
│ │ │ │ ├── plugin_disable.go
│ │ │ │ ├── plugin_enable.go
│ │ │ │ ├── plugin_inspect.go
│ │ │ │ ├── plugin_install.go
│ │ │ │ ├── plugin_list.go
│ │ │ │ ├── plugin_push.go
│ │ │ │ ├── plugin_remove.go
│ │ │ │ ├── plugin_set.go
│ │ │ │ ├── plugin_upgrade.go
│ │ │ │ ├── request.go
│ │ │ │ ├── secret_create.go
│ │ │ │ ├── secret_inspect.go
│ │ │ │ ├── secret_list.go
│ │ │ │ ├── secret_remove.go
│ │ │ │ ├── secret_update.go
│ │ │ │ ├── service_create.go
│ │ │ │ ├── service_inspect.go
│ │ │ │ ├── service_list.go
│ │ │ │ ├── service_logs.go
│ │ │ │ ├── service_remove.go
│ │ │ │ ├── service_update.go
│ │ │ │ ├── swarm_get_unlock_key.go
│ │ │ │ ├── swarm_init.go
│ │ │ │ ├── swarm_inspect.go
│ │ │ │ ├── swarm_join.go
│ │ │ │ ├── swarm_leave.go
│ │ │ │ ├── swarm_unlock.go
│ │ │ │ ├── swarm_update.go
│ │ │ │ ├── task_inspect.go
│ │ │ │ ├── task_list.go
│ │ │ │ ├── task_logs.go
│ │ │ │ ├── utils.go
│ │ │ │ ├── version.go
│ │ │ │ ├── volume_create.go
│ │ │ │ ├── volume_inspect.go
│ │ │ │ ├── volume_list.go
│ │ │ │ ├── volume_prune.go
│ │ │ │ ├── volume_remove.go
│ │ │ │ └── volume_update.go
│ │ │ ├── errdefs/
│ │ │ │ ├── defs.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── helpers.go
│ │ │ │ ├── http_helpers.go
│ │ │ │ └── is.go
│ │ │ ├── internal/
│ │ │ │ └── multierror/
│ │ │ │ └── multierror.go
│ │ │ └── pkg/
│ │ │ ├── homedir/
│ │ │ │ ├── homedir.go
│ │ │ │ ├── homedir_linux.go
│ │ │ │ └── homedir_others.go
│ │ │ └── longpath/
│ │ │ └── longpath.go
│ │ ├── docker-credential-helpers/
│ │ │ ├── LICENSE
│ │ │ ├── client/
│ │ │ │ ├── client.go
│ │ │ │ └── command.go
│ │ │ └── credentials/
│ │ │ ├── credentials.go
│ │ │ ├── error.go
│ │ │ ├── helper.go
│ │ │ └── version.go
│ │ ├── go-connections/
│ │ │ ├── LICENSE
│ │ │ ├── nat/
│ │ │ │ ├── nat.go
│ │ │ │ ├── parse.go
│ │ │ │ └── sort.go
│ │ │ ├── sockets/
│ │ │ │ ├── README.md
│ │ │ │ ├── inmem_socket.go
│ │ │ │ ├── proxy.go
│ │ │ │ ├── sockets.go
│ │ │ │ ├── sockets_unix.go
│ │ │ │ ├── sockets_windows.go
│ │ │ │ ├── tcp_socket.go
│ │ │ │ └── unix_socket.go
│ │ │ └── tlsconfig/
│ │ │ ├── certpool.go
│ │ │ ├── config.go
│ │ │ └── config_client_ciphers.go
│ │ └── go-units/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── README.md
│ │ ├── circle.yml
│ │ ├── duration.go
│ │ ├── size.go
│ │ └── ulimit.go
│ ├── dustin/
│ │ └── go-humanize/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.markdown
│ │ ├── big.go
│ │ ├── bigbytes.go
│ │ ├── bytes.go
│ │ ├── comma.go
│ │ ├── commaf.go
│ │ ├── ftoa.go
│ │ ├── humanize.go
│ │ ├── number.go
│ │ ├── ordinals.go
│ │ ├── si.go
│ │ └── times.go
│ ├── emicklei/
│ │ └── go-restful/
│ │ └── v3/
│ │ ├── .gitignore
│ │ ├── .goconvey
│ │ ├── .travis.yml
│ │ ├── CHANGES.md
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── Srcfile
│ │ ├── bench_test.sh
│ │ ├── compress.go
│ │ ├── compressor_cache.go
│ │ ├── compressor_pools.go
│ │ ├── compressors.go
│ │ ├── constants.go
│ │ ├── container.go
│ │ ├── cors_filter.go
│ │ ├── coverage.sh
│ │ ├── curly.go
│ │ ├── curly_route.go
│ │ ├── custom_verb.go
│ │ ├── doc.go
│ │ ├── entity_accessors.go
│ │ ├── extensions.go
│ │ ├── filter.go
│ │ ├── filter_adapter.go
│ │ ├── jsr311.go
│ │ ├── log/
│ │ │ └── log.go
│ │ ├── logger.go
│ │ ├── mime.go
│ │ ├── options_filter.go
│ │ ├── parameter.go
│ │ ├── path_expression.go
│ │ ├── path_processor.go
│ │ ├── request.go
│ │ ├── response.go
│ │ ├── route.go
│ │ ├── route_builder.go
│ │ ├── route_reader.go
│ │ ├── router.go
│ │ ├── service_error.go
│ │ ├── web_service.go
│ │ └── web_service_container.go
│ ├── erikgeiser/
│ │ └── coninput/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── keycodes.go
│ │ ├── mode.go
│ │ ├── read.go
│ │ └── records.go
│ ├── evanphx/
│ │ └── json-patch/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── errors.go
│ │ ├── merge.go
│ │ ├── patch.go
│ │ └── v5/
│ │ ├── LICENSE
│ │ ├── errors.go
│ │ ├── internal/
│ │ │ └── json/
│ │ │ ├── decode.go
│ │ │ ├── encode.go
│ │ │ ├── fold.go
│ │ │ ├── fuzz.go
│ │ │ ├── indent.go
│ │ │ ├── scanner.go
│ │ │ ├── stream.go
│ │ │ ├── tables.go
│ │ │ └── tags.go
│ │ ├── merge.go
│ │ └── patch.go
│ ├── felixge/
│ │ └── httpsnoop/
│ │ ├── .gitignore
│ │ ├── LICENSE.txt
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── capture_metrics.go
│ │ ├── docs.go
│ │ ├── wrap_generated_gteq_1.8.go
│ │ └── wrap_generated_lt_1.8.go
│ ├── fsnotify/
│ │ └── fsnotify/
│ │ ├── .cirrus.yml
│ │ ├── .editorconfig
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .mailmap
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── backend_fen.go
│ │ ├── backend_inotify.go
│ │ ├── backend_kqueue.go
│ │ ├── backend_other.go
│ │ ├── backend_windows.go
│ │ ├── fsnotify.go
│ │ ├── mkdoc.zsh
│ │ ├── system_bsd.go
│ │ └── system_darwin.go
│ ├── fxamacker/
│ │ └── cbor/
│ │ └── v2/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── bytestring.go
│ │ ├── cache.go
│ │ ├── common.go
│ │ ├── decode.go
│ │ ├── diagnose.go
│ │ ├── doc.go
│ │ ├── encode.go
│ │ ├── encode_map.go
│ │ ├── encode_map_go117.go
│ │ ├── simplevalue.go
│ │ ├── stream.go
│ │ ├── structfields.go
│ │ ├── tag.go
│ │ └── valid.go
│ ├── gaissmai/
│ │ └── bart/
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── base_index.go
│ │ ├── dumper.go
│ │ ├── jsonify.go
│ │ ├── node.go
│ │ ├── stringify.go
│ │ └── table.go
│ ├── ghodss/
│ │ └── yaml/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── fields.go
│ │ └── yaml.go
│ ├── go-json-experiment/
│ │ └── json/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── arshal.go
│ │ ├── arshal_any.go
│ │ ├── arshal_default.go
│ │ ├── arshal_funcs.go
│ │ ├── arshal_inlined.go
│ │ ├── arshal_methods.go
│ │ ├── arshal_time.go
│ │ ├── doc.go
│ │ ├── errors.go
│ │ ├── fields.go
│ │ ├── fold.go
│ │ ├── intern.go
│ │ ├── internal/
│ │ │ ├── internal.go
│ │ │ ├── jsonflags/
│ │ │ │ └── flags.go
│ │ │ ├── jsonopts/
│ │ │ │ └── options.go
│ │ │ └── jsonwire/
│ │ │ ├── decode.go
│ │ │ ├── encode.go
│ │ │ └── wire.go
│ │ ├── jsontext/
│ │ │ ├── decode.go
│ │ │ ├── doc.go
│ │ │ ├── encode.go
│ │ │ ├── errors.go
│ │ │ ├── export.go
│ │ │ ├── options.go
│ │ │ ├── pools.go
│ │ │ ├── quote.go
│ │ │ ├── state.go
│ │ │ ├── token.go
│ │ │ └── value.go
│ │ └── options.go
│ ├── go-logr/
│ │ ├── logr/
│ │ │ ├── .golangci.yaml
│ │ │ ├── CHANGELOG.md
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── SECURITY.md
│ │ │ ├── context.go
│ │ │ ├── context_noslog.go
│ │ │ ├── context_slog.go
│ │ │ ├── discard.go
│ │ │ ├── funcr/
│ │ │ │ ├── funcr.go
│ │ │ │ └── slogsink.go
│ │ │ ├── logr.go
│ │ │ ├── sloghandler.go
│ │ │ ├── slogr.go
│ │ │ └── slogsink.go
│ │ └── stdr/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── stdr.go
│ ├── go-ole/
│ │ └── go-ole/
│ │ ├── .travis.yml
│ │ ├── ChangeLog.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── appveyor.yml
│ │ ├── com.go
│ │ ├── com_func.go
│ │ ├── connect.go
│ │ ├── constants.go
│ │ ├── error.go
│ │ ├── error_func.go
│ │ ├── error_windows.go
│ │ ├── guid.go
│ │ ├── iconnectionpoint.go
│ │ ├── iconnectionpoint_func.go
│ │ ├── iconnectionpoint_windows.go
│ │ ├── iconnectionpointcontainer.go
│ │ ├── iconnectionpointcontainer_func.go
│ │ ├── iconnectionpointcontainer_windows.go
│ │ ├── idispatch.go
│ │ ├── idispatch_func.go
│ │ ├── idispatch_windows.go
│ │ ├── ienumvariant.go
│ │ ├── ienumvariant_func.go
│ │ ├── ienumvariant_windows.go
│ │ ├── iinspectable.go
│ │ ├── iinspectable_func.go
│ │ ├── iinspectable_windows.go
│ │ ├── iprovideclassinfo.go
│ │ ├── iprovideclassinfo_func.go
│ │ ├── iprovideclassinfo_windows.go
│ │ ├── itypeinfo.go
│ │ ├── itypeinfo_func.go
│ │ ├── itypeinfo_windows.go
│ │ ├── iunknown.go
│ │ ├── iunknown_func.go
│ │ ├── iunknown_windows.go
│ │ ├── ole.go
│ │ ├── oleutil/
│ │ │ ├── connection.go
│ │ │ ├── connection_func.go
│ │ │ ├── connection_windows.go
│ │ │ ├── go-get.go
│ │ │ └── oleutil.go
│ │ ├── safearray.go
│ │ ├── safearray_func.go
│ │ ├── safearray_windows.go
│ │ ├── safearrayconversion.go
│ │ ├── safearrayslices.go
│ │ ├── utility.go
│ │ ├── variables.go
│ │ ├── variant.go
│ │ ├── variant_386.go
│ │ ├── variant_amd64.go
│ │ ├── variant_arm.go
│ │ ├── variant_arm64.go
│ │ ├── variant_date_386.go
│ │ ├── variant_date_amd64.go
│ │ ├── variant_date_arm.go
│ │ ├── variant_date_arm64.go
│ │ ├── variant_ppc64le.go
│ │ ├── variant_s390x.go
│ │ ├── vt_string.go
│ │ ├── winrt.go
│ │ └── winrt_doc.go
│ ├── go-openapi/
│ │ ├── jsonpointer/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── .golangci.yml
│ │ │ ├── CODE_OF_CONDUCT.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── pointer.go
│ │ └── jsonreference/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── CODE_OF_CONDUCT.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── internal/
│ │ │ └── normalize_url.go
│ │ └── reference.go
│ ├── go-viper/
│ │ └── mapstructure/
│ │ └── v2/
│ │ ├── .editorconfig
│ │ ├── .envrc
│ │ ├── .gitignore
│ │ ├── .golangci.yaml
│ │ ├── CHANGELOG.md
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── decode_hooks.go
│ │ ├── flake.nix
│ │ ├── internal/
│ │ │ └── errors/
│ │ │ ├── errors.go
│ │ │ ├── join.go
│ │ │ └── join_go1_19.go
│ │ ├── mapstructure.go
│ │ ├── reflect_go1_19.go
│ │ └── reflect_go1_20.go
│ ├── godbus/
│ │ └── dbus/
│ │ └── v5/
│ │ ├── .cirrus.yml
│ │ ├── .golangci.yml
│ │ ├── CONTRIBUTING.md
│ │ ├── LICENSE
│ │ ├── MAINTAINERS
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── auth.go
│ │ ├── auth_anonymous.go
│ │ ├── auth_external.go
│ │ ├── auth_sha1.go
│ │ ├── call.go
│ │ ├── conn.go
│ │ ├── conn_darwin.go
│ │ ├── conn_other.go
│ │ ├── conn_unix.go
│ │ ├── conn_windows.go
│ │ ├── dbus.go
│ │ ├── decoder.go
│ │ ├── default_handler.go
│ │ ├── doc.go
│ │ ├── encoder.go
│ │ ├── escape.go
│ │ ├── export.go
│ │ ├── homedir.go
│ │ ├── match.go
│ │ ├── message.go
│ │ ├── object.go
│ │ ├── sequence.go
│ │ ├── sequential_handler.go
│ │ ├── server_interfaces.go
│ │ ├── sig.go
│ │ ├── transport_darwin.go
│ │ ├── transport_generic.go
│ │ ├── transport_nonce_tcp.go
│ │ ├── transport_tcp.go
│ │ ├── transport_unix.go
│ │ ├── transport_unixcred_dragonfly.go
│ │ ├── transport_unixcred_freebsd.go
│ │ ├── transport_unixcred_linux.go
│ │ ├── transport_unixcred_netbsd.go
│ │ ├── transport_unixcred_openbsd.go
│ │ ├── transport_zos.go
│ │ ├── variant.go
│ │ ├── variant_lexer.go
│ │ └── variant_parser.go
│ ├── gofrs/
│ │ └── flock/
│ │ ├── .gitignore
│ │ ├── .golangci.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── build.sh
│ │ ├── flock.go
│ │ ├── flock_others.go
│ │ ├── flock_unix.go
│ │ ├── flock_unix_fcntl.go
│ │ └── flock_windows.go
│ ├── gogo/
│ │ └── protobuf/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── gogoproto/
│ │ │ ├── Makefile
│ │ │ ├── doc.go
│ │ │ ├── gogo.pb.go
│ │ │ ├── gogo.pb.golden
│ │ │ ├── gogo.proto
│ │ │ └── helper.go
│ │ ├── proto/
│ │ │ ├── Makefile
│ │ │ ├── clone.go
│ │ │ ├── custom_gogo.go
│ │ │ ├── decode.go
│ │ │ ├── deprecated.go
│ │ │ ├── discard.go
│ │ │ ├── duration.go
│ │ │ ├── duration_gogo.go
│ │ │ ├── encode.go
│ │ │ ├── encode_gogo.go
│ │ │ ├── equal.go
│ │ │ ├── extensions.go
│ │ │ ├── extensions_gogo.go
│ │ │ ├── lib.go
│ │ │ ├── lib_gogo.go
│ │ │ ├── message_set.go
│ │ │ ├── pointer_reflect.go
│ │ │ ├── pointer_reflect_gogo.go
│ │ │ ├── pointer_unsafe.go
│ │ │ ├── pointer_unsafe_gogo.go
│ │ │ ├── properties.go
│ │ │ ├── properties_gogo.go
│ │ │ ├── skip_gogo.go
│ │ │ ├── table_marshal.go
│ │ │ ├── table_marshal_gogo.go
│ │ │ ├── table_merge.go
│ │ │ ├── table_unmarshal.go
│ │ │ ├── table_unmarshal_gogo.go
│ │ │ ├── text.go
│ │ │ ├── text_gogo.go
│ │ │ ├── text_parser.go
│ │ │ ├── timestamp.go
│ │ │ ├── timestamp_gogo.go
│ │ │ ├── wrappers.go
│ │ │ └── wrappers_gogo.go
│ │ ├── protoc-gen-gogo/
│ │ │ └── descriptor/
│ │ │ ├── Makefile
│ │ │ ├── descriptor.go
│ │ │ ├── descriptor.pb.go
│ │ │ ├── descriptor_gostring.gen.go
│ │ │ └── helper.go
│ │ └── sortkeys/
│ │ └── sortkeys.go
│ ├── golang/
│ │ ├── groupcache/
│ │ │ ├── LICENSE
│ │ │ └── lru/
│ │ │ └── lru.go
│ │ └── protobuf/
│ │ ├── AUTHORS
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── proto/
│ │ │ ├── buffer.go
│ │ │ ├── defaults.go
│ │ │ ├── deprecated.go
│ │ │ ├── discard.go
│ │ │ ├── extensions.go
│ │ │ ├── properties.go
│ │ │ ├── proto.go
│ │ │ ├── registry.go
│ │ │ ├── text_decode.go
│ │ │ ├── text_encode.go
│ │ │ ├── wire.go
│ │ │ └── wrappers.go
│ │ └── ptypes/
│ │ ├── any/
│ │ │ └── any.pb.go
│ │ └── timestamp/
│ │ └── timestamp.pb.go
│ ├── golang-jwt/
│ │ └── jwt/
│ │ └── v4/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── MIGRATION_GUIDE.md
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── VERSION_HISTORY.md
│ │ ├── claims.go
│ │ ├── doc.go
│ │ ├── ecdsa.go
│ │ ├── ecdsa_utils.go
│ │ ├── ed25519.go
│ │ ├── ed25519_utils.go
│ │ ├── errors.go
│ │ ├── hmac.go
│ │ ├── map_claims.go
│ │ ├── none.go
│ │ ├── parser.go
│ │ ├── parser_option.go
│ │ ├── rsa.go
│ │ ├── rsa_pss.go
│ │ ├── rsa_utils.go
│ │ ├── signing_method.go
│ │ ├── staticcheck.conf
│ │ ├── token.go
│ │ └── types.go
│ ├── google/
│ │ ├── btree/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── btree.go
│ │ │ └── btree_generic.go
│ │ ├── cel-go/
│ │ │ ├── LICENSE
│ │ │ ├── cel/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── cel.go
│ │ │ │ ├── decls.go
│ │ │ │ ├── env.go
│ │ │ │ ├── folding.go
│ │ │ │ ├── inlining.go
│ │ │ │ ├── io.go
│ │ │ │ ├── library.go
│ │ │ │ ├── macro.go
│ │ │ │ ├── optimizer.go
│ │ │ │ ├── options.go
│ │ │ │ ├── program.go
│ │ │ │ └── validator.go
│ │ │ ├── checker/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── checker.go
│ │ │ │ ├── cost.go
│ │ │ │ ├── decls/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── decls.go
│ │ │ │ ├── env.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── format.go
│ │ │ │ ├── mapping.go
│ │ │ │ ├── options.go
│ │ │ │ ├── printer.go
│ │ │ │ ├── scopes.go
│ │ │ │ └── types.go
│ │ │ ├── common/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── ast/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── ast.go
│ │ │ │ │ ├── conversion.go
│ │ │ │ │ ├── expr.go
│ │ │ │ │ ├── factory.go
│ │ │ │ │ └── navigable.go
│ │ │ │ ├── containers/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── container.go
│ │ │ │ ├── cost.go
│ │ │ │ ├── debug/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── debug.go
│ │ │ │ ├── decls/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── decls.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── error.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── functions/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── functions.go
│ │ │ │ ├── location.go
│ │ │ │ ├── operators/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── operators.go
│ │ │ │ ├── overloads/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── overloads.go
│ │ │ │ ├── runes/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── buffer.go
│ │ │ │ ├── source.go
│ │ │ │ ├── stdlib/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── standard.go
│ │ │ │ └── types/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── any_value.go
│ │ │ │ ├── bool.go
│ │ │ │ ├── bytes.go
│ │ │ │ ├── compare.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── double.go
│ │ │ │ ├── duration.go
│ │ │ │ ├── err.go
│ │ │ │ ├── int.go
│ │ │ │ ├── iterator.go
│ │ │ │ ├── json_value.go
│ │ │ │ ├── list.go
│ │ │ │ ├── map.go
│ │ │ │ ├── null.go
│ │ │ │ ├── object.go
│ │ │ │ ├── optional.go
│ │ │ │ ├── overflow.go
│ │ │ │ ├── pb/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── checked.go
│ │ │ │ │ ├── enum.go
│ │ │ │ │ ├── equal.go
│ │ │ │ │ ├── file.go
│ │ │ │ │ ├── pb.go
│ │ │ │ │ └── type.go
│ │ │ │ ├── provider.go
│ │ │ │ ├── ref/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── provider.go
│ │ │ │ │ └── reference.go
│ │ │ │ ├── string.go
│ │ │ │ ├── timestamp.go
│ │ │ │ ├── traits/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ ├── comparer.go
│ │ │ │ │ ├── container.go
│ │ │ │ │ ├── field_tester.go
│ │ │ │ │ ├── indexer.go
│ │ │ │ │ ├── iterator.go
│ │ │ │ │ ├── lister.go
│ │ │ │ │ ├── mapper.go
│ │ │ │ │ ├── matcher.go
│ │ │ │ │ ├── math.go
│ │ │ │ │ ├── receiver.go
│ │ │ │ │ ├── sizer.go
│ │ │ │ │ ├── traits.go
│ │ │ │ │ └── zeroer.go
│ │ │ │ ├── types.go
│ │ │ │ ├── uint.go
│ │ │ │ ├── unknown.go
│ │ │ │ └── util.go
│ │ │ ├── ext/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── README.md
│ │ │ │ ├── bindings.go
│ │ │ │ ├── comprehensions.go
│ │ │ │ ├── encoders.go
│ │ │ │ ├── formatting.go
│ │ │ │ ├── guards.go
│ │ │ │ ├── lists.go
│ │ │ │ ├── math.go
│ │ │ │ ├── native.go
│ │ │ │ ├── protos.go
│ │ │ │ ├── sets.go
│ │ │ │ └── strings.go
│ │ │ ├── interpreter/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── activation.go
│ │ │ │ ├── attribute_patterns.go
│ │ │ │ ├── attributes.go
│ │ │ │ ├── decorators.go
│ │ │ │ ├── dispatcher.go
│ │ │ │ ├── evalstate.go
│ │ │ │ ├── functions/
│ │ │ │ │ ├── BUILD.bazel
│ │ │ │ │ └── functions.go
│ │ │ │ ├── interpretable.go
│ │ │ │ ├── interpreter.go
│ │ │ │ ├── optimizations.go
│ │ │ │ ├── planner.go
│ │ │ │ ├── prune.go
│ │ │ │ └── runtimecost.go
│ │ │ └── parser/
│ │ │ ├── BUILD.bazel
│ │ │ ├── errors.go
│ │ │ ├── gen/
│ │ │ │ ├── BUILD.bazel
│ │ │ │ ├── CEL.g4
│ │ │ │ ├── CEL.interp
│ │ │ │ ├── CEL.tokens
│ │ │ │ ├── CELLexer.interp
│ │ │ │ ├── CELLexer.tokens
│ │ │ │ ├── cel_base_listener.go
│ │ │ │ ├── cel_base_visitor.go
│ │ │ │ ├── cel_lexer.go
│ │ │ │ ├── cel_listener.go
│ │ │ │ ├── cel_parser.go
│ │ │ │ ├── cel_visitor.go
│ │ │ │ ├── doc.go
│ │ │ │ └── generate.sh
│ │ │ ├── helper.go
│ │ │ ├── input.go
│ │ │ ├── macro.go
│ │ │ ├── options.go
│ │ │ ├── parser.go
│ │ │ ├── unescape.go
│ │ │ └── unparser.go
│ │ ├── gnostic-models/
│ │ │ ├── LICENSE
│ │ │ ├── compiler/
│ │ │ │ ├── README.md
│ │ │ │ ├── context.go
│ │ │ │ ├── error.go
│ │ │ │ ├── extensions.go
│ │ │ │ ├── helpers.go
│ │ │ │ ├── main.go
│ │ │ │ └── reader.go
│ │ │ ├── extensions/
│ │ │ │ ├── README.md
│ │ │ │ ├── extension.pb.go
│ │ │ │ ├── extension.proto
│ │ │ │ └── extensions.go
│ │ │ ├── jsonschema/
│ │ │ │ ├── README.md
│ │ │ │ ├── base.go
│ │ │ │ ├── display.go
│ │ │ │ ├── models.go
│ │ │ │ ├── operations.go
│ │ │ │ ├── reader.go
│ │ │ │ ├── schema.json
│ │ │ │ └── writer.go
│ │ │ ├── openapiv2/
│ │ │ │ ├── OpenAPIv2.go
│ │ │ │ ├── OpenAPIv2.pb.go
│ │ │ │ ├── OpenAPIv2.proto
│ │ │ │ ├── README.md
│ │ │ │ ├── document.go
│ │ │ │ └── openapi-2.0.json
│ │ │ └── openapiv3/
│ │ │ ├── OpenAPIv3.go
│ │ │ ├── OpenAPIv3.pb.go
│ │ │ ├── OpenAPIv3.proto
│ │ │ ├── README.md
│ │ │ ├── annotations.pb.go
│ │ │ ├── annotations.proto
│ │ │ └── document.go
│ │ ├── go-cmp/
│ │ │ ├── LICENSE
│ │ │ └── cmp/
│ │ │ ├── compare.go
│ │ │ ├── export.go
│ │ │ ├── internal/
│ │ │ │ ├── diff/
│ │ │ │ │ ├── debug_disable.go
│ │ │ │ │ ├── debug_enable.go
│ │ │ │ │ └── diff.go
│ │ │ │ ├── flags/
│ │ │ │ │ └── flags.go
│ │ │ │ ├── function/
│ │ │ │ │ └── func.go
│ │ │ │ └── value/
│ │ │ │ ├── name.go
│ │ │ │ ├── pointer.go
│ │ │ │ └── sort.go
│ │ │ ├── options.go
│ │ │ ├── path.go
│ │ │ ├── report.go
│ │ │ ├── report_compare.go
│ │ │ ├── report_references.go
│ │ │ ├── report_reflect.go
│ │ │ ├── report_slices.go
│ │ │ ├── report_text.go
│ │ │ └── report_value.go
│ │ ├── go-containerregistry/
│ │ │ ├── LICENSE
│ │ │ ├── internal/
│ │ │ │ ├── and/
│ │ │ │ │ └── and_closer.go
│ │ │ │ ├── compression/
│ │ │ │ │ └── compression.go
│ │ │ │ ├── estargz/
│ │ │ │ │ └── estargz.go
│ │ │ │ ├── gzip/
│ │ │ │ │ └── zip.go
│ │ │ │ ├── redact/
│ │ │ │ │ └── redact.go
│ │ │ │ ├── retry/
│ │ │ │ │ ├── retry.go
│ │ │ │ │ └── wait/
│ │ │ │ │ └── kubernetes_apimachinery_wait.go
│ │ │ │ ├── verify/
│ │ │ │ │ └── verify.go
│ │ │ │ └── zstd/
│ │ │ │ └── zstd.go
│ │ │ └── pkg/
│ │ │ ├── authn/
│ │ │ │ ├── README.md
│ │ │ │ ├── anon.go
│ │ │ │ ├── auth.go
│ │ │ │ ├── authn.go
│ │ │ │ ├── basic.go
│ │ │ │ ├── bearer.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── keychain.go
│ │ │ │ ├── kubernetes/
│ │ │ │ │ ├── LICENSE
│ │ │ │ │ └── keychain.go
│ │ │ │ └── multikeychain.go
│ │ │ ├── compression/
│ │ │ │ └── compression.go
│ │ │ ├── logs/
│ │ │ │ └── logs.go
│ │ │ ├── name/
│ │ │ │ ├── README.md
│ │ │ │ ├── check.go
│ │ │ │ ├── digest.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── errors.go
│ │ │ │ ├── options.go
│ │ │ │ ├── ref.go
│ │ │ │ ├── registry.go
│ │ │ │ ├── repository.go
│ │ │ │ └── tag.go
│ │ │ └── v1/
│ │ │ ├── config.go
│ │ │ ├── doc.go
│ │ │ ├── empty/
│ │ │ │ ├── README.md
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ └── index.go
│ │ │ ├── google/
│ │ │ │ ├── README.md
│ │ │ │ ├── auth.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── keychain.go
│ │ │ │ ├── list.go
│ │ │ │ └── options.go
│ │ │ ├── hash.go
│ │ │ ├── image.go
│ │ │ ├── index.go
│ │ │ ├── layer.go
│ │ │ ├── manifest.go
│ │ │ ├── match/
│ │ │ │ └── match.go
│ │ │ ├── mutate/
│ │ │ │ ├── README.md
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ ├── index.go
│ │ │ │ ├── mutate.go
│ │ │ │ └── rebase.go
│ │ │ ├── partial/
│ │ │ │ ├── README.md
│ │ │ │ ├── compressed.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ ├── index.go
│ │ │ │ ├── uncompressed.go
│ │ │ │ └── with.go
│ │ │ ├── platform.go
│ │ │ ├── progress.go
│ │ │ ├── remote/
│ │ │ │ ├── README.md
│ │ │ │ ├── catalog.go
│ │ │ │ ├── check.go
│ │ │ │ ├── delete.go
│ │ │ │ ├── descriptor.go
│ │ │ │ ├── doc.go
│ │ │ │ ├── fetcher.go
│ │ │ │ ├── image.go
│ │ │ │ ├── index.go
│ │ │ │ ├── layer.go
│ │ │ │ ├── list.go
│ │ │ │ ├── mount.go
│ │ │ │ ├── multi_write.go
│ │ │ │ ├── options.go
│ │ │ │ ├── progress.go
│ │ │ │ ├── puller.go
│ │ │ │ ├── pusher.go
│ │ │ │ ├── referrers.go
│ │ │ │ ├── schema1.go
│ │ │ │ ├── transport/
│ │ │ │ │ ├── README.md
│ │ │ │ │ ├── basic.go
│ │ │ │ │ ├── bearer.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── error.go
│ │ │ │ │ ├── logger.go
│ │ │ │ │ ├── ping.go
│ │ │ │ │ ├── retry.go
│ │ │ │ │ ├── schemer.go
│ │ │ │ │ ├── scope.go
│ │ │ │ │ ├── transport.go
│ │ │ │ │ └── useragent.go
│ │ │ │ └── write.go
│ │ │ ├── stream/
│ │ │ │ ├── README.md
│ │ │ │ └── layer.go
│ │ │ ├── tarball/
│ │ │ │ ├── README.md
│ │ │ │ ├── doc.go
│ │ │ │ ├── image.go
│ │ │ │ ├── layer.go
│ │ │ │ └── write.go
│ │ │ ├── types/
│ │ │ │ └── types.go
│ │ │ └── zz_deepcopy_generated.go
│ │ ├── go-github/
│ │ │ └── v30/
│ │ │ ├── AUTHORS
│ │ │ ├── LICENSE
│ │ │ └── github/
│ │ │ ├── actions.go
│ │ │ ├── actions_artifacts.go
│ │ │ ├── actions_runners.go
│ │ │ ├── actions_secrets.go
│ │ │ ├── actions_workflow_jobs.go
│ │ │ ├── actions_workflow_runs.go
│ │ │ ├── actions_workflows.go
│ │ │ ├── activity.go
│ │ │ ├── activity_events.go
│ │ │ ├── activity_notifications.go
│ │ │ ├── activity_star.go
│ │ │ ├── activity_watching.go
│ │ │ ├── admin.go
│ │ │ ├── admin_orgs.go
│ │ │ ├── admin_stats.go
│ │ │ ├── admin_users.go
│ │ │ ├── apps.go
│ │ │ ├── apps_installation.go
│ │ │ ├── apps_manifest.go
│ │ │ ├── apps_marketplace.go
│ │ │ ├── authorizations.go
│ │ │ ├── checks.go
│ │ │ ├── doc.go
│ │ │ ├── event.go
│ │ │ ├── event_types.go
│ │ │ ├── gists.go
│ │ │ ├── gists_comments.go
│ │ │ ├── git.go
│ │ │ ├── git_blobs.go
│ │ │ ├── git_commits.go
│ │ │ ├── git_refs.go
│ │ │ ├── git_tags.go
│ │ │ ├── git_trees.go
│ │ │ ├── github-accessors.go
│ │ │ ├── github.go
│ │ │ ├── gitignore.go
│ │ │ ├── interactions.go
│ │ │ ├── interactions_orgs.go
│ │ │ ├── interactions_repos.go
│ │ │ ├── issues.go
│ │ │ ├── issues_assignees.go
│ │ │ ├── issues_comments.go
│ │ │ ├── issues_events.go
│ │ │ ├── issues_labels.go
│ │ │ ├── issues_milestones.go
│ │ │ ├── issues_timeline.go
│ │ │ ├── licenses.go
│ │ │ ├── messages.go
│ │ │ ├── migrations.go
│ │ │ ├── migrations_source_import.go
│ │ │ ├── migrations_user.go
│ │ │ ├── misc.go
│ │ │ ├── orgs.go
│ │ │ ├── orgs_hooks.go
│ │ │ ├── orgs_members.go
│ │ │ ├── orgs_outside_collaborators.go
│ │ │ ├── orgs_projects.go
│ │ │ ├── orgs_users_blocking.go
│ │ │ ├── projects.go
│ │ │ ├── pulls.go
│ │ │ ├── pulls_comments.go
│ │ │ ├── pulls_reviewers.go
│ │ │ ├── pulls_reviews.go
│ │ │ ├── reactions.go
│ │ │ ├── repos.go
│ │ │ ├── repos_collaborators.go
│ │ │ ├── repos_comments.go
│ │ │ ├── repos_commits.go
│ │ │ ├── repos_community_health.go
│ │ │ ├── repos_contents.go
│ │ │ ├── repos_deployments.go
│ │ │ ├── repos_forks.go
│ │ │ ├── repos_hooks.go
│ │ │ ├── repos_invitations.go
│ │ │ ├── repos_keys.go
│ │ │ ├── repos_merging.go
│ │ │ ├── repos_pages.go
│ │ │ ├── repos_prereceive_hooks.go
│ │ │ ├── repos_projects.go
│ │ │ ├── repos_releases.go
│ │ │ ├── repos_stats.go
│ │ │ ├── repos_statuses.go
│ │ │ ├── repos_traffic.go
│ │ │ ├── search.go
│ │ │ ├── strings.go
│ │ │ ├── teams.go
│ │ │ ├── teams_discussion_comments.go
│ │ │ ├── teams_discussions.go
│ │ │ ├── teams_members.go
│ │ │ ├── timestamp.go
│ │ │ ├── users.go
│ │ │ ├── users_administration.go
│ │ │ ├── users_blocking.go
│ │ │ ├── users_emails.go
│ │ │ ├── users_followers.go
│ │ │ ├── users_gpg_keys.go
│ │ │ ├── users_keys.go
│ │ │ ├── users_projects.go
│ │ │ ├── with_appengine.go
│ │ │ └── without_appengine.go
│ │ ├── go-querystring/
│ │ │ ├── LICENSE
│ │ │ └── query/
│ │ │ └── encode.go
│ │ ├── gofuzz/
│ │ │ ├── .travis.yml
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── bytesource/
│ │ │ │ └── bytesource.go
│ │ │ ├── doc.go
│ │ │ └── fuzz.go
│ │ ├── nftables/
│ │ │ ├── CONTRIBUTING.md
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── alignedbuff/
│ │ │ │ └── alignedbuff.go
│ │ │ ├── binaryutil/
│ │ │ │ └── binaryutil.go
│ │ │ ├── chain.go
│ │ │ ├── compat_policy.go
│ │ │ ├── conn.go
│ │ │ ├── counter.go
│ │ │ ├── doc.go
│ │ │ ├── expr/
│ │ │ │ ├── bitwise.go
│ │ │ │ ├── byteorder.go
│ │ │ │ ├── connlimit.go
│ │ │ │ ├── counter.go
│ │ │ │ ├── ct.go
│ │ │ │ ├── dup.go
│ │ │ │ ├── dynset.go
│ │ │ │ ├── expr.go
│ │ │ │ ├── exthdr.go
│ │ │ │ ├── fib.go
│ │ │ │ ├── flow_offload.go
│ │ │ │ ├── hash.go
│ │ │ │ ├── immediate.go
│ │ │ │ ├── limit.go
│ │ │ │ ├── log.go
│ │ │ │ ├── lookup.go
│ │ │ │ ├── match.go
│ │ │ │ ├── nat.go
│ │ │ │ ├── notrack.go
│ │ │ │ ├── numgen.go
│ │ │ │ ├── objref.go
│ │ │ │ ├── payload.go
│ │ │ │ ├── queue.go
│ │ │ │ ├── quota.go
│ │ │ │ ├── range.go
│ │ │ │ ├── redirect.go
│ │ │ │ ├── reject.go
│ │ │ │ ├── rt.go
│ │ │ │ ├── socket.go
│ │ │ │ ├── target.go
│ │ │ │ ├── tproxy.go
│ │ │ │ └── verdict.go
│ │ │ ├── flowtable.go
│ │ │ ├── internal/
│ │ │ │ └── parseexprfunc/
│ │ │ │ └── parseexprfunc.go
│ │ │ ├── monitor.go
│ │ │ ├── obj.go
│ │ │ ├── quota.go
│ │ │ ├── rule.go
│ │ │ ├── set.go
│ │ │ ├── table.go
│ │ │ ├── util.go
│ │ │ └── xt/
│ │ │ ├── info.go
│ │ │ ├── match_addrtype.go
│ │ │ ├── match_conntrack.go
│ │ │ ├── match_tcp.go
│ │ │ ├── match_udp.go
│ │ │ ├── target_dnat.go
│ │ │ ├── target_masquerade_ip.go
│ │ │ ├── unknown.go
│ │ │ ├── util.go
│ │ │ └── xt.go
│ │ ├── pprof/
│ │ │ ├── AUTHORS
│ │ │ ├── CONTRIBUTORS
│ │ │ ├── LICENSE
│ │ │ └── profile/
│ │ │ ├── encode.go
│ │ │ ├── filter.go
│ │ │ ├── index.go
│ │ │ ├── legacy_java_profile.go
│ │ │ ├── legacy_profile.go
│ │ │ ├── merge.go
│ │ │ ├── profile.go
│ │ │ ├── proto.go
│ │ │ └── prune.go
│ │ ├── shlex/
│ │ │ ├── COPYING
│ │ │ ├── README
│ │ │ └── shlex.go
│ │ └── uuid/
│ │ ├── CHANGELOG.md
│ │ ├── CONTRIBUTING.md
│ │ ├── CONTRIBUTORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dce.go
│ │ ├── doc.go
│ │ ├── hash.go
│ │ ├── marshal.go
│ │ ├── node.go
│ │ ├── node_js.go
│ │ ├── node_net.go
│ │ ├── null.go
│ │ ├── sql.go
│ │ ├── time.go
│ │ ├── util.go
│ │ ├── uuid.go
│ │ ├── version1.go
│ │ ├── version4.go
│ │ ├── version6.go
│ │ └── version7.go
│ ├── gorilla/
│ │ ├── csrf/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── Gopkg.toml
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── context.go
│ │ │ ├── csrf.go
│ │ │ ├── doc.go
│ │ │ ├── helpers.go
│ │ │ ├── options.go
│ │ │ ├── store.go
│ │ │ └── store_legacy.go
│ │ ├── handlers/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── canonical.go
│ │ │ ├── compress.go
│ │ │ ├── cors.go
│ │ │ ├── doc.go
│ │ │ ├── handlers.go
│ │ │ ├── logging.go
│ │ │ ├── proxy_headers.go
│ │ │ └── recovery.go
│ │ ├── securecookie/
│ │ │ ├── .editorconfig
│ │ │ ├── .gitignore
│ │ │ ├── LICENSE
│ │ │ ├── Makefile
│ │ │ ├── README.md
│ │ │ ├── doc.go
│ │ │ └── securecookie.go
│ │ └── websocket/
│ │ ├── .gitignore
│ │ ├── AUTHORS
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── client.go
│ │ ├── compression.go
│ │ ├── conn.go
│ │ ├── doc.go
│ │ ├── join.go
│ │ ├── json.go
│ │ ├── mask.go
│ │ ├── mask_safe.go
│ │ ├── prepared.go
│ │ ├── proxy.go
│ │ ├── server.go
│ │ ├── tls_handshake.go
│ │ ├── tls_handshake_116.go
│ │ ├── util.go
│ │ └── x_net_proxy.go
│ ├── grpc-ecosystem/
│ │ └── grpc-gateway/
│ │ └── v2/
│ │ ├── LICENSE
│ │ ├── internal/
│ │ │ └── httprule/
│ │ │ ├── BUILD.bazel
│ │ │ ├── compile.go
│ │ │ ├── fuzz.go
│ │ │ ├── parse.go
│ │ │ └── types.go
│ │ ├── runtime/
│ │ │ ├── BUILD.bazel
│ │ │ ├── context.go
│ │ │ ├── convert.go
│ │ │ ├── doc.go
│ │ │ ├── errors.go
│ │ │ ├── fieldmask.go
│ │ │ ├── handler.go
│ │ │ ├── marshal_httpbodyproto.go
│ │ │ ├── marshal_json.go
│ │ │ ├── marshal_jsonpb.go
│ │ │ ├── marshal_proto.go
│ │ │ ├── marshaler.go
│ │ │ ├── marshaler_registry.go
│ │ │ ├── mux.go
│ │ │ ├── pattern.go
│ │ │ ├── proto2_convert.go
│ │ │ └── query.go
│ │ └── utilities/
│ │ ├── BUILD.bazel
│ │ ├── doc.go
│ │ ├── pattern.go
│ │ ├── readerfactory.go
│ │ ├── string_array_flag.go
│ │ └── trie.go
│ ├── hashicorp/
│ │ ├── errwrap/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ └── errwrap.go
│ │ ├── go-cleanhttp/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── cleanhttp.go
│ │ │ ├── doc.go
│ │ │ └── handlers.go
│ │ └── go-multierror/
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── append.go
│ │ ├── flatten.go
│ │ ├── format.go
│ │ ├── group.go
│ │ ├── multierror.go
│ │ ├── prefix.go
│ │ └── sort.go
│ ├── hdevalence/
│ │ └── ed25519consensus/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── batch.go
│ │ └── ed25519.go
│ ├── illarion/
│ │ └── gonotify/
│ │ └── v2/
│ │ ├── .gitignore
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── dirwatcher.go
│ │ ├── event.go
│ │ ├── filewatcher.go
│ │ └── inotify.go
│ ├── in-toto/
│ │ └── in-toto-golang/
│ │ ├── LICENSE
│ │ └── in_toto/
│ │ ├── attestations.go
│ │ ├── certconstraint.go
│ │ ├── envelope.go
│ │ ├── hashlib.go
│ │ ├── keylib.go
│ │ ├── match.go
│ │ ├── model.go
│ │ ├── rulelib.go
│ │ ├── runlib.go
│ │ ├── slsa_provenance/
│ │ │ ├── common/
│ │ │ │ └── common.go
│ │ │ ├── v0.1/
│ │ │ │ └── provenance.go
│ │ │ ├── v0.2/
│ │ │ │ └── provenance.go
│ │ │ └── v1/
│ │ │ └── provenance.go
│ │ ├── util.go
│ │ ├── util_unix.go
│ │ ├── util_windows.go
│ │ └── verifylib.go
│ ├── inconshreveable/
│ │ ├── go-update/
│ │ │ ├── LICENSE
│ │ │ ├── README.md
│ │ │ ├── apply.go
│ │ │ ├── doc.go
│ │ │ ├── hide_noop.go
│ │ │ ├── hide_windows.go
│ │ │ ├── internal/
│ │ │ │ ├── binarydist/
│ │ │ │ │ ├── License
│ │ │ │ │ ├── Readme.md
│ │ │ │ │ ├── bzip2.go
│ │ │ │ │ ├── diff.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── encoding.go
│ │ │ │ │ ├── patch.go
│ │ │ │ │ └── seek.go
│ │ │ │ └── osext/
│ │ │ │ ├── LICENSE
│ │ │ │ ├── README.md
│ │ │ │ ├── osext.go
│ │ │ │ ├── osext_plan9.go
│ │ │ │ ├── osext_procfs.go
│ │ │ │ ├── osext_sysctl.go
│ │ │ │ └── osext_windows.go
│ │ │ ├── patcher.go
│ │ │ └── verifier.go
│ │ └── mousetrap/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── trap_others.go
│ │ └── trap_windows.go
│ ├── insomniacslk/
│ │ └── dhcp/
│ │ ├── CONTRIBUTORS.md
│ │ ├── LICENSE
│ │ ├── dhcpv4/
│ │ │ ├── bindtointerface.go
│ │ │ ├── defaults.go
│ │ │ ├── dhcpv4.go
│ │ │ ├── modifiers.go
│ │ │ ├── option_generic.go
│ │ │ ├── option_ip.go
│ │ │ ├── option_ip_address_lease_time.go
│ │ │ ├── option_ips.go
│ │ │ ├── option_maximum_dhcp_message_size.go
│ │ │ ├── option_message_type.go
│ │ │ ├── option_misc.go
│ │ │ ├── option_parameter_request_list.go
│ │ │ ├── option_relay_agent_information.go
│ │ │ ├── option_routes.go
│ │ │ ├── option_string.go
│ │ │ ├── option_strings.go
│ │ │ ├── option_subnet_mask.go
│ │ │ ├── option_vivc.go
│ │ │ ├── options.go
│ │ │ └── types.go
│ │ ├── iana/
│ │ │ ├── archtype.go
│ │ │ ├── entid.go
│ │ │ ├── hwtypes.go
│ │ │ ├── iana.go
│ │ │ └── statuscodes.go
│ │ ├── interfaces/
│ │ │ ├── bindtodevice_bsd.go
│ │ │ ├── bindtodevice_darwin.go
│ │ │ ├── bindtodevice_linux.go
│ │ │ ├── bindtodevice_windows.go
│ │ │ └── interfaces.go
│ │ └── rfc1035label/
│ │ └── label.go
│ ├── jmespath/
│ │ └── go-jmespath/
│ │ ├── .gitignore
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── Makefile
│ │ ├── README.md
│ │ ├── api.go
│ │ ├── astnodetype_string.go
│ │ ├── functions.go
│ │ ├── interpreter.go
│ │ ├── lexer.go
│ │ ├── parser.go
│ │ ├── toktype_string.go
│ │ └── util.go
│ ├── joho/
│ │ └── godotenv/
│ │ ├── .gitignore
│ │ ├── LICENCE
│ │ ├── README.md
│ │ ├── godotenv.go
│ │ └── parser.go
│ ├── josharian/
│ │ ├── intern/
│ │ │ ├── README.md
│ │ │ ├── intern.go
│ │ │ └── license.md
│ │ └── native/
│ │ ├── doc.go
│ │ ├── endian_generic.go
│ │ ├── license
│ │ └── readme.md
│ ├── jsimonetti/
│ │ └── rtnetlink/
│ │ ├── .gitignore
│ │ ├── LICENSE.md
│ │ ├── Makefile.fuzz
│ │ ├── README.md
│ │ ├── address.go
│ │ ├── conn.go
│ │ ├── doc.go
│ │ ├── endian.go
│ │ ├── fuzz-shell.nix
│ │ ├── internal/
│ │ │ └── unix/
│ │ │ ├── types_linux.go
│ │ │ └── types_other.go
│ │ ├── link.go
│ │ ├── neigh.go
│ │ ├── route.go
│ │ └── rule.go
│ ├── julienschmidt/
│ │ └── httprouter/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── path.go
│ │ ├── router.go
│ │ └── tree.go
│ ├── k0kubun/
│ │ └── go-ansi/
│ │ ├── LICENSE.txt
│ │ ├── README.md
│ │ ├── cursor.go
│ │ ├── cursor_windows.go
│ │ ├── display.go
│ │ ├── display_windows.go
│ │ ├── output.go
│ │ ├── output_windows.go
│ │ ├── print.go
│ │ └── syscall_windows.go
│ ├── kballard/
│ │ └── go-shellquote/
│ │ ├── LICENSE
│ │ ├── README
│ │ ├── doc.go
│ │ ├── quote.go
│ │ └── unquote.go
│ ├── klauspost/
│ │ └── compress/
│ │ ├── .gitattributes
│ │ ├── .gitignore
│ │ ├── .goreleaser.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SECURITY.md
│ │ ├── compressible.go
│ │ ├── fse/
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── bytereader.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ └── fse.go
│ │ ├── gen.sh
│ │ ├── huff0/
│ │ │ ├── .gitignore
│ │ │ ├── README.md
│ │ │ ├── bitreader.go
│ │ │ ├── bitwriter.go
│ │ │ ├── compress.go
│ │ │ ├── decompress.go
│ │ │ ├── decompress_amd64.go
│ │ │ ├── decompress_amd64.s
│ │ │ ├── decompress_generic.go
│ │ │ └── huff0.go
│ │ ├── internal/
│ │ │ ├── cpuinfo/
│ │ │ │ ├── cpuinfo.go
│ │ │ │ ├── cpuinfo_amd64.go
│ │ │ │ └── cpuinfo_amd64.s
│ │ │ └── snapref/
│ │ │ ├── LICENSE
│ │ │ ├── decode.go
│ │ │ ├── decode_other.go
│ │ │ ├── encode.go
│ │ │ ├── encode_other.go
│ │ │ └── snappy.go
│ │ ├── s2sx.mod
│ │ ├── s2sx.sum
│ │ └── zstd/
│ │ ├── README.md
│ │ ├── bitreader.go
│ │ ├── bitwriter.go
│ │ ├── blockdec.go
│ │ ├── blockenc.go
│ │ ├── blocktype_string.go
│ │ ├── bytebuf.go
│ │ ├── bytereader.go
│ │ ├── decodeheader.go
│ │ ├── decoder.go
│ │ ├── decoder_options.go
│ │ ├── dict.go
│ │ ├── enc_base.go
│ │ ├── enc_best.go
│ │ ├── enc_better.go
│ │ ├── enc_dfast.go
│ │ ├── enc_fast.go
│ │ ├── encoder.go
│ │ ├── encoder_options.go
│ │ ├── framedec.go
│ │ ├── frameenc.go
│ │ ├── fse_decoder.go
│ │ ├── fse_decoder_amd64.go
│ │ ├── fse_decoder_amd64.s
│ │ ├── fse_decoder_generic.go
│ │ ├── fse_encoder.go
│ │ ├── fse_predefined.go
│ │ ├── hash.go
│ │ ├── history.go
│ │ ├── internal/
│ │ │ └── xxhash/
│ │ │ ├── LICENSE.txt
│ │ │ ├── README.md
│ │ │ ├── xxhash.go
│ │ │ ├── xxhash_amd64.s
│ │ │ ├── xxhash_arm64.s
│ │ │ ├── xxhash_asm.go
│ │ │ ├── xxhash_other.go
│ │ │ └── xxhash_safe.go
│ │ ├── matchlen_amd64.go
│ │ ├── matchlen_amd64.s
│ │ ├── matchlen_generic.go
│ │ ├── seqdec.go
│ │ ├── seqdec_amd64.go
│ │ ├── seqdec_amd64.s
│ │ ├── seqdec_generic.go
│ │ ├── seqenc.go
│ │ ├── snappy.go
│ │ ├── zip.go
│ │ └── zstd.go
│ ├── kortschak/
│ │ └── wol/
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── wol.go
│ ├── kr/
│ │ └── fs/
│ │ ├── LICENSE
│ │ ├── Readme
│ │ ├── filesystem.go
│ │ └── walk.go
│ ├── kylelemons/
│ │ └── godebug/
│ │ ├── LICENSE
│ │ └── diff/
│ │ └── diff.go
│ ├── liggitt/
│ │ └── tabwriter/
│ │ ├── .travis.yml
│ │ ├── LICENSE
│ │ ├── README.md
│ │ └── tabwriter.go
│ ├── loft-sh/
│ │ ├── admin-apis/
│ │ │ ├── LICENSE
│ │ │ └── pkg/
│ │ │ └── licenseapi/
│ │ │ ├── features.go
│ │ │ ├── features.yaml
│ │ │ ├── features_internal.go
│ │ │ ├── generate.go
│ │ │ ├── license.go
│ │ │ ├── license_analytics.go
│ │ │ ├── license_announcement.go
│ │ │ ├── license_block_request.go
│ │ │ ├── license_button.go
│ │ │ ├── license_domain_token.go
│ │ │ ├── license_feature.go
│ │ │ ├── license_invoice.go
│ │ │ ├── license_limit.go
│ │ │ ├── license_module.go
│ │ │ ├── license_new.go
│ │ │ ├── license_plan.go
│ │ │ ├── license_resource_count.go
│ │ │ ├── license_routes.go
│ │ │ ├── license_trial.go
│ │ │ ├── names.go
│ │ │ ├── offline_license.go
│ │ │ ├── request_auth.go
│ │ │ ├── request_chat_auth.go
│ │ │ ├── request_generic.go
│ │ │ ├── request_instance.go
│ │ │ └── zz_generated.deepcopy.go
│ │ ├── agentapi/
│ │ │ └── v4/
│ │ │ ├── LICENSE
│ │ │ └── pkg/
│ │ │ └── apis/
│ │ │ └── loft/
│ │ │ ├── cluster/
│ │ │ │ ├── doc.go
│ │ │ │ ├── inject.go
│ │ │ │ ├── v1/
│ │ │ │ │ ├── chartinfo_types.go
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── feature_types.go
│ │ │ │ │ ├── helmrelease_types.go
│ │ │ │ │ ├── sleepmodeconfig_types.go
│ │ │ │ │ ├── zz_generated.api.register.go
│ │ │ │ │ ├── zz_generated.conversion.go
│ │ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ │ └── zz_generated.defaults.go
│ │ │ │ ├── zz_generated.api.register.go
│ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ └── zz_generated.defaults.go
│ │ │ └── storage/
│ │ │ └── v1/
│ │ │ ├── clusterquota_types.go
│ │ │ ├── condition_types.go
│ │ │ ├── doc.go
│ │ │ ├── groupversion_info.go
│ │ │ ├── zz_generated.deepcopy.go
│ │ │ └── zz_generated.defaults.go
│ │ ├── analytics-client/
│ │ │ ├── LICENSE
│ │ │ └── client/
│ │ │ ├── buffer.go
│ │ │ ├── client.go
│ │ │ ├── noop.go
│ │ │ └── types.go
│ │ ├── api/
│ │ │ └── v4/
│ │ │ ├── LICENSE
│ │ │ └── pkg/
│ │ │ ├── apis/
│ │ │ │ ├── audit/
│ │ │ │ │ └── v1/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── event_types.go
│ │ │ │ │ ├── zz_generated.deepcopy.go
│ │ │ │ │ └── zz_generated.defaults.go
│ │ │ │ ├── management/
│ │ │ │ │ ├── doc.go
│ │ │ │ │ ├── inject.go
│ │ │ │ │ ├── install/
│ │ │ │ │ │ ├── doc.go
│ │ │ │ │ │ ├── install.go
│ │ │ │ │ │ └── zz_generated.api.register.go
│ │ │ │ │ ├── types.go
│ │ │ │ │ ├── v1/
│ │ │ │ │ │ ├── agentauditevent_types.go
│ │ │ │ │ │ ├── announcement_types.go
│ │ │ │ │ │ ├── app_credentials_types.go
│ │ │ │ │ │ ├── app_types.go
│ │ │ │ │ │ ├── backup_apply_types.go
│ │ │ │ │ │ ├── backup_types.go
│ │ │ │ │ │ ├── cluster_accesskey_types.go
│ │ │ │ │ │ ├── cluster_agentconfig_types.go
│ │ │ │ │ │ ├── cluster_charts_types.go
│ │ │ │ │ │ ├── cluster_domain_types.go
│ │ │ │ │ │ ├── cluster_memberaccess_types.go
│ │ │ │ │ │ ├── cluster_members_types.go
│ │ │ │ │ │ ├── cluster_reset_types.go
│ │ │ │ │ │ ├── cluster_types.go
│ │ │ │ │ │ ├── cluster_virtualclusterdefaults_types.go
│ │ │ │ │ │ ├── clusteraccess_types.go
│ │ │ │ │ │ ├── clusterroletemplate_types.go
│ │ │ │ │ │ ├── config_types.go
│ │ │ │ │ │ ├── devpodenvironmenttemplate_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_cancel_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_download_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_log_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_stop_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_tasks_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_troubleshoot_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_types.go
│ │ │ │ │ │ ├── devpodworkspaceinstance_up_types.go
│ │ │ │ │ │ ├── devpodworkspacepreset_types.go
│ │ │ │ │ │ ├── devpodworkspacetemplate_types.go
│ │ │ │ │ │ ├── d
Showing preview only (2,482K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (25041 symbols across 1898 files)
FILE: cmd/agent/agent.go
function NewAgentCmd (line 20) | func NewAgentCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function AgentPersistentPreRunE (line 41) | func AgentPersistentPreRunE(cobraCmd *cobra.Command, args []string, glob...
FILE: cmd/agent/container/container.go
function NewContainerCmd (line 9) | func NewContainerCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/container/credentials_server.go
constant ExitCodeIO (line 25) | ExitCodeIO int = 64
type CredentialsServerCmd (line 28) | type CredentialsServerCmd struct
method Run (line 69) | func (cmd *CredentialsServerCmd) Run(ctx context.Context, port int) er...
function NewCredentialsServerCmd (line 41) | func NewCredentialsServerCmd(flags *flags.GlobalFlags) *cobra.Command {
function configureGitUserLocally (line 154) | func configureGitUserLocally(ctx context.Context, userName string, clien...
function forwardPorts (line 193) | func forwardPorts(ctx context.Context, client tunnel.TunnelClient, log l...
type forwarder (line 197) | type forwarder struct
method Forward (line 203) | func (f *forwarder) Forward(port string) error {
method StopForward (line 208) | func (f *forwarder) StopForward(port string) error {
FILE: cmd/agent/container/daemon.go
constant RootDir (line 28) | RootDir = "/var/devpod"
constant DaemonConfigPath (line 29) | DaemonConfigPath = "/var/run/secrets/devpod/daemon_config"
type DaemonCmd (line 32) | type DaemonCmd struct
method Run (line 53) | func (cmd *DaemonCmd) Run(c *cobra.Command, args []string) error {
method loadConfig (line 136) | func (cmd *DaemonCmd) loadConfig() error {
method shouldRunNetworkServer (line 170) | func (cmd *DaemonCmd) shouldRunNetworkServer() bool {
method shouldRunSsh (line 177) | func (cmd *DaemonCmd) shouldRunSsh() bool {
function NewDaemonCmd (line 38) | func NewDaemonCmd() *cobra.Command {
function setupActivityFile (line 182) | func setupActivityFile() error {
function runReaper (line 190) | func runReaper(ctx context.Context, errChan chan<- error, wg *sync.WaitG...
function runTimeoutMonitor (line 197) | func runTimeoutMonitor(ctx context.Context, duration time.Duration, errC...
function runNetworkServer (line 219) | func runNetworkServer(ctx context.Context, cmd *DaemonCmd, errChan chan<...
function runSshServer (line 251) | func runSshServer(ctx context.Context, cmd *DaemonCmd, errChan chan<- er...
function handleSignals (line 298) | func handleSignals(ctx context.Context, errChan chan<- error) {
function initLogging (line 309) | func initLogging() log.Logger {
FILE: cmd/agent/container/openvscode_async.go
type OpenVSCodeAsyncCmd (line 15) | type OpenVSCodeAsyncCmd struct
method Run (line 36) | func (cmd *OpenVSCodeAsyncCmd) Run(_ *cobra.Command, _ []string) error {
function NewOpenVSCodeAsyncCmd (line 22) | func NewOpenVSCodeAsyncCmd() *cobra.Command {
function setupOpenVSCodeExtensions (line 58) | func setupOpenVSCodeExtensions(setupInfo *config.Result, log log.Logger)...
FILE: cmd/agent/container/setup.go
type SetupContainerCmd (line 56) | type SetupContainerCmd struct
method Run (line 95) | func (cmd *SetupContainerCmd) Run(ctx context.Context) error {
method installIDE (line 422) | func (cmd *SetupContainerCmd) installIDE(setupInfo *config.Result, ide...
method setupVSCode (line 474) | func (cmd *SetupContainerCmd) setupVSCode(setupInfo *config.Result, id...
method setupOpenVSCode (line 519) | func (cmd *SetupContainerCmd) setupOpenVSCode(setupInfo *config.Result...
function NewSetupContainerCmd (line 70) | func NewSetupContainerCmd(flags *flags.GlobalFlags) *cobra.Command {
function fillContainerEnv (line 238) | func fillContainerEnv(setupInfo *config.Result) error {
function dockerlessBuild (line 258) | func dockerlessBuild(
function parseIgnorePaths (line 389) | func parseIgnorePaths(ignorePaths string) []string {
function configureDockerCredentials (line 403) | func configureDockerCredentials(
function configureSystemGitCredentials (line 561) | func configureSystemGitCredentials(ctx context.Context, cancel context.C...
function streamMount (line 595) | func streamMount(ctx context.Context, workspaceInfo *provider2.Container...
type progressReader (line 666) | type progressReader struct
method Read (line 674) | func (p *progressReader) Read(b []byte) (n int, err error) {
FILE: cmd/agent/container/setup_loft_platform_access.go
type SetupLoftPlatformAccessCmd (line 14) | type SetupLoftPlatformAccessCmd struct
method Run (line 49) | func (c *SetupLoftPlatformAccessCmd) Run(_ *cobra.Command, args []stri...
function NewSetupLoftPlatformAccessCmd (line 24) | func NewSetupLoftPlatformAccessCmd(flags *flags.GlobalFlags) *cobra.Comm...
FILE: cmd/agent/container/setup_windows.go
function NewSetupContainerCmd (line 10) | func NewSetupContainerCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/container/ssh_server.go
constant BaseLogDir (line 16) | BaseLogDir = "/var/devpod"
type SSHServerCmd (line 19) | type SSHServerCmd struct
method Run (line 46) | func (cmd *SSHServerCmd) Run(_ *cobra.Command, _ []string) error {
function NewSSHServerCmd (line 28) | func NewSSHServerCmd(flags *flags.GlobalFlags) *cobra.Command {
function getFileLogger (line 67) | func getFileLogger(remoteUser string, debug bool) log.Logger {
FILE: cmd/agent/container/vscode_async.go
type VSCodeAsyncCmd (line 16) | type VSCodeAsyncCmd struct
method Run (line 52) | func (cmd *VSCodeAsyncCmd) Run(_ *cobra.Command, _ []string) error {
function NewVSCodeAsyncCmd (line 24) | func NewVSCodeAsyncCmd() *cobra.Command {
function migrateReleaseChannel (line 43) | func migrateReleaseChannel(f *pflag.FlagSet, name string) pflag.Normaliz...
function setupVSCodeExtensions (line 74) | func setupVSCodeExtensions(setupInfo *config.Result, flavor vscode.Flavo...
FILE: cmd/agent/container_tunnel.go
type ContainerTunnelCmd (line 24) | type ContainerTunnelCmd struct
method Run (line 52) | func (cmd *ContainerTunnelCmd) Run(ctx context.Context, log log.Logger...
function NewContainerTunnelCmd (line 32) | func NewContainerTunnelCmd(flags *flags.GlobalFlags) *cobra.Command {
function startDevContainer (line 107) | func startDevContainer(ctx context.Context, workspaceConfig *provider2.A...
function StartContainer (line 136) | func StartContainer(ctx context.Context, runner devcontainer.Runner, log...
FILE: cmd/agent/daemon.go
type DaemonCmd (line 22) | type DaemonCmd struct
method Run (line 45) | func (cmd *DaemonCmd) Run(ctx context.Context) error {
method patrol (line 61) | func (cmd *DaemonCmd) patrol(log log.Logger) {
method doOnce (line 81) | func (cmd *DaemonCmd) doOnce(log log.Logger) {
method runShutdownCommand (line 144) | func (cmd *DaemonCmd) runShutdownCommand(workspace *provider2.AgentWor...
method initialTouch (line 171) | func (cmd *DaemonCmd) initialTouch(log log.Logger) {
function NewDaemonCmd (line 29) | func NewDaemonCmd(flags *flags.GlobalFlags) *cobra.Command {
function getActivity (line 197) | func getActivity(workspaceConfig string, log log.Logger) (*time.Time, *p...
FILE: cmd/agent/docker_credentials.go
type DockerCredentialsCmd (line 27) | type DockerCredentialsCmd struct
method Run (line 50) | func (cmd *DockerCredentialsCmd) Run(ctx context.Context, args []strin...
method handleList (line 65) | func (cmd *DockerCredentialsCmd) handleList(log log.Logger) error {
method handleGet (line 111) | func (cmd *DockerCredentialsCmd) handleGet(log log.Logger) error {
function NewDockerCredentialsCmd (line 34) | func NewDockerCredentialsCmd(flags *flags.GlobalFlags) *cobra.Command {
function getDockerCredentialsFromWorkspaceServer (line 166) | func getDockerCredentialsFromWorkspaceServer(credentials *dockercredenti...
function requestDockerCredentials (line 197) | func requestDockerCredentials(httpClient *http.Client, credentials *dock...
FILE: cmd/agent/git_credentials.go
type GitCredentialsCmd (line 25) | type GitCredentialsCmd struct
method Run (line 47) | func (cmd *GitCredentialsCmd) Run(ctx context.Context, args []string, ...
function NewGitCredentialsCmd (line 32) | func NewGitCredentialsCmd(flags *flags.GlobalFlags) *cobra.Command {
function getCredentialsFromWorkspaceServer (line 81) | func getCredentialsFromWorkspaceServer(credentials *gitcredentials.GitCr...
function getCredentialsFromLocalMachine (line 111) | func getCredentialsFromLocalMachine(credentials *gitcredentials.GitCrede...
function doRequest (line 128) | func doRequest(httpClient *http.Client, credentials *gitcredentials.GitC...
FILE: cmd/agent/git_ssh_signature.go
type GitSSHSignatureCmd (line 12) | type GitSSHSignatureCmd struct
function NewGitSSHSignatureCmd (line 30) | func NewGitSSHSignatureCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/git_ssh_signature_helper.go
type GitSSHSignatureHelperCmd (line 13) | type GitSSHSignatureHelperCmd struct
function NewGitSSHSignatureHelperCmd (line 30) | func NewGitSSHSignatureHelperCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/workspace/build.go
type BuildCmd (line 16) | type BuildCmd struct
method Run (line 41) | func (cmd *BuildCmd) Run(ctx context.Context) error {
function NewBuildCmd (line 23) | func NewBuildCmd(flags *flags.GlobalFlags) *cobra.Command {
function deleteWorkspace (line 104) | func deleteWorkspace(ctx context.Context, workspaceInfo *provider2.Agent...
FILE: cmd/agent/workspace/delete.go
type DeleteCmd (line 18) | type DeleteCmd struct
method Run (line 48) | func (cmd *DeleteCmd) Run(ctx context.Context) error {
function NewDeleteCmd (line 28) | func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {
function removeContainer (line 78) | func removeContainer(ctx context.Context, workspaceInfo *provider2.Agent...
function removeDaemon (line 98) | func removeDaemon(workspaceInfo *provider2.AgentWorkspaceInfo, log log.L...
FILE: cmd/agent/workspace/install_dotfiles.go
type InstallDotfilesCmd (line 19) | type InstallDotfilesCmd struct
method Run (line 47) | func (cmd *InstallDotfilesCmd) Run(ctx context.Context) error {
function NewInstallDotfilesCmd (line 28) | func NewInstallDotfilesCmd(flags *flags.GlobalFlags) *cobra.Command {
function setupDotfiles (line 103) | func setupDotfiles(logger log.Logger) error {
function ensureExecutable (line 161) | func ensureExecutable(path string) error {
FILE: cmd/agent/workspace/logs.go
type LogsCmd (line 16) | type LogsCmd struct
method Run (line 41) | func (cmd *LogsCmd) Run(ctx context.Context) error {
function NewLogsCmd (line 23) | func NewLogsCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/workspace/logs_daemon.go
type LogsDaemonCmd (line 17) | type LogsDaemonCmd struct
method Run (line 41) | func (cmd *LogsDaemonCmd) Run(ctx context.Context) error {
function NewLogsDaemonCmd (line 24) | func NewLogsDaemonCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/workspace/setup_gpg.go
type SetupGPGCmd (line 17) | type SetupGPGCmd struct
method Run (line 53) | func (cmd *SetupGPGCmd) Run(ctx context.Context, log log.Logger) error {
function NewSetupGPGCmd (line 26) | func NewSetupGPGCmd(flags *flags.GlobalFlags) *cobra.Command {
function getPublicKeys (line 145) | func getPublicKeys(log log.Logger) (string, error) {
FILE: cmd/agent/workspace/status.go
type StatusCmd (line 16) | type StatusCmd struct
method Run (line 40) | func (cmd *StatusCmd) Run(ctx context.Context, log log.Logger) error {
function NewStatusCmd (line 23) | func NewStatusCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/workspace/stop.go
type StopCmd (line 16) | type StopCmd struct
method Run (line 40) | func (cmd *StopCmd) Run(ctx context.Context) error {
function NewStopCmd (line 23) | func NewStopCmd(flags *flags.GlobalFlags) *cobra.Command {
function stopContainer (line 58) | func stopContainer(ctx context.Context, workspaceInfo *provider2.AgentWo...
FILE: cmd/agent/workspace/up.go
type UpCmd (line 36) | type UpCmd struct
method Run (line 61) | func (cmd *UpCmd) Run(ctx context.Context) error {
method up (line 104) | func (cmd *UpCmd) up(ctx context.Context, workspaceInfo *provider2.Age...
method devPodUp (line 124) | func (cmd *UpCmd) devPodUp(ctx context.Context, workspaceInfo *provide...
function NewUpCmd (line 43) | func NewUpCmd(flags *flags.GlobalFlags) *cobra.Command {
function CreateRunner (line 142) | func CreateRunner(workspaceInfo *provider2.AgentWorkspaceInfo, log log.L...
function InitContentFolder (line 146) | func InitContentFolder(workspaceInfo *provider2.AgentWorkspaceInfo, log ...
function initWorkspace (line 189) | func initWorkspace(ctx context.Context, cancel context.CancelFunc, works...
function prepareWorkspace (line 261) | func prepareWorkspace(ctx context.Context, workspaceInfo *provider2.Agen...
function ensureLastDevContainerJson (line 332) | func ensureLastDevContainerJson(workspaceInfo *provider2.AgentWorkspaceI...
function configureCredentials (line 357) | func configureCredentials(ctx context.Context, cancel context.CancelFunc...
function installDaemon (line 393) | func installDaemon(workspaceInfo *provider2.AgentWorkspaceInfo, log log....
function downloadLocalFolder (line 407) | func downloadLocalFolder(ctx context.Context, workspaceDir string, clien...
function prepareImage (line 422) | func prepareImage(workspaceDir, image string) error {
function installDocker (line 434) | func installDocker(log log.Logger) (err error) {
function configureDockerDaemon (line 449) | func configureDockerDaemon(ctx context.Context, log log.Logger) (err err...
FILE: cmd/agent/workspace/update_config.go
type UpdateConfigCmd (line 13) | type UpdateConfigCmd struct
method Run (line 37) | func (cmd *UpdateConfigCmd) Run(ctx context.Context) error {
function NewUpdateConfigCmd (line 20) | func NewUpdateConfigCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/agent/workspace/workspace.go
function NewWorkspaceCmd (line 9) | func NewWorkspaceCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/build.go
type BuildCmd (line 25) | type BuildCmd struct
method Run (line 142) | func (cmd *BuildCmd) Run(ctx context.Context, client client.WorkspaceC...
method build (line 152) | func (cmd *BuildCmd) build(ctx context.Context, workspaceClient client...
function NewBuildCmd (line 36) | func NewBuildCmd(flags *flags.GlobalFlags) *cobra.Command {
function buildAgentClient (line 170) | func buildAgentClient(ctx context.Context, workspaceClient client.Worksp...
FILE: cmd/completion/suggestions.go
function RegisterFlagCompletionFuns (line 15) | func RegisterFlagCompletionFuns(rootCmd *cobra.Command, globalFlags *fla...
function GetWorkspaceSuggestions (line 31) | func GetWorkspaceSuggestions(rootCmd *cobra.Command, context, provider s...
function GetProviderSuggestions (line 51) | func GetProviderSuggestions(rootCmd *cobra.Command, context, provider st...
function GetContextSuggestions (line 71) | func GetContextSuggestions(rootCmd *cobra.Command, context, provider str...
FILE: cmd/context/context.go
function NewContextCmd (line 9) | func NewContextCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/context/create.go
type CreateCmd (line 16) | type CreateCmd struct
method Run (line 44) | func (cmd *CreateCmd) Run(ctx context.Context, context string) error {
function NewCreateCmd (line 23) | func NewCreateCmd(flags *flags.GlobalFlags) *cobra.Command {
function setOptions (line 77) | func setOptions(devPodConfig *config.Config, context string, options []s...
function parseOptions (line 99) | func parseOptions(options []string) (map[string]config.OptionValue, erro...
FILE: cmd/context/delete.go
type DeleteCmd (line 14) | type DeleteCmd struct
method Run (line 44) | func (cmd *DeleteCmd) Run(ctx context.Context, context string) error {
function NewDeleteCmd (line 19) | func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/context/list.go
type ListCmd (line 18) | type ListCmd struct
method Run (line 49) | func (cmd *ListCmd) Run(ctx context.Context) error {
function NewListCmd (line 25) | func NewListCmd(flags *flags.GlobalFlags) *cobra.Command {
type ContextWithDefault (line 42) | type ContextWithDefault struct
FILE: cmd/context/options.go
type OptionsCmd (line 17) | type OptionsCmd struct
method Run (line 47) | func (cmd *OptionsCmd) Run(ctx context.Context, args []string) error {
function NewOptionsCmd (line 24) | func NewOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {
type optionWithValue (line 40) | type optionWithValue struct
FILE: cmd/context/set_options.go
type SetOptionsCmd (line 14) | type SetOptionsCmd struct
method Run (line 47) | func (cmd *SetOptionsCmd) Run(ctx context.Context, context string) err...
function NewSetOptionsCmd (line 21) | func NewSetOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/context/use.go
type UseCmd (line 14) | type UseCmd struct
method Run (line 42) | func (cmd *UseCmd) Run(ctx context.Context, context string) error {
function NewUseCmd (line 21) | func NewUseCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/delete.go
type DeleteCmd (line 18) | type DeleteCmd struct
method Run (line 64) | func (cmd *DeleteCmd) Run(ctx context.Context, devPodConfig *config.Co...
function NewDeleteCmd (line 24) | func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/export.go
type ExportCmd (line 18) | type ExportCmd struct
method Run (line 49) | func (cmd *ExportCmd) Run(ctx context.Context, devPodConfig *config.Co...
function NewExportCmd (line 23) | func NewExportCmd(flags *flags.GlobalFlags) *cobra.Command {
function exportWorkspace (line 73) | func exportWorkspace(devPodConfig *config.Config, workspaceConfig *provi...
FILE: cmd/flags/flags.go
type GlobalFlags (line 8) | type GlobalFlags struct
function SetGlobalFlags (line 22) | func SetGlobalFlags(flags *flag.FlagSet) *GlobalFlags {
FILE: cmd/helper/check_provider_update.go
type CheckProviderUpdateCmd (line 24) | type CheckProviderUpdateCmd struct
method Run (line 55) | func (cmd *CheckProviderUpdateCmd) Run(ctx context.Context, devPodConf...
type providerVersionCheck (line 29) | type providerVersionCheck struct
function NewCheckProviderUpdateCmd (line 35) | func NewCheckProviderUpdateCmd(flags *flags.GlobalFlags) *cobra.Command {
function loadLatestProvider (line 104) | func loadLatestProvider(providerSourceRaw string, log log.Logger) (*prov...
FILE: cmd/helper/docker_credentials.go
type DockerCredentialsHelperCmd (line 14) | type DockerCredentialsHelperCmd struct
method Run (line 34) | func (c *DockerCredentialsHelperCmd) Run(cmd *cobra.Command, _ []strin...
function NewDockerCredentialsHelperCmd (line 20) | func NewDockerCredentialsHelperCmd(flags *flags.GlobalFlags) *cobra.Comm...
FILE: cmd/helper/fleet_helper.go
type FleetServerCmd (line 16) | type FleetServerCmd struct
method Run (line 39) | func (c *FleetServerCmd) Run(cmd *cobra.Command, _ []string) error {
function NewFleetServerCmd (line 23) | func NewFleetServerCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/get_image.go
type GetImageCommand (line 13) | type GetImageCommand struct
method Run (line 33) | func (cmd *GetImageCommand) Run(ctx context.Context, args []string) er...
function NewGetImageCmd (line 18) | func NewGetImageCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/get_provider_name.go
type GetProviderNameCmd (line 16) | type GetProviderNameCmd struct
method Run (line 36) | func (cmd *GetProviderNameCmd) Run(ctx context.Context, args []string)...
function NewGetProviderNameCmd (line 21) | func NewGetProviderNameCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/get_workspace_config.go
type GetWorkspaceConfigCommand (line 18) | type GetWorkspaceConfigCommand struct
method Run (line 60) | func (cmd *GetWorkspaceConfigCommand) Run(ctx context.Context, devPodC...
type GetWorkspaceConfigCommandResult (line 24) | type GetWorkspaceConfigCommandResult struct
function NewGetWorkspaceConfigCommand (line 32) | func NewGetWorkspaceConfigCommand(flags *flags.GlobalFlags) *cobra.Comma...
FILE: cmd/helper/get_workspace_name.go
type GetWorkspaceNameCommand (line 13) | type GetWorkspaceNameCommand struct
method Run (line 33) | func (cmd *GetWorkspaceNameCommand) Run(ctx context.Context, args []st...
function NewGetWorkspaceNameCmd (line 18) | func NewGetWorkspaceNameCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/get_workspace_uid.go
type GetWorkspaceUIDCommand (line 12) | type GetWorkspaceUIDCommand struct
method Run (line 32) | func (cmd *GetWorkspaceUIDCommand) Run(ctx context.Context, args []str...
function NewGetWorkspaceUIDCmd (line 17) | func NewGetWorkspaceUIDCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/helper.go
function NewHelperCmd (line 13) | func NewHelperCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/http/http.go
function NewHTTPCmd (line 9) | func NewHTTPCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/http/request.go
type RequestCmd (line 16) | type RequestCmd struct
method Run (line 42) | func (cmd *RequestCmd) Run(ctx context.Context, args []string) error {
function NewRequestCmd (line 25) | func NewRequestCmd() *cobra.Command {
FILE: cmd/helper/json/get.go
type GetCmd (line 15) | type GetCmd struct
method Run (line 36) | func (cmd *GetCmd) Run(ctx context.Context, args []string) error {
function NewGetCmd (line 21) | func NewGetCmd() *cobra.Command {
FILE: cmd/helper/json/json.go
function NewJSONCmd (line 9) | func NewJSONCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/sh.go
type ShellCommand (line 12) | type ShellCommand struct
method Run (line 33) | func (cmd *ShellCommand) Run(ctx context.Context, args []string) error {
function NewShellCmd (line 18) | func NewShellCmd() *cobra.Command {
FILE: cmd/helper/ssh_client.go
type SSHClient (line 13) | type SSHClient struct
method Run (line 37) | func (cmd *SSHClient) Run(ctx context.Context, args []string) error {
method getConfig (line 66) | func (cmd *SSHClient) getConfig() (*ssh.ClientConfig, error) {
function NewSSHClientCmd (line 20) | func NewSSHClientCmd() *cobra.Command {
FILE: cmd/helper/ssh_git_clone.go
type SSHGitClone (line 15) | type SSHGitClone struct
method Run (line 36) | func (cmd *SSHGitClone) Run(ctx context.Context, args []string) error {
function NewSSHGitCloneCmd (line 20) | func NewSSHGitCloneCmd() *cobra.Command {
function getConfig (line 79) | func getConfig(userName string, keyFilePaths []string) (*ssh.ClientConfi...
function parseSSHHost (line 102) | func parseSSHHost(host string) (string, string, error) {
FILE: cmd/helper/ssh_server.go
type SSHServerCmd (line 22) | type SSHServerCmd struct
method Run (line 56) | func (cmd *SSHServerCmd) Run(_ *cobra.Command, _ []string) error {
function NewSSHServerCmd (line 34) | func NewSSHServerCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/helper/strings/strings.go
function NewStringsCmd (line 9) | func NewStringsCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/ide/ide.go
function NewIDECmd (line 9) | func NewIDECmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/ide/list.go
type ListCmd (line 19) | type ListCmd struct
method Run (line 50) | func (cmd *ListCmd) Run(ctx context.Context) error {
function NewListCmd (line 26) | func NewListCmd(flags *flags.GlobalFlags) *cobra.Command {
type IDEWithDefault (line 43) | type IDEWithDefault struct
FILE: cmd/ide/options.go
type OptionsCmd (line 19) | type OptionsCmd struct
method Run (line 53) | func (cmd *OptionsCmd) Run(ctx context.Context, ide string) error {
function NewOptionsCmd (line 26) | func NewOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {
type optionWithValue (line 46) | type optionWithValue struct
FILE: cmd/ide/set_options.go
type SetOptionsCmd (line 16) | type SetOptionsCmd struct
method Run (line 44) | func (cmd *SetOptionsCmd) Run(ctx context.Context, ide string) error {
function NewSetOptionsCmd (line 23) | func NewSetOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/ide/use.go
type UseCmd (line 17) | type UseCmd struct
method Run (line 48) | func (cmd *UseCmd) Run(ctx context.Context, ide string) error {
function NewUseCmd (line 24) | func NewUseCmd(flags *flags.GlobalFlags) *cobra.Command {
function setOptions (line 77) | func setOptions(devPodConfig *config.Config, ide string, options []strin...
FILE: cmd/import.go
type ImportCmd (line 21) | type ImportCmd struct
method Run (line 67) | func (cmd *ImportCmd) Run(ctx context.Context, devPodConfig *config.Co...
method importWorkspace (line 116) | func (cmd *ImportCmd) importWorkspace(devPodConfig *config.Config, exp...
method importMachine (line 157) | func (cmd *ImportCmd) importMachine(devPodConfig *config.Config, expor...
method importProvider (line 207) | func (cmd *ImportCmd) importProvider(devPodConfig *config.Config, expo...
method checkForConflictingIDs (line 264) | func (cmd *ImportCmd) checkForConflictingIDs(ctx context.Context, expo...
function NewImportCmd (line 36) | func NewImportCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/list.go
type ListCmd (line 19) | type ListCmd struct
method Run (line 51) | func (cmd *ListCmd) Run(ctx context.Context) error {
function NewListCmd (line 27) | func NewListCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/logs.go
type LogsCmd (line 22) | type LogsCmd struct
method Run (line 46) | func (cmd *LogsCmd) Run(ctx context.Context, args []string) error {
function NewLogsCmd (line 27) | func NewLogsCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/logs_daemon.go
type LogsDaemonCmd (line 18) | type LogsDaemonCmd struct
method Run (line 39) | func (cmd *LogsDaemonCmd) Run(ctx context.Context, args []string) error {
function NewLogsDaemonCmd (line 23) | func NewLogsDaemonCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/create.go
type CreateCmd (line 15) | type CreateCmd struct
method Run (line 38) | func (cmd *CreateCmd) Run(ctx context.Context, args []string) error {
function NewCreateCmd (line 22) | func NewCreateCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/delete.go
type DeleteCmd (line 17) | type DeleteCmd struct
method Run (line 43) | func (cmd *DeleteCmd) Run(ctx context.Context, args []string) error {
function NewDeleteCmd (line 25) | func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/inspect.go
type InspectCmd (line 16) | type InspectCmd struct
method Run (line 35) | func (cmd *InspectCmd) Run(ctx context.Context, args []string) error {
function NewInspectCmd (line 20) | func NewInspectCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/list.go
type ListCmd (line 21) | type ListCmd struct
method Run (line 46) | func (cmd *ListCmd) Run(ctx context.Context) error {
function NewListCmd (line 28) | func NewListCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/machine.go
function NewMachineCmd (line 9) | func NewMachineCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/ssh.go
type SSHCmd (line 26) | type SSHCmd struct
method Run (line 52) | func (cmd *SSHCmd) Run(ctx context.Context, args []string) error {
function NewSSHCmd (line 34) | func NewSSHCmd(flags *flags.GlobalFlags) *cobra.Command {
type ExecFunc (line 101) | type ExecFunc
function StartSSHSession (line 103) | func StartSSHSession(ctx context.Context, user, command string, agentFor...
function RunSSHSession (line 133) | func RunSSHSession(ctx context.Context, sshClient *ssh.Client, agentForw...
FILE: cmd/machine/start.go
type StartCmd (line 15) | type StartCmd struct
method Run (line 36) | func (cmd *StartCmd) Run(ctx context.Context, args []string) error {
function NewStartCmd (line 20) | func NewStartCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/status.go
type StatusCmd (line 17) | type StatusCmd struct
method Run (line 41) | func (cmd *StatusCmd) Run(ctx context.Context, args []string) error {
function NewStatusCmd (line 24) | func NewStatusCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/machine/stop.go
type StopCmd (line 15) | type StopCmd struct
method Run (line 36) | func (cmd *StopCmd) Run(ctx context.Context, args []string) error {
function NewStopCmd (line 20) | func NewStopCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/ping.go
type PingCmd (line 17) | type PingCmd struct
method Run (line 40) | func (cmd *PingCmd) Run(ctx context.Context, args []string) error {
function NewPingCmd (line 21) | func NewPingCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/add/add.go
function NewAddCmd (line 9) | func NewAddCmd(globalFlags *proflags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/add/cluster.go
type ClusterCmd (line 31) | type ClusterCmd struct
method Run (line 79) | func (cmd *ClusterCmd) Run(ctx context.Context, args []string) error {
function NewClusterCmd (line 49) | func NewClusterCmd(globalFlags *proflags.GlobalFlags) *cobra.Command {
function ensureHost (line 265) | func ensureHost(devPodConfig *config.Config, host string, log log.Logger...
function getUserOrTeam (line 290) | func getUserOrTeam(ctx context.Context, baseClient client.Client) (strin...
function getAccess (line 306) | func getAccess(user, team string) []storagev1.Access {
FILE: cmd/pro/check_health.go
type CheckHealthCmd (line 19) | type CheckHealthCmd struct
method Run (line 63) | func (cmd *CheckHealthCmd) Run(ctx context.Context, devPodConfig *conf...
function NewCheckHealthCmd (line 27) | func NewCheckHealthCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/check_update.go
type CheckUpdateCmd (line 19) | type CheckUpdateCmd struct
method Run (line 68) | func (cmd *CheckUpdateCmd) Run(ctx context.Context, devPodConfig *conf...
function NewCheckUpdateCmd (line 27) | func NewCheckUpdateCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
type ProviderUpdateInfo (line 63) | type ProviderUpdateInfo struct
FILE: cmd/pro/completion/suggestions.go
function GetPlatformHostSuggestions (line 13) | func GetPlatformHostSuggestions(rootCmd *cobra.Command, context, provide...
FILE: cmd/pro/create_workspace.go
type CreateWorkspaceCmd (line 19) | type CreateWorkspaceCmd struct
method Run (line 55) | func (cmd *CreateWorkspaceCmd) Run(ctx context.Context, devPodConfig *...
function NewCreateWorkspaceCmd (line 28) | func NewCreateWorkspaceCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/daemon/daemon.go
function NewCmd (line 16) | func NewCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function findProProvider (line 31) | func findProProvider(ctx context.Context, context, provider, host string...
FILE: cmd/pro/daemon/netcheck.go
type NetcheckCmd (line 20) | type NetcheckCmd struct
method Run (line 66) | func (cmd *NetcheckCmd) Run(ctx context.Context, devPodConfig *config....
function NewNetcheckCmd (line 28) | func NewNetcheckCmd(flags *proflags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/daemon/start.go
type StartCmd (line 25) | type StartCmd struct
method Run (line 60) | func (cmd *StartCmd) Run(ctx context.Context, devPodConfig *config.Con...
function NewStartCmd (line 33) | func NewStartCmd(flags *proflags.GlobalFlags) *cobra.Command {
function withGracefulShutdown (line 107) | func withGracefulShutdown(ctx context.Context, log log.Logger) (context....
function ensureDaemonDir (line 136) | func ensureDaemonDir(context, providerName string) (string, error) {
function printStatus (line 150) | func printStatus(status daemon.Status) {
function getUserName (line 159) | func getUserName(self *managementv1.Self) string {
FILE: cmd/pro/daemon/status.go
type StatusCmd (line 20) | type StatusCmd struct
method Run (line 66) | func (cmd *StatusCmd) Run(ctx context.Context, devPodConfig *config.Co...
function NewStatusCmd (line 28) | func NewStatusCmd(flags *proflags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/delete.go
type DeleteCmd (line 25) | type DeleteCmd struct
method Run (line 48) | func (cmd *DeleteCmd) Run(ctx context.Context, args []string) error {
function NewDeleteCmd (line 32) | func NewDeleteCmd(flags *proflags.GlobalFlags) *cobra.Command {
function cleanupLocalWorkspaces (line 117) | func cleanupLocalWorkspaces(ctx context.Context, devPodConfig *config.Co...
function waitDaemonStopped (line 153) | func waitDaemonStopped(ctx context.Context, providerName string) error {
FILE: cmd/pro/flags/flags.go
type GlobalFlags (line 10) | type GlobalFlags struct
function SetGlobalFlags (line 17) | func SetGlobalFlags(flags *flag.FlagSet) *GlobalFlags {
FILE: cmd/pro/import_workspace.go
type ImportCmd (line 28) | type ImportCmd struct
method Run (line 63) | func (cmd *ImportCmd) Run(ctx context.Context, args []string) error {
method writeNewWorkspaceDefinition (line 140) | func (cmd *ImportCmd) writeNewWorkspaceDefinition(devPodConfig *config...
method writeWorkspaceDefinition (line 157) | func (cmd *ImportCmd) writeWorkspaceDefinition(devPodConfig *config.Co...
function NewImportCmd (line 40) | func NewImportCmd(globalFlags *proflags.GlobalFlags) *cobra.Command {
function resolveInstanceOptions (line 191) | func resolveInstanceOptions(ctx context.Context, instance *managementv1....
function fillParameterOptions (line 235) | func fillParameterOptions(opts map[string]string, parameterDefinitions [...
FILE: cmd/pro/list.go
type ListCmd (line 20) | type ListCmd struct
method Run (line 48) | func (cmd *ListCmd) Run(ctx context.Context) error {
function NewListCmd (line 28) | func NewListCmd(flags *proflags.GlobalFlags) *cobra.Command {
type proTableEntry (line 120) | type proTableEntry struct
type Capability (line 128) | type Capability
function checkLogin (line 136) | func checkLogin(ctx context.Context, devPodConfig *config.Config, proIns...
function getCapabilities (line 145) | func getCapabilities(ctx context.Context, devPodConfig *config.Config, p...
FILE: cmd/pro/list_clusters.go
type ListClustersCmd (line 19) | type ListClustersCmd struct
method Run (line 55) | func (cmd *ListClustersCmd) Run(ctx context.Context, devPodConfig *con...
function NewListClustersCmd (line 28) | func NewListClustersCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/list_projects.go
type ListProjectsCmd (line 18) | type ListProjectsCmd struct
method Run (line 51) | func (cmd *ListProjectsCmd) Run(ctx context.Context, devPodConfig *con...
function NewListProjectsCmd (line 26) | func NewListProjectsCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/list_templates.go
type ListTemplatesCmd (line 19) | type ListTemplatesCmd struct
method Run (line 55) | func (cmd *ListTemplatesCmd) Run(ctx context.Context, devPodConfig *co...
function NewListTemplatesCmd (line 28) | func NewListTemplatesCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/list_workspaces.go
type ListWorkspacesCmd (line 18) | type ListWorkspacesCmd struct
method Run (line 51) | func (cmd *ListWorkspacesCmd) Run(ctx context.Context, devPodConfig *c...
function NewListWorkspacesCmd (line 26) | func NewListWorkspacesCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/login.go
constant PROVIDER_BINARY (line 25) | PROVIDER_BINARY = "PRO_PROVIDER"
constant providerRepo (line 26) | providerRepo = "loft-sh/devpod"
type LoginCmd (line 29) | type LoginCmd struct
method Run (line 75) | func (cmd *LoginCmd) Run(ctx context.Context, fullURL string, log log....
method addLoftProvider (line 209) | func (cmd *LoginCmd) addLoftProvider(devPodConfig *config.Config, url ...
method resolveProviderSource (line 236) | func (cmd *LoginCmd) resolveProviderSource(url string) error {
function NewLoginCmd (line 45) | func NewLoginCmd(flags *proflags.GlobalFlags) *cobra.Command {
function login (line 254) | func login(ctx context.Context, devPodConfig *config.Config, url string,...
FILE: cmd/pro/pro.go
function NewProCmd (line 23) | func NewProCmd(flags *flags.GlobalFlags, streamLogger *log.StreamLogger)...
function findProProvider (line 78) | func findProProvider(ctx context.Context, context, provider, host string...
FILE: cmd/pro/provider/create/create.go
function NewCmd (line 9) | func NewCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/create/workspace.go
type WorkspaceCmd (line 24) | type WorkspaceCmd struct
method Run (line 49) | func (cmd *WorkspaceCmd) Run(ctx context.Context, stdin io.Reader, std...
function NewWorkspaceCmd (line 31) | func NewWorkspaceCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function createInstance (line 130) | func createInstance(ctx context.Context, client client.Client, instance ...
FILE: cmd/pro/provider/delete.go
type DeleteCmd (line 18) | type DeleteCmd struct
method Run (line 43) | func (cmd *DeleteCmd) Run(ctx context.Context, stdin io.Reader, stdout...
function NewDeleteCmd (line 25) | func NewDeleteCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/get/get.go
function NewCmd (line 9) | func NewCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/get/self.go
type SelfCmd (line 17) | type SelfCmd struct
method Run (line 41) | func (cmd *SelfCmd) Run(ctx context.Context, stdin io.Reader, stdout i...
function NewSelfCmd (line 24) | func NewSelfCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/get/version.go
type VersionCmd (line 20) | type VersionCmd struct
method Run (line 55) | func (cmd *VersionCmd) Run(ctx context.Context, stdin io.Reader, stdou...
type VersionInfo (line 26) | type VersionInfo struct
function NewVersionCmd (line 38) | func NewVersionCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/get/workspace.go
type WorkspaceCmd (line 16) | type WorkspaceCmd struct
method Run (line 40) | func (cmd *WorkspaceCmd) Run(ctx context.Context) error {
function NewWorkspaceCmd (line 23) | func NewWorkspaceCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/health.go
type HealthCmd (line 20) | type HealthCmd struct
method Run (line 45) | func (cmd *HealthCmd) Run(ctx context.Context, stdin io.Reader, stdout...
function NewHealthCmd (line 27) | func NewHealthCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
type HealthCheck (line 74) | type HealthCheck struct
FILE: cmd/pro/provider/list/clusters.go
type ClustersCmd (line 19) | type ClustersCmd struct
method Run (line 43) | func (cmd *ClustersCmd) Run(ctx context.Context) error {
function NewClustersCmd (line 26) | func NewClustersCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function Clusters (line 68) | func Clusters(ctx context.Context, client client.Client, projectName str...
FILE: cmd/pro/provider/list/list.go
function NewCmd (line 9) | func NewCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/list/projects.go
type ProjectsCmd (line 17) | type ProjectsCmd struct
method Run (line 41) | func (cmd *ProjectsCmd) Run(ctx context.Context) error {
function NewProjectsCmd (line 24) | func NewProjectsCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function Projects (line 62) | func Projects(ctx context.Context, client client.Client) (*managementv1....
FILE: cmd/pro/provider/list/templates.go
type TemplatesCmd (line 26) | type TemplatesCmd struct
method Run (line 50) | func (cmd *TemplatesCmd) Run(ctx context.Context) error {
function NewTemplatesCmd (line 33) | func NewTemplatesCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function Templates (line 75) | func Templates(ctx context.Context, client client.Client, projectName st...
function FindTemplate (line 91) | func FindTemplate(ctx context.Context, managementClient kube.Interface, ...
function GetTemplateParameters (line 115) | func GetTemplateParameters(template *managementv1.DevPodWorkspaceTemplat...
type matchedVersion (line 139) | type matchedVersion struct
function GetLatestVersion (line 144) | func GetLatestVersion(versions storagev1.VersionsAccessor) storagev1.Ver...
function GetLatestMatchedVersion (line 168) | func GetLatestMatchedVersion(versions storagev1.VersionsAccessor, versio...
function VariableToEnvironmentVariable (line 217) | func VariableToEnvironmentVariable(variable string) string {
FILE: cmd/pro/provider/list/workspaces.go
type WorkspacesCmd (line 22) | type WorkspacesCmd struct
method Run (line 46) | func (cmd *WorkspacesCmd) Run(ctx context.Context) error {
function NewWorkspacesCmd (line 29) | func NewWorkspacesCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/provider.go
function NewProProviderCmd (line 23) | func NewProProviderCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/rebuild.go
constant AllWorkspaces (line 18) | AllWorkspaces = "all"
type RebuildCmd (line 21) | type RebuildCmd struct
method Run (line 50) | func (cmd *RebuildCmd) Run(ctx context.Context, args []string) error {
function NewRebuildCmd (line 29) | func NewRebuildCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/ssh.go
type SshCmd (line 18) | type SshCmd struct
method Run (line 43) | func (cmd *SshCmd) Run(ctx context.Context, stdin io.Reader, stdout io...
function NewSshCmd (line 25) | func NewSshCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/status.go
type StatusCmd (line 20) | type StatusCmd struct
method Run (line 45) | func (cmd *StatusCmd) Run(ctx context.Context, stdin io.Reader, stdout...
function NewStatusCmd (line 27) | func NewStatusCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/stop.go
type StopCmd (line 20) | type StopCmd struct
method Run (line 45) | func (cmd *StopCmd) Run(ctx context.Context, stdin io.Reader, stdout i...
function NewStopCmd (line 27) | func NewStopCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/up.go
type UpCmd (line 25) | type UpCmd struct
method Run (line 68) | func (cmd *UpCmd) Run(ctx context.Context) error {
method up (line 105) | func (cmd *UpCmd) up(ctx context.Context, workspace *managementv1.DevP...
type streams (line 32) | type streams struct
function NewUpCmd (line 39) | func NewUpCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function templateUpdateRequired (line 124) | func templateUpdateRequired(instance *managementv1.DevPodWorkspaceInstan...
function printInstanceInfo (line 142) | func printInstanceInfo(instance *managementv1.DevPodWorkspaceInstance, l...
FILE: cmd/pro/provider/update/update.go
function NewCmd (line 9) | func NewCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/update/workspace.go
type WorkspaceCmd (line 23) | type WorkspaceCmd struct
method Run (line 48) | func (cmd *WorkspaceCmd) Run(ctx context.Context, stdin io.Reader, std...
function NewWorkspaceCmd (line 30) | func NewWorkspaceCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
function updateInstance (line 113) | func updateInstance(ctx context.Context, client client.Client, oldInstan...
FILE: cmd/pro/provider/watch/watch.go
function NewCmd (line 9) | func NewCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/provider/watch/workspaces.go
type WorkspacesCmd (line 31) | type WorkspacesCmd struct
method Run (line 71) | func (cmd *WorkspacesCmd) Run(ctx context.Context, stdin io.Reader, st...
function NewWorkspacesCmd (line 38) | func NewWorkspacesCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
type ProWorkspaceInstance (line 56) | type ProWorkspaceInstance struct
type ProWorkspaceInstanceStatus (line 64) | type ProWorkspaceInstanceStatus struct
type instanceStore (line 162) | type instanceStore struct
method key (line 185) | func (s *instanceStore) key(meta metav1.ObjectMeta) string {
method Add (line 189) | func (s *instanceStore) Add(instance *managementv1.DevPodWorkspaceInst...
method Update (line 224) | func (s *instanceStore) Update(oldInstance *managementv1.DevPodWorkspa...
method Delete (line 228) | func (s *instanceStore) Delete(instance *managementv1.DevPodWorkspaceI...
method List (line 239) | func (s *instanceStore) List() []*ProWorkspaceInstance {
function newStore (line 174) | func newStore(informer informermanagementv1.DevPodWorkspaceInstanceInfor...
function printInstances (line 311) | func printInstances(w io.Writer, instances []*ProWorkspaceInstance) {
FILE: cmd/pro/rebuild.go
constant AllWorkspaces (line 18) | AllWorkspaces = "all"
type RebuildCmd (line 21) | type RebuildCmd struct
method Run (line 53) | func (cmd *RebuildCmd) Run(ctx context.Context, args []string) error {
function NewRebuildCmd (line 30) | func NewRebuildCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/reset/password.go
type PasswordCmd (line 24) | type PasswordCmd struct
method Run (line 67) | func (cmd *PasswordCmd) Run() error {
function NewPasswordCmd (line 36) | func NewPasswordCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/reset/reset.go
function NewResetCmd (line 9) | func NewResetCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/self.go
type SelfCmd (line 18) | type SelfCmd struct
method Run (line 51) | func (cmd *SelfCmd) Run(ctx context.Context, devPodConfig *config.Conf...
function NewSelfCmd (line 26) | func NewSelfCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/sleep.go
type SleepCmd (line 23) | type SleepCmd struct
method Run (line 57) | func (cmd *SleepCmd) Run(ctx context.Context, args []string) error {
function NewSleepCmd (line 33) | func NewSleepCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/start.go
constant LoftRouterDomainSecret (line 52) | LoftRouterDomainSecret = "loft-router-domain"
constant passwordChangedHint (line 53) | passwordChangedHint = "(has been changed)"
constant defaultUser (line 54) | defaultUser = "admin"
constant defaultReleaseName (line 56) | defaultReleaseName = "devpod-pro"
type StartCmd (line 61) | type StartCmd struct
method Run (line 129) | func (cmd *StartCmd) Run(ctx context.Context) error {
method upgrade (line 192) | func (cmd *StartCmd) upgrade() error {
method success (line 269) | func (cmd *StartCmd) success(ctx context.Context) error {
method successRemote (line 332) | func (cmd *StartCmd) successRemote(ctx context.Context, host string) e...
method successLocal (line 410) | func (cmd *StartCmd) successLocal() error {
method startDocker (line 448) | func (cmd *StartCmd) startDocker(ctx context.Context) error {
method successDocker (line 501) | func (cmd *StartCmd) successDocker(ctx context.Context, containerID st...
method waitForLoftDocker (line 559) | func (cmd *StartCmd) waitForLoftDocker(ctx context.Context, containerI...
method findLoftRouter (line 592) | func (cmd *StartCmd) findLoftRouter(ctx context.Context, id string) (s...
method prepareDocker (line 601) | func (cmd *StartCmd) prepareDocker() error {
method uninstallDocker (line 616) | func (cmd *StartCmd) uninstallDocker(ctx context.Context, id string) e...
method runInDocker (line 634) | func (cmd *StartCmd) runInDocker(ctx context.Context, name string) (st...
method logsContainer (line 678) | func (cmd *StartCmd) logsContainer(ctx context.Context, id string) (st...
method inspectContainer (line 688) | func (cmd *StartCmd) inspectContainer(ctx context.Context, id string) ...
method removeContainer (line 706) | func (cmd *StartCmd) removeContainer(ctx context.Context, id string) e...
method findLoftContainer (line 716) | func (cmd *StartCmd) findLoftContainer(ctx context.Context, name strin...
method buildDockerCmd (line 752) | func (cmd *StartCmd) buildDockerCmd(ctx context.Context, args ...strin...
method prepareInstall (line 756) | func (cmd *StartCmd) prepareInstall(ctx context.Context) error {
method prepare (line 761) | func (cmd *StartCmd) prepare() error {
method handleAlreadyExistingInstallation (line 838) | func (cmd *StartCmd) handleAlreadyExistingInstallation(ctx context.Con...
method waitForDeployment (line 933) | func (cmd *StartCmd) waitForDeployment(ctx context.Context) (*corev1.P...
method pingLoftRouter (line 956) | func (cmd *StartCmd) pingLoftRouter(ctx context.Context, loftPod *core...
method successLoftRouter (line 1000) | func (cmd *StartCmd) successLoftRouter(url string) error {
method login (line 1039) | func (cmd *StartCmd) login(url string) error {
method loginViaCLI (line 1070) | func (cmd *StartCmd) loginViaCLI(url string) error {
method loginUI (line 1122) | func (cmd *StartCmd) loginUI(url string) error {
method isLoggedIn (line 1136) | func (cmd *StartCmd) isLoggedIn(url string) bool {
function NewStartCmd (line 92) | func NewStartCmd(flags *proflags.GlobalFlags) *cobra.Command {
function PrintSuccessMessageDockerInstall (line 534) | func PrintSuccessMessageDockerInstall(host, password string, log log.Log...
function uninstall (line 1143) | func uninstall(ctx context.Context, kubeClient kubernetes.Interface, res...
function isAlreadyInstalled (line 1225) | func isAlreadyInstalled(ctx context.Context, kubeClient kubernetes.Inter...
function getDefaultPassword (line 1238) | func getDefaultPassword(ctx context.Context, kubeClient kubernetes.Inter...
function isInstalledLocally (line 1260) | func isInstalledLocally(ctx context.Context, kubeClient kubernetes.Inter...
function enterHostNameQuestion (line 1270) | func enterHostNameQuestion(log log.Logger) (string, error) {
function ensureIngressController (line 1283) | func ensureIngressController(ctx context.Context, kubeClient kubernetes....
function deleteUser (line 1368) | func deleteUser(ctx context.Context, restConfig *rest.Config, name strin...
function ensureAdminPassword (line 1397) | func ensureAdminPassword(ctx context.Context, kubeClient kubernetes.Inte...
function getIngressHost (line 1473) | func getIngressHost(ctx context.Context, kubeClient kubernetes.Interface...
type version (line 1495) | type version struct
function isHostReachable (line 1499) | func isHostReachable(ctx context.Context, host string) (bool, error) {
function upgradeRelease (line 1532) | func upgradeRelease(chartName, chartRepo, kubeContext, namespace string,...
function getReleaseManifests (line 1572) | func getReleaseManifests(chartName, chartRepo, kubeContext, namespace st...
function getHelmWorkdir (line 1604) | func getHelmWorkdir(chartName string) (string, error) {
type ContainerDetails (line 1630) | type ContainerDetails struct
type ContainerNetworkSettings (line 1638) | type ContainerNetworkSettings struct
type ContainerPort (line 1642) | type ContainerPort struct
type ContainerDetailsConfig (line 1647) | type ContainerDetailsConfig struct
type ContainerDetailsState (line 1654) | type ContainerDetailsState struct
function WrapCommandError (line 1659) | func WrapCommandError(stdout []byte, err error) error {
type Error (line 1670) | type Error struct
method Error (line 1675) | func (e *Error) Error() string {
function getMachineUID (line 1689) | func getMachineUID(log log.Logger) string {
FILE: cmd/pro/update_provider.go
type UpdateProviderCmd (line 17) | type UpdateProviderCmd struct
method Run (line 46) | func (cmd *UpdateProviderCmd) Run(ctx context.Context, args []string) ...
function NewUpdateProviderCmd (line 26) | func NewUpdateProviderCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/update_workspace.go
type UpdateWorkspaceCmd (line 19) | type UpdateWorkspaceCmd struct
method Run (line 55) | func (cmd *UpdateWorkspaceCmd) Run(ctx context.Context, devPodConfig *...
function NewUpdateWorkspaceCmd (line 28) | func NewUpdateWorkspaceCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/version.go
type VersionCmd (line 18) | type VersionCmd struct
method Run (line 51) | func (cmd *VersionCmd) Run(ctx context.Context, devPodConfig *config.C...
function NewVersionCmd (line 26) | func NewVersionCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/wakeup.go
type WakeupCmd (line 23) | type WakeupCmd struct
method Run (line 55) | func (cmd *WakeupCmd) Run(ctx context.Context, args []string) error {
function NewWakeupCmd (line 32) | func NewWakeupCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/pro/watch_workspaces.go
type WatchWorkspacesCmd (line 20) | type WatchWorkspacesCmd struct
method Run (line 58) | func (cmd *WatchWorkspacesCmd) Run(ctx context.Context, devPodConfig *...
function NewWatchWorkspacesCmd (line 30) | func NewWatchWorkspacesCmd(globalFlags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/profile.go
function init (line 13) | func init() {
FILE: cmd/provider/add.go
type AddCmd (line 19) | type AddCmd struct
method Run (line 64) | func (cmd *AddCmd) Run(ctx context.Context, devPodConfig *config.Confi...
function NewAddCmd (line 31) | func NewAddCmd(flags *flags.GlobalFlags) *cobra.Command {
function mergeOptions (line 120) | func mergeOptions(desiredOptions map[string]*types.Option, stateOptions ...
function getUserOption (line 138) | func getUserOption(allOptions []string, optionKey string) (string, bool) {
FILE: cmd/provider/delete.go
type DeleteCmd (line 19) | type DeleteCmd struct
method Run (line 48) | func (cmd *DeleteCmd) Run(ctx context.Context, args []string) error {
function NewDeleteCmd (line 27) | func NewDeleteCmd(flags *flags.GlobalFlags) *cobra.Command {
function DeleteProvider (line 75) | func DeleteProvider(ctx context.Context, devPodConfig *config.Config, pr...
function DeleteProviderConfig (line 106) | func DeleteProviderConfig(devPodConfig *config.Config, provider string, ...
FILE: cmd/provider/list-default-providers.go
type ListAvailableCmd (line 17) | type ListAvailableCmd struct
method Run (line 72) | func (cmd *ListAvailableCmd) Run(ctx context.Context) error {
function getDevpodProviderList (line 21) | func getDevpodProviderList() error {
function NewListAvailableCmd (line 55) | func NewListAvailableCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/provider/list.go
type ListCmd (line 20) | type ListCmd struct
method Run (line 52) | func (cmd *ListCmd) Run(ctx context.Context) error {
function NewListCmd (line 27) | func NewListCmd(flags *flags.GlobalFlags) *cobra.Command {
type ProviderWithDefault (line 45) | type ProviderWithDefault struct
FILE: cmd/provider/options.go
type OptionsCmd (line 21) | type OptionsCmd struct
method Run (line 57) | func (cmd *OptionsCmd) Run(ctx context.Context, args []string) error {
function NewOptionsCmd (line 29) | func NewOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {
type optionWithValue (line 49) | type optionWithValue struct
function printOptions (line 86) | func printOptions(devPodConfig *config.Config, provider *workspace.Provi...
function MergeDynamicOptions (line 148) | func MergeDynamicOptions(options map[string]*types.Option, dynamicOption...
FILE: cmd/provider/provider.go
function NewProviderCmd (line 9) | func NewProviderCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/provider/set_options.go
type SetOptionsCmd (line 18) | type SetOptionsCmd struct
method Run (line 57) | func (cmd *SetOptionsCmd) Run(ctx context.Context, args []string, log ...
function NewSetOptionsCmd (line 29) | func NewSetOptionsCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/provider/update.go
type UpdateCmd (line 16) | type UpdateCmd struct
method Run (line 47) | func (cmd *UpdateCmd) Run(ctx context.Context, devPodConfig *config.Co...
function NewUpdateCmd (line 24) | func NewUpdateCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/provider/use.go
type UseCmd (line 22) | type UseCmd struct
method Run (line 67) | func (cmd *UseCmd) Run(ctx context.Context, providerName string) error {
function NewUseCmd (line 34) | func NewUseCmd(flags *flags.GlobalFlags) *cobra.Command {
function AddFlags (line 57) | func AddFlags(useCmd *cobra.Command, cmd *UseCmd) {
function ConfigureProvider (line 101) | func ConfigureProvider(ctx context.Context, provider *provider2.Provider...
function setOptions (line 122) | func setOptions(
function initProvider (line 178) | func initProvider(ctx context.Context, devPodConfig *config.Config, prov...
FILE: cmd/root.go
function NewRootCmd (line 31) | func NewRootCmd() *cobra.Command {
function Execute (line 77) | func Execute() {
function BuildRoot (line 112) | func BuildRoot() *cobra.Command {
FILE: cmd/ssh.go
constant DisableSSHKeepAlive (line 35) | DisableSSHKeepAlive time.Duration = 0 * time.Second
type SSHCmd (line 39) | type SSHCmd struct
method Run (line 117) | func (cmd *SSHCmd) Run(
method jumpContainerTailscale (line 161) | func (cmd *SSHCmd) jumpContainerTailscale(
method startProxyTunnel (line 236) | func (cmd *SSHCmd) startProxyTunnel(
method retrieveEnVars (line 304) | func (cmd *SSHCmd) retrieveEnVars() (map[string]string, error) {
method jumpContainer (line 323) | func (cmd *SSHCmd) jumpContainer(
method forwardTimeout (line 358) | func (cmd *SSHCmd) forwardTimeout(log log.Logger) (time.Duration, erro...
method reverseForwardPorts (line 372) | func (cmd *SSHCmd) reverseForwardPorts(
method forwardPorts (line 417) | func (cmd *SSHCmd) forwardPorts(
method startTunnel (line 462) | func (cmd *SSHCmd) startTunnel(ctx context.Context, devPodConfig *conf...
method startServices (line 541) | func (cmd *SSHCmd) startServices(
method setupGPGAgent (line 572) | func (cmd *SSHCmd) setupGPGAgent(
function NewSSHCmd (line 66) | func NewSSHCmd(f *flags.GlobalFlags) *cobra.Command {
function startWait (line 258) | func startWait(
function startSSHKeepAlive (line 651) | func startSSHKeepAlive(ctx context.Context, client *ssh.Client, interval...
function startServicesDaemon (line 668) | func startServicesDaemon(ctx context.Context, devPodConfig *config.Confi...
FILE: cmd/status.go
type StatusCmd (line 21) | type StatusCmd struct
method Run (line 69) | func (cmd *StatusCmd) Run(ctx context.Context, client client2.BaseWork...
function NewStatusCmd (line 30) | func NewStatusCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/stop.go
type StopCmd (line 19) | type StopCmd struct
method Run (line 61) | func (cmd *StopCmd) Run(ctx context.Context, devPodConfig *config.Conf...
method stopSingleMachine (line 96) | func (cmd *StopCmd) stopSingleMachine(ctx context.Context, client clie...
function NewStopCmd (line 25) | func NewStopCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/troubleshoot.go
type TroubleshootCmd (line 25) | type TroubleshootCmd struct
method Run (line 48) | func (cmd *TroubleshootCmd) Run(ctx context.Context, args []string) {
function NewTroubleshootCmd (line 29) | func NewTroubleshootCmd(flags *flags.GlobalFlags) *cobra.Command {
function collectProWorkspaceInfo (line 154) | func collectProWorkspaceInfo(
function collectProviders (line 193) | func collectProviders(devPodConfig *config.Config, logger log.Logger) (m...
type DevPodProInstance (line 221) | type DevPodProInstance struct
function collectPlatformInfo (line 231) | func collectPlatformInfo(devPodConfig *config.Config, logger log.Logger)...
type PrintableError (line 255) | type PrintableError struct
method MarshalJSON (line 257) | func (p PrintableError) MarshalJSON() ([]byte, error) { return json.Ma...
FILE: cmd/up.go
type UpCmd (line 55) | type UpCmd struct
method Run (line 144) | func (cmd *UpCmd) Run(
method devPodUp (line 344) | func (cmd *UpCmd) devPodUp(
method devPodUpProxy (line 393) | func (cmd *UpCmd) devPodUpProxy(
method devPodUpDaemon (line 469) | func (cmd *UpCmd) devPodUpDaemon(
method devPodUpMachine (line 496) | func (cmd *UpCmd) devPodUpMachine(
method prepareClient (line 1369) | func (cmd *UpCmd) prepareClient(ctx context.Context, devPodConfig *con...
function NewUpCmd (line 77) | func NewUpCmd(f *flags.GlobalFlags) *cobra.Command {
function startJupyterNotebookInBrowser (line 585) | func startJupyterNotebookInBrowser(
function startRStudioInBrowser (line 642) | func startRStudioInBrowser(
function startFleet (line 699) | func startFleet(ctx context.Context, client client2.BaseWorkspaceClient,...
function startVSCodeInBrowser (line 734) | func startVSCodeInBrowser(
function parseAddressAndPort (line 792) | func parseAddressAndPort(bindAddressOption string, defaultPort int) (str...
function setupBackhaul (line 824) | func setupBackhaul(client client2.BaseWorkspaceClient, authSockId string...
function startBrowserTunnel (line 872) | func startBrowserTunnel(
function configureSSH (line 982) | func configureSSH(client client2.BaseWorkspaceClient, sshConfigPath, use...
function mergeDevPodUpOptions (line 1006) | func mergeDevPodUpOptions(baseOptions *provider2.CLIOptions) error {
function mergeEnvFromFiles (line 1029) | func mergeEnvFromFiles(baseOptions *provider2.CLIOptions) error {
function createSSHCommand (line 1043) | func createSSHCommand(
function setupDotfiles (line 1071) | func setupDotfiles(
function buildDotCmdAgentArguments (line 1121) | func buildDotCmdAgentArguments(devPodConfig *config.Config, dotfilesRepo...
function buildDotCmd (line 1146) | func buildDotCmd(devPodConfig *config.Config, dotfilesRepo, dotfilesScri...
function extractKeysFromEnvKeyValuePairs (line 1196) | func extractKeysFromEnvKeyValuePairs(envKeyValuePairs []string) []string {
function collectDotfilesScriptEnvKeyvaluePairs (line 1207) | func collectDotfilesScriptEnvKeyvaluePairs(envFiles []string) ([]string,...
function setupGitSSHSignature (line 1219) | func setupGitSSHSignature(signingKey string, client client2.BaseWorkspac...
function performGpgForwarding (line 1248) | func performGpgForwarding(
function checkProviderUpdate (line 1293) | func checkProviderUpdate(devPodConfig *config.Config, proInstance *provi...
function getProInstance (line 1353) | func getProInstance(devPodConfig *config.Config, providerName string, lo...
function WithSignals (line 1437) | func WithSignals(ctx context.Context) (context.Context, func()) {
FILE: cmd/upgrade.go
type UpgradeCmd (line 11) | type UpgradeCmd struct
method Run (line 31) | func (cmd *UpgradeCmd) Run(*cobra.Command, []string) error {
function NewUpgradeCmd (line 17) | func NewUpgradeCmd() *cobra.Command {
FILE: cmd/use/use.go
function NewUseCmd (line 11) | func NewUseCmd(flags *flags.GlobalFlags) *cobra.Command {
FILE: cmd/version.go
type VersionCmd (line 11) | type VersionCmd struct
method Run (line 28) | func (cmd *VersionCmd) Run(_ *cobra.Command, _ []string) error {
function NewVersionCmd (line 15) | func NewVersionCmd() *cobra.Command {
FILE: desktop/src-tauri/build.rs
function main (line 1) | fn main() {
FILE: desktop/src-tauri/src/action_logs.rs
constant ACTION_LOGS_DIR (line 13) | const ACTION_LOGS_DIR: &str = "action_logs";
constant THIRTY_DAYS (line 14) | const THIRTY_DAYS: Duration = Duration::new(60 * 60 * 24 * 30, 0);
type ActionLogError (line 17) | pub enum ActionLogError {
method serialize (line 28) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
function write_action_log (line 37) | pub fn write_action_log(
function get_action_logs (line 58) | pub fn get_action_logs(
function get_action_log_file (line 75) | pub fn get_action_log_file(
function setup (line 85) | pub fn setup(app_handle: &AppHandle) -> anyhow::Result<()> {
function get_actions_dir (line 123) | fn get_actions_dir(app_handle: &AppHandle) -> anyhow::Result<PathBuf> {
FILE: desktop/src-tauri/src/commands/config.rs
type CommandConfig (line 11) | pub struct CommandConfig<'a> {
function binary_name (line 17) | pub fn binary_name(&self) -> &'static str {
function args (line 21) | pub fn args(&self) -> &Vec<&str> {
type DevpodCommandError (line 27) | pub enum DevpodCommandError {
method serialize (line 42) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
type DevpodCommandConfig (line 49) | pub trait DevpodCommandConfig<T> {
method config (line 50) | fn config(&self) -> CommandConfig {
method exec_blocking (line 56) | fn exec_blocking(self, app_handle: &AppHandle) -> Result<T, DevpodComm...
method new_command (line 58) | fn new_command(&self, app_handle: &AppHandle) -> Result<Command, Devpo...
FILE: desktop/src-tauri/src/commands/constants.rs
constant DEVPOD_BINARY_NAME (line 2) | pub const DEVPOD_BINARY_NAME: &str = "devpod-cli";
constant DEVPOD_COMMAND_LIST (line 5) | pub(super) const DEVPOD_COMMAND_LIST: &str = "list";
constant DEVPOD_COMMAND_PROVIDER (line 6) | pub(super) const DEVPOD_COMMAND_PROVIDER: &str = "provider";
constant DEVPOD_COMMAND_PRO (line 7) | pub(super) const DEVPOD_COMMAND_PRO: &str = "pro";
constant DEVPOD_COMMAND_DELETE (line 8) | pub(super) const DEVPOD_COMMAND_DELETE: &str = "delete";
constant DEVPOD_COMMAND_DAEMON (line 9) | pub(super) const DEVPOD_COMMAND_DAEMON: &str = "daemon";
constant DEVPOD_COMMAND_START (line 10) | pub(super) const DEVPOD_COMMAND_START: &str = "start";
constant FLAG_OUTPUT_JSON (line 13) | pub(super) const FLAG_OUTPUT_JSON: &str = "--output=json";
constant FLAG_HOST (line 14) | pub(super) const FLAG_HOST: &str = "--host";
constant FLAG_DEBUG (line 15) | pub(super) const FLAG_DEBUG: &str = "--debug";
constant FLAG_IGNORE_NOT_FOUND (line 16) | pub(super) const FLAG_IGNORE_NOT_FOUND: &str = "--ignore-not-found";
constant DEVPOD_UI_ENV_VAR (line 19) | pub(super) const DEVPOD_UI_ENV_VAR: &str = "DEVPOD_UI";
FILE: desktop/src-tauri/src/commands/delete_pro_instance.rs
type DeleteProInstanceCommand (line 10) | pub struct DeleteProInstanceCommand {
method new (line 14) | pub fn new(pro_id: String) -> Self {
method config (line 19) | fn config(&self) -> CommandConfig {
method exec_blocking (line 31) | fn exec_blocking(self, app_handle: &AppHandle) -> Result<(), DevpodCom...
FILE: desktop/src-tauri/src/commands/delete_provider.rs
type DeleteProviderCommand (line 8) | pub struct DeleteProviderCommand {
method new (line 12) | pub fn new(provider_id: String) -> Self {
method config (line 17) | fn config(&self) -> CommandConfig {
method exec_blocking (line 28) | fn exec_blocking(self, app_handle: &AppHandle) -> Result<(), DevpodCom...
FILE: desktop/src-tauri/src/commands/list_pro_instances.rs
type ListProInstancesCommand (line 9) | pub struct ListProInstancesCommand {}
method new (line 11) | pub fn new() -> Self {
method deserialize (line 15) | fn deserialize(&self, d: Vec<u8>) -> Result<Vec<ProInstance>, DevpodCo...
method config (line 20) | fn config(&self) -> CommandConfig {
method exec_blocking (line 27) | fn exec_blocking(self, app_handle: &AppHandle) -> Result<Vec<ProInstan...
method exec (line 37) | pub async fn exec(
FILE: desktop/src-tauri/src/commands/list_workspaces.rs
type ListWorkspacesCommand (line 10) | pub struct ListWorkspacesCommand {}
method new (line 12) | pub fn new() -> Self {
method deserialize (line 16) | fn deserialize(&self, d: Vec<u8>) -> Result<Vec<Workspace>, DevpodComm...
method config (line 21) | fn config(&self) -> CommandConfig {
method exec_blocking (line 28) | fn exec_blocking(self, app_handle: &AppHandle) -> Result<Vec<Workspace...
method exec (line 39) | pub async fn exec(self, app_handle: &AppHandle) -> Result<Vec<Workspac...
FILE: desktop/src-tauri/src/commands/start_daemon.rs
type StartDaemonCommand (line 9) | pub struct StartDaemonCommand {
method new (line 14) | pub fn new(host: String, debug: bool) -> Self {
method exec_blocking (line 28) | fn exec_blocking(self, app_handle: &AppHandle) -> Result<(), DevpodCom...
method config (line 37) | fn config(&self) -> CommandConfig {
method command (line 52) | pub fn command(self, app_handle: &AppHandle) -> Result<Command, Devpod...
FILE: desktop/src-tauri/src/community_contributions.rs
constant RAW_COMMUNITY_YAML (line 3) | const RAW_COMMUNITY_YAML: &str = include_str!("../../../community.yaml");
type CommunityContributions (line 6) | pub struct CommunityContributions {
type CommunityProvider (line 11) | struct CommunityProvider {
function init (line 15) | pub fn init() -> anyhow::Result<CommunityContributions> {
function get_contributions (line 20) | pub fn get_contributions(state: tauri::State<'_, AppState>) -> Result<Co...
FILE: desktop/src-tauri/src/custom_protocol.rs
constant APP_IDENTIFIER (line 15) | const APP_IDENTIFIER: &str = "sh.loft.devpod";
constant APP_URL_SCHEME (line 16) | const APP_URL_SCHEME: &str = "devpod";
type CustomProtocol (line 18) | pub struct CustomProtocol;
method init (line 157) | pub fn init() -> Self {
method forward_deep_link (line 162) | pub fn forward_deep_link() {
method setup (line 211) | pub fn setup(&self, app: AppHandle) {
method parse (line 287) | fn parse<'a, Msg>(request: &'a Request) -> Result<Msg, ParseError>
type Request (line 20) | pub struct Request {
type UrlParser (line 25) | pub struct UrlParser {}
constant ALLOWED_METHODS (line 28) | const ALLOWED_METHODS: [&'static str; 3] = ["open", "import", "pro"];
method get_host (line 30) | fn get_host(url: &Url) -> String {
method parse_raw_url (line 34) | fn parse_raw_url(url_scheme: &str) -> Result<Url, ParseError> {
method is_allowed_method (line 38) | fn is_allowed_method(host_str: &str) -> bool {
method parse_query (line 42) | fn parse_query(url: &Url) -> String {
method parse (line 46) | pub fn parse(url_scheme: &str) -> Result<Request, ParseError> {
type OpenHandler (line 60) | pub struct OpenHandler {}
method handle (line 63) | pub async fn handle(msg: Result<OpenWorkspaceMsg, ParseError>, app_sta...
method handle_ok (line 70) | async fn handle_ok(msg: OpenWorkspaceMsg, app_state: State<'_, AppStat...
method handle_error (line 80) | async fn handle_error(err: ParseError, app_state: State<'_, AppState>) {
type ImportHandler (line 91) | pub struct ImportHandler {}
method handle (line 94) | pub async fn handle(
method handle_ok (line 104) | async fn handle_ok(msg: ImportWorkspaceMsg, app_state: State<'_, AppSt...
method handle_error (line 114) | async fn handle_error(err: ParseError, app_state: State<'_, AppState>) {
type ProHandler (line 125) | pub struct ProHandler {}
method handle (line 128) | pub async fn handle(msg: Result<SetupProMsg, ParseError>, app_state: S...
method handle_ok (line 135) | async fn handle_ok(msg: SetupProMsg, app_state: State<'_, AppState>) {
method handle_error (line 145) | async fn handle_error(err: ParseError, app_state: State<'_, AppState>) {
type ParseError (line 297) | pub enum ParseError {
function should_parse (line 310) | fn should_parse() {
function should_parse_with_empty_query (line 319) | fn should_parse_with_empty_query() {
function should_fail_on_invalid_method (line 329) | fn should_fail_on_invalid_method() {
function should_fail_on_invalid_scheme (line 336) | fn should_fail_on_invalid_scheme() {
function should_parse_full (line 348) | fn should_parse_full() {
function should_parse_workspace (line 361) | fn should_parse_workspace() {
function should_parse (line 373) | fn should_parse() {
function should_parse_full (line 391) | fn should_parse_full() {
function should_fail_on_missing_workspace_id (line 407) | fn should_fail_on_missing_workspace_id() {
function should_parse_full (line 423) | fn should_parse_full() {
function should_parse_host (line 434) | fn should_parse_host() {
function should_fail_on_missing_workspace_id (line 445) | fn should_fail_on_missing_workspace_id() {
FILE: desktop/src-tauri/src/daemon.rs
type DaemonStatus (line 11) | pub struct DaemonStatus {
type DaemonState (line 20) | pub enum DaemonState {
method running_icon (line 27) | pub fn running_icon() -> Image<'static> {
method stopped_icon (line 34) | pub fn stopped_icon() -> Image<'static> {
method pending_icon (line 41) | pub fn pending_icon() -> Image<'static> {
method get_icon (line 49) | pub fn get_icon(&self) -> tauri::image::Image {
FILE: desktop/src-tauri/src/daemon/client.rs
type Request (line 18) | pub type Request = hyper::Request<axum::body::Body>;
type Response (line 19) | pub type Response = hyper::Response<hyper::body::Incoming>;
type Client (line 21) | pub struct Client {
method new (line 25) | pub fn new(socket: String) -> Client {
method clone (line 29) | pub fn clone(&self) -> Client {
method status (line 33) | pub async fn status(&self) -> anyhow::Result<DaemonStatus> {
method proxy (line 38) | pub async fn proxy(&self, mut req: Request) -> anyhow::Result<Response> {
method get (line 69) | async fn get<T: DeserializeOwned>(&self, target_path: &str) -> anyhow:...
constant DEVPOD_PREFIX_BYTE (line 102) | const DEVPOD_PREFIX_BYTE: u8 = 0x01;
type HandshakeStream (line 104) | pub struct HandshakeStream {
method connect (line 113) | pub async fn connect(p: &Path) -> tokio::io::Result<Self> {
method poll_read (line 131) | fn poll_read(
method poll_write (line 141) | fn poll_write(
method poll_flush (line 149) | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Resu...
method poll_shutdown (line 153) | fn poll_shutdown(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<R...
type InnerStream (line 108) | type InnerStream = tokio::net::UnixStream;
type InnerStream (line 110) | type InnerStream = tokio::net::windows::named_pipe::NamedPipeClient;
function new (line 168) | pub fn new(inner: T) -> Self {
function poll_read (line 177) | fn poll_read(
function poll_write (line 201) | fn poll_write(
function poll_flush (line 209) | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result...
function poll_shutdown (line 213) | fn poll_shutdown(
function is_write_vectored (line 220) | fn is_write_vectored(&self) -> bool {
function poll_write_vectored (line 224) | fn poll_write_vectored(
function poll_read (line 237) | fn poll_read(
function poll_write (line 269) | fn poll_write(
function poll_flush (line 277) | fn poll_flush(self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<Result...
function poll_shutdown (line 281) | fn poll_shutdown(
function is_write_vectored (line 288) | fn is_write_vectored(&self) -> bool {
function poll_write_vectored (line 292) | fn poll_write_vectored(
FILE: desktop/src-tauri/src/file_exists.rs
function file_exists (line 6) | pub fn file_exists(filepath: &str) -> bool {
FILE: desktop/src-tauri/src/fix_env.rs
type Error (line 5) | pub enum Error {
function get_shell (line 14) | fn get_shell() -> String {
function read_path_env_cmd (line 23) | fn read_path_env_cmd(shell: String, var_name: String) -> Result<Output, ...
function fix_env (line 33) | pub fn fix_env(var_name: &str) -> Result<(), Error> {
FILE: desktop/src-tauri/src/get_env.rs
function get_env (line 5) | pub fn get_env(name: &str) -> String {
FILE: desktop/src-tauri/src/install_cli.rs
type InstallCLIError (line 12) | pub enum InstallCLIError {
method serialize (line 31) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
function install_cli (line 40) | pub fn install_cli(app_handle: AppHandle, force: bool) -> Result<(), Ins...
function get_cli_path (line 50) | fn get_cli_path() -> Result<PathBuf, std::io::Error> {
function install (line 59) | fn install(_app_handle: AppHandle, force: bool) -> Result<(), InstallCLI...
function copy (line 188) | fn copy<P: AsRef<Path>, Q: AsRef<Path>>(from: P, to: Q) -> std::io::Resu...
function is_tmpfs (line 193) | fn is_tmpfs(path: &Path) -> bool {
function find_fs_type (line 209) | fn find_fs_type(curr_path: &Path, mount_lines: &Lines) -> Option<String> {
function install (line 222) | fn install(app_handle: AppHandle, force: bool) -> Result<(), InstallCLIE...
FILE: desktop/src-tauri/src/logging.rs
function build_plugin (line 6) | pub fn build_plugin() -> TauriPlugin<Wry> {
FILE: desktop/src-tauri/src/main.rs
type AppHandle (line 45) | pub type AppHandle = tauri::AppHandle<Wry>;
type AppState (line 47) | pub struct AppState {
function main (line 57) | fn main() -> anyhow::Result<()> {
FILE: desktop/src-tauri/src/providers.rs
function check_dangling_provider (line 9) | pub fn check_dangling_provider(app_handle: &AppHandle) {
function check_pro_instances (line 68) | fn check_pro_instances(
FILE: desktop/src-tauri/src/resource_watcher.rs
type Identifiable (line 25) | pub trait Identifiable {
method id (line 27) | fn id(&self) -> Self::ID;
type ID (line 42) | type ID = String;
method id (line 43) | fn id(&self) -> String {
type ID (line 113) | type ID = String;
method id (line 114) | fn id(&self) -> String {
type WorkspacesState (line 30) | pub struct WorkspacesState {
constant IDENTIFIER_PREFIX (line 65) | pub const IDENTIFIER_PREFIX: &'static str = "workspaces-";
constant CREATE_WORKSPACE_ID (line 66) | pub const CREATE_WORKSPACE_ID: &'static str = "workspaces-create_works...
method item_id (line 68) | fn item_id(id: &String) -> String {
method set_submenu (line 72) | pub fn set_submenu(&mut self, submenu: Submenu<Wry>) {
method load_workspaces (line 76) | pub async fn load_workspaces(
type Workspace (line 36) | pub struct Workspace {
method new_menu_item (line 53) | fn new_menu_item(&self, app_handle: &AppHandle) -> tauri::Result<MenuI...
method eq (line 48) | fn eq(&self, other: &Self) -> bool {
method to_submenu (line 86) | fn to_submenu(&self, app_handle: &AppHandle) -> anyhow::Result<tauri::me...
type ProState (line 107) | pub struct ProState {
constant IDENTIFIER_PREFIX (line 125) | pub const IDENTIFIER_PREFIX: &'static str = "pro-instances-";
method item_id (line 127) | fn item_id(id: &String) -> String {
method load_pro_instances (line 131) | pub async fn load_pro_instances(
method set_submenu (line 140) | pub fn set_submenu(&mut self, submenu: Submenu<Wry>) {
method find_instance (line 144) | pub fn find_instance(&self, pro_id: String) -> Option<&ProInstance> {
method find_instance_mut (line 148) | pub fn find_instance_mut(&mut self, pro_id: String) -> Option<&mut Pro...
method eq (line 119) | fn eq(&self, other: &Self) -> bool {
type ProInstance (line 155) | pub struct ProInstance {
method has_capability (line 166) | pub fn has_capability(&self, capability: String) -> bool {
method daemon (line 177) | pub fn daemon(&self) -> &Option<Daemon> {
method daemon_mut (line 181) | pub fn daemon_mut(&mut self) -> Option<&mut Daemon> {
method new_menu_item (line 185) | fn new_menu_item(&self, app_handle: &AppHandle) -> tauri::Result<IconM...
method get_icon (line 196) | fn get_icon(&self) -> Option<Image> {
type Daemon (line 205) | pub struct Daemon {
method new (line 216) | pub fn new(provider: Option<String>) -> anyhow::Result<Daemon> {
method get_socket_addr (line 231) | fn get_socket_addr(
method get_client (line 250) | pub fn get_client(&self) -> &daemon::client::Client {
method get_status (line 254) | pub async fn get_status(&self) -> anyhow::Result<daemon::DaemonStatus> {
method try_start (line 258) | pub async fn try_start(&mut self, host: String, app_handle: &AppHandle) {
method try_stop (line 274) | pub async fn try_stop(&mut self) {
method should_retry (line 287) | fn should_retry(&mut self, app_handle: &AppHandle) -> bool {
method should_debug (line 303) | fn should_debug(&self) -> bool {
method spawn (line 307) | async fn spawn(
method get_initial_status (line 333) | async fn get_initial_status(
method try_notify_login (line 352) | async fn try_notify_login(&mut self, host: String, app_handle: &AppHan...
method try_notify_failed (line 370) | fn try_notify_failed(&mut self, app_handle: &AppHandle) {
method to_submenu (line 389) | fn to_submenu(&self, app_handle: &AppHandle) -> anyhow::Result<tauri::me...
function setup (line 394) | pub fn setup(app_handle: &AppHandle) {
function shutdown (line 424) | pub async fn shutdown(app_handle: &AppHandle) {
function watch_daemons (line 444) | async fn watch_daemons(app_handle: &AppHandle) -> anyhow::Result<()> {
function handle_workspaces (line 539) | async fn handle_workspaces(app_handle: &AppHandle) {
function handle_pro_instances (line 569) | async fn handle_pro_instances(app_handle: &AppHandle) {
function diff_mut (line 599) | fn diff_mut<'a, T: Identifiable>(old: &'a [T], new: &'a mut [T]) -> (Vec...
FILE: desktop/src-tauri/src/server.rs
type ServerState (line 22) | struct ServerState {
function setup (line 26) | pub async fn setup(app_handle: &AppHandle) -> anyhow::Result<()> {
type SendSignalMessage (line 58) | struct SendSignalMessage {
function signal_handler (line 63) | async fn signal_handler(
function releases_handler (line 77) | async fn releases_handler(AxumState(server): AxumState<ServerState>) -> ...
function daemon_status_handler (line 85) | async fn daemon_status_handler(
function new_daemon_client (line 98) | async fn new_daemon_client(
function daemon_restart_handler (line 113) | async fn daemon_restart_handler(
function daemon_proxy_handler (line 132) | async fn daemon_proxy_handler(
function ws_handler (line 162) | async fn ws_handler(
function handle_socket (line 179) | async fn handle_socket(mut socket: WebSocket, who: SocketAddr, app_handl...
FILE: desktop/src-tauri/src/settings.rs
constant SETTINGS_FILE_NAME (line 10) | const SETTINGS_FILE_NAME: &str = ".settings.json";
type Settings (line 15) | pub struct Settings {
method auto_update_enabled (line 82) | pub fn auto_update_enabled(app_handle: &AppHandle) -> bool {
type SidebarPosition (line 58) | enum SidebarPosition {
type ColorMode (line 66) | enum ColorMode {
type Zoom (line 74) | enum Zoom {
FILE: desktop/src-tauri/src/system_tray.rs
type ToSystemTraySubmenu (line 24) | pub trait ToSystemTraySubmenu {
method to_submenu (line 25) | fn to_submenu(&self, app_handle: &AppHandle) -> anyhow::Result<Submenu...
type SystemTray (line 28) | pub struct SystemTray {}
method new (line 31) | pub fn new() -> Self {
constant QUIT_ID (line 37) | const QUIT_ID: &str = "quit";
constant SHOW_DASHBOARD_ID (line 38) | const SHOW_DASHBOARD_ID: &str = "show_dashboard";
method init (line 42) | pub async fn init(&self, app_handle: &AppHandle) -> anyhow::Result<Men...
method get_menu_event_handler (line 73) | pub fn get_menu_event_handler(&self) -> impl Fn(&AppHandle, MenuEvent)...
method get_tray_icon_event_handler (line 133) | pub fn get_tray_icon_event_handler(&self) -> impl Fn(&TrayIcon, TrayIc...
FILE: desktop/src-tauri/src/ui_messages.rs
function send_ui_message (line 10) | pub async fn send_ui_message(
type UiMessageHelper (line 21) | pub struct UiMessageHelper {
method new (line 30) | pub fn new(app_handle: AppHandle, app_name: String, window_helper: Win...
method listen (line 40) | pub async fn listen(&mut self, mut receiver: Receiver<UiMessage>) {
method handle_msg (line 87) | fn handle_msg(&mut self, msg: UiMessage) {
type UiMessage (line 107) | pub enum UiMessage {
type ShowToastMsg (line 121) | pub struct ShowToastMsg {
method new (line 128) | pub fn new(title: String, message: String, status: ToastStatus) -> Self {
type ToastStatus (line 141) | pub enum ToastStatus {
type OpenWorkspaceMsg (line 151) | pub struct OpenWorkspaceMsg {
method empty (line 262) | pub fn empty() -> OpenWorkspaceMsg {
method with_id (line 270) | pub fn with_id(id: String) -> OpenWorkspaceMsg {
type OpenProInstanceMsg (line 162) | pub struct OpenProInstanceMsg {
type ImportWorkspaceMsg (line 168) | pub struct ImportWorkspaceMsg {
method deserialize (line 177) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type SetupProMsg (line 211) | pub struct SetupProMsg {
method deserialize (line 219) | fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
type LoginRequiredMsg (line 282) | pub struct LoginRequiredMsg {
FILE: desktop/src-tauri/src/ui_ready.rs
function ui_ready (line 6) | pub async fn ui_ready(state: tauri::State<'_, AppState>) -> Result<(), D...
FILE: desktop/src-tauri/src/updates.rs
constant UPDATE_POLL_INTERVAL (line 17) | const UPDATE_POLL_INTERVAL: std::time::Duration = std::time::Duration::f...
constant RELEASES_URL (line 18) | const RELEASES_URL: &str = "https://update-server.devpod.sh/releases";
constant FALLBACK_RELEASES_URL (line 19) | const FALLBACK_RELEASES_URL: &str = "https://api.github.com/repos/loft-s...
type UpdateError (line 22) | pub enum UpdateError {
method serialize (line 31) | fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
type Releases (line 39) | pub type Releases = Vec<Release>;
type Release (line 44) | pub struct Release {
method is_pre (line 66) | pub fn is_pre(&self) -> bool {
method trim_pre (line 73) | pub fn trim_pre(&self) -> String {
type Asset (line 85) | pub struct Asset {
type Author (line 104) | pub struct Author {
function get_pending_update (line 127) | pub async fn get_pending_update(state: tauri::State<'_, AppState>) -> Re...
function check_updates (line 133) | pub async fn check_updates(app_handle: AppHandle) -> Result<bool, Update...
type UpdateHelper (line 153) | pub struct UpdateHelper<'a> {
function new (line 158) | pub fn new(app_handle: &'a AppHandle) -> Self {
function poll (line 164) | pub async fn poll(&self) {
function update_app_releases (line 251) | pub async fn update_app_releases(&self, new_version: &str) -> Result<Rel...
function fetch_releases_from_url (line 269) | pub async fn fetch_releases_from_url(&self, url: &str) -> anyhow::Result...
function fetch_releases (line 296) | pub async fn fetch_releases(&self) -> anyhow::Result<Releases> {
function notify_update_available (line 335) | async fn notify_update_available(&self, release: &Release) -> anyhow::Re...
FILE: desktop/src-tauri/src/util.rs
constant QUIT_EXIT_CODE (line 6) | pub const QUIT_EXIT_CODE: i32 = 1337;
function measure (line 10) | pub fn measure<F>(f: F) -> Duration
function kill_child_processes (line 21) | pub fn kill_child_processes(parent_pid: u32) {
function kill_process (line 110) | pub fn kill_process(pid: u32) {
FILE: desktop/src-tauri/src/window.rs
type WindowHelper (line 7) | pub struct WindowHelper {
method new (line 12) | pub fn new(app_handle: AppHandle) -> Self {
method setup (line 16) | pub fn setup(&self, window: &WebviewWindow<Wry>) {
method new_main (line 36) | pub fn new_main(&self, app_name: String) -> Result<()> {
method new_update_ready_window (line 70) | pub fn new_update_ready_window(&self) -> Result<()> {
method get_current_application (line 115) | unsafe fn get_current_application() -> cocoa::base::id {
method is_current_app_active (line 119) | unsafe fn is_current_app_active() -> bool {
method set_dock_icon_visibility (line 136) | pub fn set_dock_icon_visibility(&self, visible: bool) {
method set_default_app_icon (line 196) | fn set_default_app_icon(&self) {
method set_activation_policy (line 212) | fn set_activation_policy(act_pol: ActivationPolicy) {
method get_activation_policy (line 227) | pub fn get_activation_policy() -> ActivationPolicy {
type TransformState (line 242) | enum TransformState {
constant K_CURRENT_PROCESS (line 250) | const K_CURRENT_PROCESS: u32 = 2;
type ProcessSerialNumber (line 256) | pub struct ProcessSerialNumber {
function TransformProcessType (line 264) | fn TransformProcessType(psn: *const ProcessSerialNumber, transformState:...
FILE: desktop/src/App/App.tsx
function App (line 18) | function App() {
function ErrorPage (line 51) | function ErrorPage() {
function usePartyParrot (line 72) | function usePartyParrot() {
FILE: desktop/src/App/Changelog.tsx
type TLinkClickEvent (line 5) | type TLinkClickEvent = React.MouseEvent<HTMLLinkElement> & { target: HTM...
type TChangeLogProps (line 6) | type TChangeLogProps = Readonly<{ rawMarkdown: string }>
function Changelog (line 8) | function Changelog({ rawMarkdown }: TChangeLogProps) {
FILE: desktop/src/App/OSSApp.tsx
function OSSApp (line 38) | function OSSApp() {
type TTitleBarProps (line 213) | type TTitleBarProps = Readonly<{
function TitleBar (line 216) | function TitleBar({ showTitle = true }: TTitleBarProps) {
function useProviderUpdates (line 239) | function useProviderUpdates() {
FILE: desktop/src/App/ProApp.tsx
function ProApp (line 45) | function ProApp() {
type TProAppContentProps (line 68) | type TProAppContentProps = Readonly<{ host: string }>
function ProAppContent (line 69) | function ProAppContent({ host }: TProAppContentProps) {
function usePlatformVersion (line 168) | function usePlatformVersion(): TPlatformVersionInfo | undefined {
type TConnectionStatusProps (line 181) | type TConnectionStatusProps = Readonly<{
function ConnectionStatus (line 184) | function ConnectionStatus({ status }: TConnectionStatusProps) {
type TProfileMenuProps (line 221) | type TProfileMenuProps = Readonly<{
function UserMenu (line 225) | function UserMenu({ host, self }: TProfileMenuProps) {
type TUserLinkButton (line 284) | type TUserLinkButton = Readonly<{ children: ReactNode; to: To; icon: Rea...
function UserLinkButton (line 285) | function UserLinkButton({ children, to, icon }: TUserLinkButton) {
FILE: desktop/src/App/useAppReady.tsx
function useAppReady (line 34) | function useAppReady() {
function useErrorModal (line 442) | function useErrorModal() {
function findProInstance (line 477) | async function findProInstance(providerName: string): Promise<TProInstan...
FILE: desktop/src/App/useChangelogModal.tsx
constant LAST_INSTALLED_VERSION_KEY (line 18) | const LAST_INSTALLED_VERSION_KEY = "devpod-last-installed-version"
function useChangelogModal (line 20) | function useChangelogModal(isReady: boolean) {
FILE: desktop/src/App/usePreserveLocation.tsx
constant LOCATION_KEY (line 7) | const LOCATION_KEY = "location"
constant CURRENT_LOCATION_KEY (line 8) | const CURRENT_LOCATION_KEY = "current"
type TLocationStore (line 9) | type TLocationStore = { [CURRENT_LOCATION_KEY]: Location }
function usePreserveLocation (line 12) | function usePreserveLocation() {
FILE: desktop/src/ProRoot.tsx
function ProRoot (line 3) | function ProRoot() {
FILE: desktop/src/Theme/ThemeProvider.tsx
function ThemeProvider (line 14) | function ThemeProvider({ children }: Readonly<{ children?: ReactNode }>) {
FILE: desktop/src/Theme/button.ts
method primary (line 10) | primary(props) {
method outline (line 31) | outline(props) {
method solid (line 49) | solid(props) {
method ["solid-outline"] (line 86) | ["solid-outline"](props) {
method announcement (line 105) | announcement({ theme }) {
method proWorkspaceIDE (line 123) | proWorkspaceIDE(_props) {
method ghost (line 136) | ghost(props) {
FILE: desktop/src/Theme/text.ts
method muted (line 6) | muted(props) {
FILE: desktop/src/Theme/theme.ts
method decorative (line 21) | decorative(props) {
method muted (line 35) | muted(props) {
method primary (line 38) | primary(props) {
method baseStyle (line 56) | baseStyle(props) {
method global (line 70) | global({ colorMode }) {
FILE: desktop/src/Theme/themeHooks.tsx
function useBorderColor (line 3) | function useBorderColor() {
FILE: desktop/src/client/client.ts
type TChannels (line 28) | type TChannels = {
type TChannelName (line 69) | type TChannelName = keyof TChannels
type TClientEventListener (line 70) | type TClientEventListener<TChannel extends TChannelName> = (payload: TCh...
type TClientSettings (line 71) | type TClientSettings = Pick<
type TPlatform (line 82) | type TPlatform = Awaited<ReturnType<typeof os.platform>>
type TArch (line 83) | type TArch = Awaited<ReturnType<typeof os.arch>>
class Client (line 85) | class Client {
method setSetting (line 92) | public setSetting<TSettingName extends keyof TClientSettings>(
method ready (line 126) | public ready(): Promise<void> {
method subscribe (line 130) | public async subscribe<T extends TChannelName>(
method emitEvent (line 148) | public emitEvent<T extends TChannelName>(e: TChannels[T]) {
method fetchPlatform (line 152) | public fetchPlatform(): TPlatform {
method pathSeparator (line 156) | public pathSeparator(): string {
method fetchArch (line 160) | public fetchArch(): TArch {
method fetchVersion (line 164) | public fetchVersion(): Promise<string> {
method fetchCommunityContributions (line 168) | public async fetchCommunityContributions(): Promise<Result<TCommunityC...
method fetchReleases (line 187) | public async fetchReleases(): Promise<Result<readonly Release[]>> {
method getDir (line 213) | public async getDir(
method openDir (line 232) | public async openDir(
method selectFromDir (line 247) | public async selectFromDir(title?: string): Promise<string | null> {
method selectFileYaml (line 251) | public async selectFileYaml(): Promise<string | string[] | null> {
method selectFile (line 259) | public async selectFile(defaultPath?: string): Promise<string | string...
method copyFile (line 263) | public async copyFile(src: string, dest: string): Promise<void> {
method copyFilePaths (line 267) | public async copyFilePaths(src: string[], dest: string[]) {
method writeTextFile (line 271) | public async writeTextFile(targetPath: string[], data: string) {
method readFile (line 275) | public async readFile(targetPath: string[]) {
method readTextFile (line 279) | public async readTextFile(targetPath: string[]) {
method writeFile (line 283) | public async writeFile(targetPath: string[], data: Uint8Array) {
method installCLI (line 287) | public async installCLI(force: boolean = false): Promise<Result<void>> {
method getEnv (line 305) | public async getEnv(name: string): Promise<boolean> {
method isCLIInstalled (line 309) | public async isCLIInstalled(): Promise<Result<boolean>> {
method open (line 335) | public open(link: string): void {
method quit (line 339) | public async quit(): Promise<Result<void>> {
method writeToClipboard (line 349) | public async writeToClipboard(data: string): Promise<Result<void>> {
method checkUpdates (line 359) | public async checkUpdates(): Promise<Result<boolean>> {
method fetchPendingUpdate (line 369) | public async fetchPendingUpdate(): Promise<Result<Release>> {
method installUpdate (line 379) | public async installUpdate(): Promise<Result<void>> {
method restart (line 394) | public async restart(): Promise<void> {
method closeCurrentWindow (line 397) | public async closeCurrentWindow(): Promise<void> {
method getSystemTheme (line 401) | public async getSystemTheme(): Promise<TauriTheme | null> {
method log (line 405) | public log(level: "debug" | "info" | "warn" | "error", message: string) {
method getProClient (line 410) | public getProClient(proInstance: TProInstance): ProClient | DaemonClie...
FILE: desktop/src/client/command.ts
type TStreamEventListenerFn (line 14) | type TStreamEventListenerFn = (event: TStreamEvent) => void
type TEventListener (line 15) | type TEventListener<TEventName extends string> = Parameters<
type TStreamOptions (line 18) | type TStreamOptions = Readonly<{
type TCommand (line 27) | type TCommand<T> = {
class Command (line 33) | class Command implements TCommand<ChildProcess<string>> {
method constructor (line 46) | constructor(args: string[]) {
method getEnv (line 79) | public async getEnv(name: string): Promise<boolean> {
method run (line 83) | public async run(): Promise<Result<ChildProcess<string>>> {
method stream (line 104) | public async stream(
method cancel (line 195) | public async cancel(): Promise<Result<undefined>> {
function isOk (line 232) | function isOk(result: ChildProcess<string>): boolean {
function toFlagArg (line 236) | function toFlagArg(flag: string, arg: string) {
function serializeRawOptions (line 240) | function serializeRawOptions(
function recordToCSV (line 247) | function recordToCSV(record: Record<string, string>): string {
FILE: desktop/src/client/commandCache.ts
type TCommandCacheInfo (line 7) | type TCommandCacheInfo = Readonly<{ id: string; actionName: TActionName }>
type TCommandCacheID (line 8) | type TCommandCacheID = `${string}:${TActionName}`
type TCommandHandler (line 9) | type TCommandHandler = Readonly<{
type TCommandCacheStore (line 14) | type TCommandCacheStore = Map<TCommandCacheID, TCommandHandler>
class CommandCache (line 16) | class CommandCache {
method getCacheID (line 19) | private getCacheID(info: TCommandCacheInfo): TCommandCacheID {
method get (line 23) | public get(info: TCommandCacheInfo): TCommandHandler | undefined {
method findCommandHandlerById (line 29) | public findCommandHandlerById(id: string) {
method clear (line 41) | public clear(info: TCommandCacheInfo) {
method connect (line 46) | public connect<T>(
FILE: desktop/src/client/constants.ts
constant DEVPOD_GIT_REPOSITORY (line 1) | const DEVPOD_GIT_REPOSITORY = "https://github.com/loft-sh/devpod"
constant DEFAULT_STATIC_COMMAND_CONFIG (line 3) | const DEFAULT_STATIC_COMMAND_CONFIG = {
constant WORKSPACE_COMMAND_ADDITIONAL_FLAGS_KEY (line 8) | const WORKSPACE_COMMAND_ADDITIONAL_FLAGS_KEY = "additionalFlags"
constant DEVPOD_BINARY (line 10) | const DEVPOD_BINARY = "bin/devpod-cli"
constant DEVPOD_COMMAND_LIST (line 11) | const DEVPOD_COMMAND_LIST = "list"
constant DEVPOD_COMMAND_STATUS (line 12) | const DEVPOD_COMMAND_STATUS = "status"
constant DEVPOD_COMMAND_UP (line 13) | const DEVPOD_COMMAND_UP = "up"
constant DEVPOD_COMMAND_STOP (line 14) | const DEVPOD_COMMAND_STOP = "stop"
constant DEVPOD_COMMAND_BUILD (line 15) | const DEVPOD_COMMAND_BUILD = "build"
constant DEVPOD_COMMAND_DELETE (line 16) | const DEVPOD_COMMAND_DELETE = "delete"
constant DEVPOD_COMMAND_PROVIDER (line 17) | const DEVPOD_COMMAND_PROVIDER = "provider"
constant DEVPOD_COMMAND_IDE (line 18) | const DEVPOD_COMMAND_IDE = "ide"
constant DEVPOD_COMMAND_PRO (line 19) | const DEVPOD_COMMAND_PRO = "pro"
constant DEVPOD_COMMAND_OPTIONS (line 20) | const DEVPOD_COMMAND_OPTIONS = "options"
constant DEVPOD_COMMAND_SET_OPTIONS (line 21) | const DEVPOD_COMMAND_SET_OPTIONS = "set-options"
constant DEVPOD_COMMAND_USE (line 22) | const DEVPOD_COMMAND_USE = "use"
constant DEVPOD_COMMAND_ADD (line 23) | const DEVPOD_COMMAND_ADD = "add"
constant DEVPOD_COMMAND_HELPER (line 24) | const DEVPOD_COMMAND_HELPER = "helper"
constant DEVPOD_COMMAND_UPDATE (line 25) | const DEVPOD_COMMAND_UPDATE = "update"
constant DEVPOD_COMMAND_CONTEXT (line 26) | const DEVPOD_COMMAND_CONTEXT = "context"
constant DEVPOD_COMMAND_LOGIN (line 27) | const DEVPOD_COMMAND_LOGIN = "login"
constant DEVPOD_COMMAND_IMPORT_WORKSPACE (line 28) | const DEVPOD_COMMAND_IMPORT_WORKSPACE = "import-workspace"
constant DEVPOD_COMMAND_GET_WORKSPACE_NAME (line 29) | const DEVPOD_COMMAND_GET_WORKSPACE_NAME = "get-workspace-name"
constant DEVPOD_COMMAND_GET_WORKSPACE_UID (line 30) | const DEVPOD_COMMAND_GET_WORKSPACE_UID = "get-workspace-uid"
constant DEVPOD_COMMAND_GET_WORKSPACE_CONFIG (line 31) | const DEVPOD_COMMAND_GET_WORKSPACE_CONFIG = "get-workspace-config"
constant DEVPOD_COMMAND_GET_PROVIDER_NAME (line 32) | const DEVPOD_COMMAND_GET_PROVIDER_NAME = "get-provider-name"
constant DEVPOD_COMMAND_GET_PRO_NAME (line 33) | const DEVPOD_COMMAND_GET_PRO_NAME = "get-pro-name"
constant DEVPOD_COMMAND_CHECK_PROVIDER_UPDATE (line 34) | const DEVPOD_COMMAND_CHECK_PROVIDER_UPDATE = "check-provider-update"
constant DEVPOD_COMMAND_TROUBLESHOOT (line 35) | const DEVPOD_COMMAND_TROUBLESHOOT = "troubleshoot"
constant DEVPOD_FLAG_JSON_LOG_OUTPUT (line 36) | const DEVPOD_FLAG_JSON_LOG_OUTPUT = "--log-output=json"
constant DEVPOD_FLAG_JSON_OUTPUT (line 37) | const DEVPOD_FLAG_JSON_OUTPUT = "--output=json"
constant DEVPOD_FLAG_OPTION (line 38) | const DEVPOD_FLAG_OPTION = "--option"
constant DEVPOD_FLAG_FORCE (line 39) | const DEVPOD_FLAG_FORCE = "--force"
constant DEVPOD_FLAG_FORCE_BUILD (line 40) | const DEVPOD_FLAG_FORCE_BUILD = "--force-build"
constant DEVPOD_FLAG_RECREATE (line 41) | const DEVPOD_FLAG_RECREATE = "--recreate"
constant DEVPOD_FLAG_RESET (line 42) | const DEVPOD_FLAG_RESET = "--reset"
constant DEVPOD_FLAG_IDE (line 43) | const DEVPOD_FLAG_IDE = "--ide"
constant DEVPOD_FLAG_PROVIDER (line 44) | const DEVPOD_FLAG_PROVIDER = "--provider"
constant DEVPOD_FLAG_PROVIDER_OPTION (line 45) | const DEVPOD_FLAG_PROVIDER_OPTION = "--provider-option"
constant DEVPOD_FLAG_ACCESS_KEY (line 46) | const DEVPOD_FLAG_ACCESS_KEY = "--access-key"
constant DEVPOD_FLAG_PREBUILD_REPOSITORY (line 47) | const DEVPOD_FLAG_PREBUILD_REPOSITORY = "--prebuild-repository"
constant DEVPOD_FLAG_ID (line 48) | const DEVPOD_FLAG_ID = "--id"
constant DEVPOD_FLAG_SOURCE (line 49) | const DEVPOD_FLAG_SOURCE = "--source"
constant DEVPOD_FLAG_DEBUG (line 50) | const DEVPOD_FLAG_DEBUG = "--debug"
constant DEVPOD_FLAG_USE (line 51) | const DEVPOD_FLAG_USE = "--use"
constant DEVPOD_FLAG_NAME (line 52) | const DEVPOD_FLAG_NAME = "--name"
constant DEVPOD_FLAG_SINGLE_MACHINE (line 53) | const DEVPOD_FLAG_SINGLE_MACHINE = "--single-machine"
constant DEVPOD_FLAG_DRY (line 54) | const DEVPOD_FLAG_DRY = "--dry"
constant DEVPOD_FLAG_RECONFIGURE (line 55) | const DEVPOD_FLAG_RECONFIGURE = "--reconfigure"
constant DEVPOD_FLAG_SKIP_REQUIRED (line 56) | const DEVPOD_FLAG_SKIP_REQUIRED = "--skip-required"
constant DEVPOD_FLAG_TIMEOUT (line 57) | const DEVPOD_FLAG_TIMEOUT = "--timeout"
constant DEVPOD_FLAG_DEVCONTAINER_PATH (line 58) | const DEVPOD_FLAG_DEVCONTAINER_PATH = "--devcontainer-path"
constant DEVPOD_FLAG_WORKSPACE_ID (line 59) | const DEVPOD_FLAG_WORKSPACE_ID = "--workspace-id"
constant DEVPOD_FLAG_WORKSPACE_UID (line 60) | const DEVPOD_FLAG_WORKSPACE_UID = "--workspace-uid"
constant DEVPOD_FLAG_WORKSPACE_PROJECT (line 61) | const DEVPOD_FLAG_WORKSPACE_PROJECT = "--workspace-project"
constant DEVPOD_FLAG_LOGIN (line 62) | const DEVPOD_FLAG_LOGIN = "--login"
constant DEVPOD_FLAG_HOST (line 63) | const DEVPOD_FLAG_HOST = "--host"
constant DEVPOD_FLAG_INSTANCE (line 64) | const DEVPOD_FLAG_INSTANCE = "--instance"
constant DEVPOD_FLAG_PROJECT (line 65) | const DEVPOD_FLAG_PROJECT = "--project"
constant DEVPOD_FLAG_SKIP_PRO (line 66) | const DEVPOD_FLAG_SKIP_PRO = "--skip-pro"
constant DEVPOD_FLAG_DOTFILES (line 67) | const DEVPOD_FLAG_DOTFILES = "--dotfiles"
constant DEVPOD_FLAG_GIT_SIGNING_KEY (line 68) | const DEVPOD_FLAG_GIT_SIGNING_KEY = "--git-ssh-signing-key"
constant DEVPOD_FLAG_FORCE_BROWSER (line 69) | const DEVPOD_FLAG_FORCE_BROWSER = "--force-browser"
constant DEVPOD_UI_ENV_VAR (line 71) | const DEVPOD_UI_ENV_VAR = "DEVPOD_UI"
constant DEVPOD_ADDITIONAL_ENV_VARS (line 72) | const DEVPOD_ADDITIONAL_ENV_VARS = "DEVPOD_ADDITIONAL_ENV_VARS"
FILE: desktop/src/client/context/client.ts
class ContextClient (line 6) | class ContextClient implements TDebuggable {
method constructor (line 7) | constructor() {}
method setDebug (line 9) | public setDebug(isEnabled: boolean): void {
method setOption (line 13) | public async setOption(option: TContextOptionName, value: string): Pro...
method listOptions (line 17) | public async listOptions(): Promise<Result<TContextOptions>> {
FILE: desktop/src/client/context/contextCommands.ts
class ContextCommands (line 13) | class ContextCommands {
method newCommand (line 16) | private static newCommand(args: string[]): Command {
method SetOptions (line 20) | static async SetOptions(
method ListOptions (line 41) | static async ListOptions(): Promise<Result<TContextOptions>> {
FILE: desktop/src/client/ides/client.ts
class IDEsClient (line 6) | class IDEsClient implements TDebuggable {
method constructor (line 7) | constructor() {}
method setDebug (line 9) | public setDebug(isEnabled: boolean): void {
method useIDE (line 13) | public async useIDE(ide: string): Promise<ResultError> {
method listAll (line 17) | public async listAll(): Promise<Result<TIDEs>> {
FILE: desktop/src/client/ides/ideCommands.ts
class IDECommands (line 13) | class IDECommands {
method newCommand (line 16) | private static newCommand(args: string[]): Command {
method UseIDE (line 20) | static async UseIDE(ide: string): Promise<ResultError> {
method ListIDEs (line 38) | static async ListIDEs(): Promise<Result<TIDEs>> {
FILE: desktop/src/client/pro/client.ts
class ProClient (line 25) | class ProClient implements TDebuggable {
method constructor (line 26) | constructor(protected readonly id: string) {}
method setDebug (line 28) | public setDebug(isEnabled: boolean): void {
method login (line 32) | public async login(
method checkHealth (line 40) | public async checkHealth(): Promise<Result<TPlatformHealthCheck>> {
method getVersion (line 44) | public async getVersion() {
method checkUpdate (line 48) | public async checkUpdate() {
method update (line 52) | public async update(version: string) {
method listProInstances (line 56) | public async listProInstances(
method removeProInstance (line 62) | public async removeProInstance(id: TProID) {
method importWorkspace (line 66) | public async importWorkspace(config: TImportWorkspaceConfig): Promise<...
method watchWorkspacesProxy (line 70) | public watchWorkspacesProxy(
method listProjects (line 101) | public async listProjects(): Promise<Result<readonly ManagementV1Proje...
method getSelf (line 105) | public async getSelf(): Promise<Result<ManagementV1Self>> {
method getProjectTemplates (line 109) | public async getProjectTemplates(
method getProjectClusters (line 115) | public async getProjectClusters(
method createWorkspace (line 121) | public async createWorkspace(
method updateWorkspace (line 127) | public async updateWorkspace(
class DaemonClient (line 134) | class DaemonClient extends ProClient {
method constructor (line 135) | constructor(id: string) {
method setDebug (line 139) | public setDebug(isEnabled: boolean): void {
method login (line 143) | public async login(
method handleError (line 151) | private handleError<T>(err: unknown, fallbackMsg: string): Result<T> {
method getProxy (line 163) | private async getProxy<T>(path: string): Promise<Result<T>> {
method get (line 189) | private async get<T>(path: string): Promise<Result<T>> {
method post (line 208) | private async post<T>(path: string, body: BodyInit): Promise<Result<T>> {
method restartDaemon (line 228) | public async restartDaemon() {
method checkHealth (line 232) | public async checkHealth(): Promise<Result<TPlatformHealthCheck>> {
method watchWorkspaces (line 260) | public watchWorkspaces(
method getSelf (line 270) | public async getSelf(): Promise<Result<ManagementV1Self>> {
method getUserProfile (line 274) | public async getUserProfile(): Promise<Result<ManagementV1UserProfile>> {
method updateUserProfile (line 278) | public async updateUserProfile(
method listProjects (line 291) | public async listProjects(): Promise<Result<readonly ManagementV1Proje...
method getVersion (line 295) | public async getVersion() {
method getProjectTemplates (line 299) | public async getProjectTemplates(
method getProjectClusters (line 305) | public async getProjectClusters(
method createWorkspace (line 311) | public async createWorkspace(
method updateWorkspace (line 323) | public async updateWorkspace(
method queryGitCredentialsHelper (line 335) | public async queryGitCredentialsHelper(
method checkUpdate (line 343) | public async checkUpdate() {
method update (line 348) | public async update(_version: string) {
type TWorksaceListener (line 352) | type TWorksaceListener = (newWorkspaces: readonly ProWorkspaceInstance[]...
class WorkspaceWatcher (line 354) | class WorkspaceWatcher {
method constructor (line 359) | constructor(
method cancel (line 366) | public cancel() {
method watch (line 379) | public watch(): () => void {
method read (line 417) | private async read(): Promise<unknown> {
method handleError (line 462) | private handleError<T>(err: unknown, fallbackMsg: string): Result<T> {
FILE: desktop/src/client/pro/proCommands.ts
class ProCommands (line 39) | class ProCommands {
method newCommand (line 42) | private static newCommand(args: string[]): Command {
method Login (line 46) | static async Login(
method ListProInstances (line 79) | static async ListProInstances(
method RemoveProInstance (line 102) | static async RemoveProInstance(id: TProID) {
method ImportWorkspace (line 120) | static async ImportWorkspace(config: TImportWorkspaceConfig): Promise<...
method WatchWorkspaces (line 146) | static WatchWorkspaces(id: TProID, projectName: string) {
method ListProjects (line 154) | static async ListProjects(id: TProID) {
method GetSelf (line 169) | static async GetSelf(id: TProID) {
method ListTemplates (line 184) | static async ListTemplates(id: TProID, projectName: string) {
method ListClusters (line 200) | static async ListClusters(id: TProID, projectName: string) {
method CreateWorkspace (line 216) | static async CreateWorkspace(id: TProID, instance: ManagementV1DevPodW...
method UpdateWorkspace (line 232) | static async UpdateWorkspace(id: TProID, instance: ManagementV1DevPodW...
method CheckHealth (line 248) | static async CheckHealth(id: TProID) {
method GetVersion (line 263) | static async GetVersion(id: TProID) {
method CheckUpdate (line 278) | static async CheckUpdate(id: TProID) {
method Update (line 293) | static async Update(id: TProID, version: string) {
FILE: desktop/src/client/providers/client.ts
constant PROVIDERS_STORE_FILE_NAME (line 17) | const PROVIDERS_STORE_FILE_NAME = "providers"
constant PROVIDERS_STORE_DANGLING_PROVIDER_KEY (line 18) | const PROVIDERS_STORE_DANGLING_PROVIDER_KEY = "danglingProviders"
type TProviderStore (line 20) | type TProviderStore = Readonly<{ [PROVIDERS_STORE_DANGLING_PROVIDER_KEY]...
class ProvidersClient (line 22) | class ProvidersClient implements TDebuggable {
method constructor (line 30) | constructor() {}
method setDebug (line 32) | public setDebug(isEnabled: boolean): void {
method listAll (line 36) | public async listAll(): Promise<Result<TProviders>> {
method newID (line 40) | public async newID(rawSource: string): Promise<Result<string>> {
method checkUpdate (line 44) | public async checkUpdate(id: TProviderID): Promise<Result<TCheckProvid...
method update (line 48) | public async update(id: TProviderID, source: TProviderSource): Promise...
method add (line 52) | public async add(rawSource: TProviderID, config: TAddProviderConfig): ...
method remove (line 56) | public async remove(id: TProviderID): Promise<ResultError> {
method getOptions (line 60) | public async getOptions(id: TProviderID): Promise<Result<TProviderOpti...
method useProvider (line 64) | public async useProvider(id: TProviderID): Promise<ResultError> {
method setOptionsDry (line 68) | public async setOptionsDry(
method configure (line 75) | public async configure(
method setDangling (line 91) | public setDangling(id: TProviderID): void {
method popAllDangling (line 99) | public popAllDangling(): readonly TProviderID[] {
method popDangling (line 109) | public popDangling(): TProviderID | undefined {
FILE: desktop/src/client/providers/providerCommands.ts
class ProviderCommands (line 32) | class ProviderCommands {
method newCommand (line 35) | private static newCommand(args: string[]): Command {
method ListProviders (line 39) | static async ListProviders(): Promise<Result<TProviders>> {
method GetProviderID (line 63) | static async GetProviderID(source: string) {
method AddProvider (line 81) | static async AddProvider(
method RemoveProvider (line 108) | static async RemoveProvider(id: TProviderID) {
method UseProvider (line 126) | static async UseProvider(
method SetProviderOptions (line 154) | static async SetProviderOptions(
method GetProviderOptions (line 189) | static async GetProviderOptions(id: TProviderID) {
method CheckProviderUpdate (line 208) | static async CheckProviderUpdate(id: TProviderID) {
method UpdateProvider (line 225) | static async UpdateProvider(id: TProviderID, source: TProviderSource) {
FILE: desktop/src/client/tauriClient/index.ts
constant TAURI_SERVER_URL (line 1) | const TAURI_SERVER_URL = "http://localhost:25842"
FILE: desktop/src/client/types.ts
type TDebuggable (line 3) | type TDebuggable = Readonly<{ setDebug(isEnabled: boolean): void }>
type TStreamEvent (line 4) | type TStreamEvent = Readonly<
type TStreamEventListenerFn (line 7) | type TStreamEventListenerFn = (event: TStreamEvent) => void
FILE: desktop/src/client/workspaces/client.ts
type TWorkspaceClientContext (line 26) | type TWorkspaceClientContext = Readonly<{
class WorkspacesClient (line 32) | class WorkspacesClient implements TDebuggable {
method constructor (line 35) | constructor() {}
method createStreamHandler (line 37) | private createStreamHandler(
method writeEvent (line 50) | private async writeEvent(actionID: TActionID, event: TStreamEvent) {
method execActionCmd (line 55) | private async execActionCmd<T>(
method setDebug (line 95) | public setDebug(isEnabled: boolean): void {
method setDotfilesFlag (line 99) | public setDotfilesFlag(dotfilesUrl: string): void {
method setAdditionalFlags (line 106) | public setAdditionalFlags(additionalFlags: string): void {
method setSSHKeyPath (line 110) | public setSSHKeyPath(sshKeyPath: string): void {
method listAll (line 117) | public async listAll(
method getStatus (line 123) | public async getStatus(id: TWorkspaceID): Promise<Result<TWorkspace["s...
method newID (line 134) | public async newID(rawSource: string): Promise<Result<string>> {
method newUID (line 138) | public async newUID(): Promise<Result<string>> {
method start (line 142) | public async start(
method stop (line 156) | public async stop(
method rebuild (line 169) | public async rebuild(
method troubleshoot (line 182) | public async troubleshoot(ctx: TWorkspaceClientContext) {
method reset (line 188) | public async reset(
method remove (line 201) | public async remove(
method checkStatus (line 215) | public async checkStatus(
method checkDevcontainerSetup (line 228) | public async checkDevcontainerSetup(rawSource: string): Promise<Result...
method subscribe (line 243) | public subscribe(
method replayAction (line 263) | public replayAction(actionID: TActionID, listener: TStreamEventListene...
method cancelAction (line 291) | public async cancelAction(actionID: TActionID): Promise<ResultError> {
method getActionLogFile (line 297) | public async getActionLogFile(actionID: TActionID): Promise<Result<str...
FILE: desktop/src/client/workspaces/workspaceCommands.ts
type TRawWorkspaces (line 39) | type TRawWorkspaces = readonly (Omit<TWorkspace, "status" | "id"> &
class WorkspaceCommands (line 42) | class WorkspaceCommands {
method newCommand (line 46) | private static newCommand(args: string[]): Command {
method ListWorkspaces (line 55) | static async ListWorkspaces(skipPro: boolean): Promise<Result<TWorkspa...
method FetchWorkspaceStatus (line 76) | static async FetchWorkspaceStatus(
method GetWorkspaceID (line 93) | static async GetWorkspaceID(source: string) {
method GetWorkspaceUID (line 110) | static async GetWorkspaceUID() {
method GetStatusLogs (line 126) | static GetStatusLogs(id: string) {
method StartWorkspace (line 130) | static StartWorkspace(id: TWorkspaceID, config: TWorkspaceStartConfig) {
method StopWorkspace (line 188) | static StopWorkspace(id: TWorkspaceID) {
method RebuildWorkspace (line 192) | static RebuildWorkspace(id: TWorkspaceID) {
method ResetWorkspace (line 201) | static ResetWorkspace(id: TWorkspaceID) {
method TroubleshootWorkspace (line 210) | static TroubleshootWorkspace(id: TWorkspaceID) {
method RemoveWorkspace (line 214) | static RemoveWorkspace(id: TWorkspaceID, force?: boolean) {
method GetDevcontainerConfig (line 223) | static GetDevcontainerConfig(rawSource: string) {
FILE: desktop/src/components/Animation/Ripple.tsx
function Ripple (line 10) | function Ripple(props: IconProps) {
FILE: desktop/src/components/AutoComplete/AutoComplete.tsx
type TAutoCompleteOption (line 15) | type TAutoCompleteOption = Readonly<{
type TAutoCompleteProps (line 19) | type TAutoCompleteProps = Readonly<{
function handleInputFocused (line 68) | function handleInputFocused(isOpen: boolean) {
function Option (line 144) | function Option({ option }: { option: TAutoCompleteOption }) {
FILE: desktop/src/components/BottomActionBar/BottomActionBar.tsx
type TModalBottomBarProps (line 19) | type TModalBottomBarProps = Readonly<{
function BottomActionBar (line 29) | function BottomActionBar({
type TBottomActionBarErrorProps (line 97) | type TBottomActionBarErrorProps = Readonly<{
function BottomActionBarError (line 101) | function BottomActionBarError({ error, containerRef }: TBottomActionBarE...
function useErrorDimensions (line 138) | function useErrorDimensions(
FILE: desktop/src/components/CardHeader/WorkspaceCardHeader.tsx
type TWorkspaceCardHeaderProps (line 10) | type TWorkspaceCardHeaderProps = Readonly<{
function WorkspaceCardHeader (line 20) | function WorkspaceCardHeader({
type TProviderProps (line 70) | type TProviderProps = Readonly<{ name: string | undefined }>
function Provider (line 71) | function Provider({ name }: TProviderProps) {
type TIDEProps (line 91) | type TIDEProps = Readonly<{ name: string }>
function IDE (line 92) | function IDE({ name }: TIDEProps) {
type TLastUsedProps (line 99) | type TLastUsedProps = Readonly<{ timestamp: string }>
function LastUsed (line 100) | function LastUsed({ timestamp }: TLastUsedProps) {
FILE: desktop/src/components/DeleteWorkspacesModal/DeleteWorkspacesModal.tsx
function DeleteWorkspacesModal (line 16) | function DeleteWorkspacesModal({
FILE: desktop/src/components/Error/ErrorMessageBox.tsx
type TErrorMessageBox (line 4) | type TErrorMessageBox = Readonly<{ error: Error }> & BoxProps
function ErrorMessageBox (line 5) | function ErrorMessageBox({ error, ...boxProps }: TErrorMessageBox) {
FILE: desktop/src/components/ExampleCard.tsx
type TExampleCardProps (line 14) | type TExampleCardProps = {
FILE: desktop/src/components/Form/Form.tsx
type TFormProps (line 3) | type TFormProps = Readonly<{
FILE: desktop/src/components/IDEGroup/IDEGroup.tsx
function IDEGroup (line 18) | function IDEGroup({
function IDEItem (line 66) | function IDEItem({
FILE: desktop/src/components/IDEIcon/IDEIcon.tsx
constant SIZES (line 42) | const SIZES: Record<NonNullable<TIDEIconProps["size"]>, IconProps> = {
constant IDE_ICONS (line 53) | const IDE_ICONS: Record<string, string> = {
type TIDEIconProps (line 80) | type TIDEIconProps = Readonly<{ ide: TIDE; size?: "sm" | "md" }> & BoxProps
function IDEIcon (line 81) | function IDEIcon({ ide, size = "md", ...boxProps }: TIDEIconProps) {
FILE: desktop/src/components/Layout/NavigationViewLayout.tsx
type TNavigationViewLayoutProps (line 7) | type TNavigationViewLayoutProps = Readonly<{ title: TViewTitle | null; c...
function NavigationViewLayout (line 8) | function NavigationViewLayout({ title, children }: TNavigationViewLayout...
FILE: desktop/src/components/Layout/Notifications.tsx
type TNotificationsProps (line 35) | type TNotificationsProps = Readonly<{
function Notifications (line 41) | function Notifications({
FILE: desktop/src/components/Layout/ProLayout.tsx
type TProLayoutProps (line 9) | type TProLayoutProps = Readonly<{
function ProLayout (line 14) | function ProLayout({ toolbarItems, statusBarItems, children }: TProLayou...
FILE: desktop/src/components/Layout/ProSwitcher.tsx
type TProInstanceWithProvider (line 43) | type TProInstanceWithProvider = TProInstance & Readonly<{ providerConfig...
function ProSwitcher (line 44) | function ProSwitcher() {
type TProPopoverContentProps (line 99) | type TProPopoverContentProps = Readonly<{
function ProPopoverContent (line 106) | function ProPopoverContent({
type TEmptyProInstancesProps (line 241) | type TEmptyProInstancesProps = Readonly<{
function EmptyProInstances (line 244) | function EmptyProInstances({ onConnect }: TEmptyProInstancesProps) {
type TProInstaceRowProps (line 262) | type TProInstaceRowProps = Omit<TProInstance, "host"> &
function ProInstanceRow (line 268) | function ProInstanceRow({
FILE: desktop/src/components/Layout/Sidebar.tsx
type TSidebarProps (line 22) | type TSidebarProps = Readonly<{ children?: readonly ReactElement[] }> & ...
function Sidebar (line 23) | function Sidebar({ children, ...boxProps }: TSidebarProps) {
type TSidebarMenuProps (line 80) | type TSidebarMenuProps = Pick<LinkProps, "to"> &
function SidebarMenuItem (line 82) | function SidebarMenuItem({ to, children, icon: iconProps }: TSidebarMenu...
FILE: desktop/src/components/Layout/StatusBar.tsx
function StatusBar (line 32) | function StatusBar(boxProps: BoxProps) {
function Version (line 46) | function Version() {
function Platform (line 52) | function Platform() {
function Arch (line 58) | function Arch() {
function ZoomMenu (line 64) | function ZoomMenu() {
function GitHubStar (line 98) | function GitHubStar() {
function OSSDocs (line 114) | function OSSDocs() {
function OSSReportIssue (line 130) | function OSSReportIssue() {
function DebugMenu (line 146) | function DebugMenu() {
function useStatusBarIconColor (line 240) | function useStatusBarIconColor() {
FILE: desktop/src/components/Layout/Toolbar.tsx
function Toolbar (line 6) | function Toolbar({ ...boxProps }: BoxProps) {
function Title (line 12) | function Title() {
function Actions (line 18) | function Actions() {
function ToolbarTitle (line 27) | function ToolbarTitle({ children }: Readonly<{ children: ReactNode }>) {
function ToolbarActions (line 37) | function ToolbarActions({ children }: Readonly<{ children: ReactNode }>) {
FILE: desktop/src/components/Layout/types.ts
type TViewTitle (line 3) | type TViewTitle = Readonly<{
FILE: desktop/src/components/ListSelection/ListSelection.tsx
type TSelectionAction (line 6) | type TSelectionAction = {
type TListSelectionProps (line 15) | type TListSelectionProps = {
function ListSelection (line 22) | function ListSelection({
type TWorkspaceListSelectionProps (line 57) | type TWorkspaceListSelectionProps = Omit<TListSelectionProps, "selection...
function WorkspaceListSelection (line 62) | function WorkspaceListSelection({
FILE: desktop/src/components/LoftOSSBadge.tsx
function LoftOSSBadge (line 5) | function LoftOSSBadge() {
FILE: desktop/src/components/Section/CollapsibleSection.tsx
type TCollapsibleSectionProps (line 27) | type TCollapsibleSectionProps = Readonly<{
FILE: desktop/src/components/Steps/Steps.tsx
type TStepContext (line 13) | type TStepContext = Readonly<{
type TStep (line 16) | type TStep = Readonly<{
type TStepsProps (line 22) | type TStepsProps = Readonly<{ onFinish?: VoidFunction; finishText?: stri...
function Steps (line 23) | function Steps({ onFinish, finishText, children }: TStepsProps) {
type TStepProps (line 109) | type TStepProps = Readonly<{ children: ReactNode }>
function Step (line 110) | function Step({ children }: TStepProps) {
FILE: desktop/src/components/Tag/IconTag.tsx
type TIconTagProps (line 4) | type TIconTagProps = Readonly<{
function IconTag (line 12) | function IconTag({ icon: iconProps, label, info, onClick, ...tagProps }:...
FILE: desktop/src/components/Terminal/Terminal.tsx
type TTerminalRef (line 15) | type TTerminalRef = Readonly<{
type TTerminalProps (line 28) | type TTerminalProps = Readonly<{
type TTerminal (line 33) | type TTerminal = TTerminalRef
method clear (line 166) | clear() {
method write (line 169) | write(data) {
method writeln (line 173) | writeln(data) {
method highlight (line 177) | highlight(row: number, startCol: number, len: number, color: string, inv...
method getTerminal (line 204) | getTerminal() {
FILE: desktop/src/components/Terminal/TerminalSearchBar.tsx
type TTerminalSearchBarProps (line 16) | type TTerminalSearchBarProps = {
function TerminalSearchBar (line 26) | function TerminalSearchBar({
function ToggleButton (line 151) | function ToggleButton({
FILE: desktop/src/components/Terminal/useStreamingTerminal.tsx
function useStreamingTerminal (line 9) | function useStreamingTerminal({
function processInputLine (line 100) | function processInputLine(line: string) {
constant ANSI_COLOR (line 113) | const ANSI_COLOR = {
constant ANSI_TEXT (line 133) | const ANSI_TEXT = {
constant LOG_COLORS (line 141) | const LOG_COLORS = {
function formatLine (line 150) | function formatLine({ level, message, time }: TLogOutput) {
FILE: desktop/src/components/Terminal/useTerminalSearch.tsx
type TSearchOptions (line 4) | type TSearchOptions = {
type TSearchResult (line 10) | type TSearchResult = [row: number, col: number, len: number]
type TDisplayLine (line 12) | type TDisplayLine = {
type THighlight (line 20) | type THighlight = {
type TDisplayLineMap (line 31) | type TDisplayLineMap = { [key: number]: TDisplayLine[] }
type TJumpMap (line 34) | type TJumpMap = { [resultIndex: number]: number }
type TSearchState (line 36) | type TSearchState = {
function useTerminalSearch (line 48) | function useTerminalSearch(
function search (line 293) | function search(inputLines: string[], opts: TSearchOptions) {
function generateHighlights (line 318) | function generateHighlights(
function wrapLines (line 355) | function wrapLines(inputLines: string[], cols: number) {
function wrapNumber (line 397) | function wrapNumber(num: number, max: number) {
function escapeRegex (line 404) | function escapeRegex(str: string) {
FILE: desktop/src/components/Warning/WarningMessageBox.tsx
constant SIZES (line 4) | const SIZES = {
constant VARIANTS (line 12) | const VARIANTS = {
type TWarningMessageBoxProps (line 20) | type TWarningMessageBoxProps = Readonly<{
function WarningMessageBox (line 25) | function WarningMessageBox({
FILE: desktop/src/components/WorkspaceOwnerFilter/WorkspaceOwnerFilter.tsx
type TWorkspaceOwnerFilterState (line 12) | type TWorkspaceOwnerFilterState = "self" | "all"
function WorkspaceOwnerFilter (line 14) | function WorkspaceOwnerFilter({
FILE: desktop/src/components/WorkspaceSorter/WorkspaceSorter.tsx
function WorkspaceSorter (line 13) | function WorkspaceSorter({
FILE: desktop/src/components/WorkspaceStatusFilter/WorkspaceStatusFilter.tsx
type TWorkspaceStatusFilterState (line 20) | type TWorkspaceStatusFilterState = string[] | "all"
function WorkspaceStatusFilter (line 22) | function WorkspaceStatusFilter({
function getCurrentFilterCount (line 99) | function getCurrentFilterCount(filter: TWorkspaceStatusFilterState, tota...
FILE: desktop/src/components/useInstallCLI.tsx
function useInstallCLI (line 23) | function useInstallCLI() {
FILE: desktop/src/constants.ts
constant STATUS_BAR_HEIGHT (line 14) | const STATUS_BAR_HEIGHT: NonNullable<BoxProps["height"]> = "8"
constant SIDEBAR_WIDTH (line 15) | const SIDEBAR_WIDTH: BoxProps["width"] = "15rem"
constant RECOMMENDED_PROVIDER_SOURCES (line 16) | const RECOMMENDED_PROVIDER_SOURCES = [
constant WORKSPACE_SOURCE_BRANCH_DELIMITER (line 29) | const WORKSPACE_SOURCE_BRANCH_DELIMITER = "@"
constant WORKSPACE_SOURCE_COMMIT_DELIMITER (line 30) | const WORKSPACE_SOURCE_COMMIT_DELIMITER = "@sha256:"
constant WORKSPACE_STATUSES (line 31) | const WORKSPACE_STATUSES = ["Running", "Stopped", "Busy", "NotFound"] as...
FILE: desktop/src/contexts/DevPodContext/DevPodProvider/DevPodContext.tsx
type TDevpodContext (line 4) | type TDevpodContext = Readonly<{
FILE: desktop/src/contexts/DevPodContext/DevPodProvider/DevPodProvider.tsx
function DevPodProvider (line 9) | function DevPodProvider({ children }: Readonly<{ children?: ReactNode }>) {
function ProviderProvider (line 32) | function ProviderProvider({ children }: Readonly<{ children?: ReactNode ...
FILE: desktop/src/contexts/DevPodContext/Pro/ContextSwitcher.tsx
type THostPickerProps (line 37) | type THostPickerProps = Readonly<{
function ContextSwitcher (line 47) | function ContextSwitcher({
type TPlatformDetailsProps (line 173) | type TPlatformDetailsProps = Readonly<{
function PlatformDetails (line 183) | function PlatformDetails({
FILE: desktop/src/contexts/DevPodContext/Pro/ProProvider.tsx
function ProProvider (line 17) | function ProProvider({ host, children }: { host: string; children: React...
constant PROJECT_STORAGE_KEY (line 205) | const PROJECT_STORAGE_KEY = "devpod_current_project"
function getProjectStorageKey (line 207) | function getProjectStorageKey(host: string) {
FILE: desktop/src/contexts/DevPodContext/Pro/constants.ts
constant HOST_OSS (line 1) | const HOST_OSS = "Open Source"
FILE: desktop/src/contexts/DevPodContext/Pro/useProContext.ts
type TProContext (line 8) | type TProContext = Readonly<{
function useProContext (line 19) | function useProContext() {
FILE: desktop/src/contexts/DevPodContext/Pro/useProHost.ts
function useProHost (line 3) | function useProHost() {
FILE: desktop/src/contexts/DevPodContext/Pro/useProjectClusters.tsx
type TProjectCluster (line 7) | type TProjectCluster = ManagementV1ProjectClusters & {
function useProjectClusters (line 10) | function useProjectClusters(): UseQueryResult<TProjectCluster | undefine...
FILE: desktop/src/contexts/DevPodContext/Pro/useTemplates.ts
type TTemplates (line 8) | type TTemplates = Readonly<{
function useTemplates (line 14) | function useTemplates(): UseQueryResult<TTemplates> {
FILE: desktop/src/contexts/DevPodContext/Pro/workspaceInstance.ts
class ProWorkspaceInstance (line 7) | class ProWorkspaceInstance
method id (line 13) | public get id(): string {
method constructor (line 24) | constructor(instance: ManagementV1DevPodWorkspaceInstance) {
class ProWorkspaceInstanceStatus (line 35) | class ProWorkspaceInstanceStatus extends ManagementV1DevPodWorkspaceInst...
method constructor (line 40) | constructor() {
class ProWorkspaceMetricsSummary (line 45) | class ProWorkspaceMetricsSummary {
FILE: desktop/src/contexts/DevPodContext/action/action.ts
type TActionName (line 4) | type TActionName = "start" | "stop" | "rebuild" | "reset" | "remove" | "...
type TActionFn (line 5) | type TActionFn = (context: TActionContext) => Promise<Result<unknown>>
type TActionStatus (line 6) | type TActionStatus = "pending" | "success" | "error" | "cancelled"
type TActionID (line 7) | type TActionID = Action["id"]
type TActionObj (line 9) | type TActionObj = Pick<
type TActions (line 13) | type TActions = Readonly<{
type TActionContext (line 17) | type TActionContext = Readonly<{ id: Action["id"] }>
class Action (line 19) | class Action {
method deserialize (line 27) | public static deserialize(str: string): TActionObj {
method constructor (line 31) | constructor(
method status (line 37) | public get status() {
method error (line 41) | public get error() {
method finishedAt (line 45) | public get finishedAt() {
method failed (line 49) | private failed(error: Error) {
method succeeded (line 59) | private succeeded() {
method run (line 68) | public run() {
method cancel (line 80) | public cancel() {
method once (line 90) | public once(listener: (status: TActionStatus) => void): void {
method getData (line 99) | public getData(): TActionObj {
FILE: desktop/src/contexts/DevPodContext/action/actionHistory.ts
constant HISTORY_KEY (line 3) | const HISTORY_KEY = "devpod-workspace-action-history"
constant MAX_HISTORY_ENTRIES (line 4) | const MAX_HISTORY_ENTRIES = 50
class ActionHistory (line 6) | class ActionHistory {
method constructor (line 12) | constructor(keySuffix?: string) {
method getAllActive (line 29) | private getAllActive(): readonly TActionObj[] {
method getActive (line 38) | public getActive(targetID: string): Action | undefined {
method getAll (line 42) | public getAll(): TActions {
method addActive (line 49) | public addActive(targetID: string, action: Action): void {
method archive (line 53) | public archive(action: Action): void {
FILE: desktop/src/contexts/DevPodContext/action/useAction.ts
type TActionResult (line 8) | type TActionResult = Readonly<{
function useAction (line 14) | function useAction(actionID: TActionID | undefined): TActionResult | und...
function getAction (line 60) | function getAction(
function useConnectAction (line 69) | function useConnectAction(
function useReplayAction (line 102) | function useReplayAction(): (
FILE: desktop/src/contexts/DevPodContext/constants.ts
constant REFETCH_INTERVAL_MS (line 1) | const REFETCH_INTERVAL_MS = 5_000
constant REFETCH_PROVIDER_INTERVAL_MS (line 3) | const REFETCH_PROVIDER_INTERVAL_MS = 1_000
FILE: desktop/src/contexts/DevPodContext/helpers.ts
function replaceEqualDeep (line 8) | function replaceEqualDeep(a: any, b: any): any {
function isPlainObject (line 41) | function isPlainObject(o: any): o is Object {
function hasObjectPrototype (line 68) | function hasObjectPrototype(o: any): boolean {
FILE: desktop/src/contexts/DevPodContext/proInstances/ProInstancesProvider.tsx
function ProInstancesProvider (line 9) | function ProInstancesProvider({ children }: Readonly<{ children?: ReactN...
FILE: desktop/src/contexts/DevPodContext/proInstances/context.ts
type TProInstancesContext (line 4) | type TProInstancesContext = TQueryResult<TProInstances>
FILE: desktop/src/contexts/DevPodContext/proInstances/useProInstanceManager.ts
constant FALLBACK_PROVIDER_NAME (line 9) | const FALLBACK_PROVIDER_NAME = "devpod-pro"
function useProInstanceManager (line 11) | function useProInstanceManager(): TProInstanceManager {
FILE: desktop/src/contexts/DevPodContext/proInstances/useProInstances.tsx
function useProInstances (line 6) | function useProInstances(): [TProInstancesContext, TProInstanceManager] {
FILE: desktop/src/contexts/DevPodContext/useProvider.ts
function useProvider (line 4) | function useProvider(
FILE: desktop/src/contexts/DevPodContext/useProviderManager.ts
function useProviderManager (line 8) | function useProviderManager(): TProviderManager {
FILE: desktop/src/contexts/DevPodContext/useProviders.ts
function useProviders (line 6) | function useProviders(): [TDevpodContext["providers"] | [undefined], TPr...
FILE: desktop/src/contexts/DevPodContext/workspaceStore/WorkspaceStoreProvider.tsx
type TWorkspaceStoreProps (line 5) | type TWorkspaceStoreProps<TStore> = Readonly<{
function WorkspaceStoreProvider (line 9) | function WorkspaceStoreProvider<TStore extends IWorkspaceStore<string, a...
FILE: desktop/src/contexts/DevPodContext/workspaceStore/context.ts
type TWorkspaceStoreContext (line 4) | type TWorkspaceStoreContext = Readonly<{
FILE: desktop/src/contexts/DevPodContext/workspaceStore/useWorkspaceStore.ts
function useWorkspaceStore (line 5) | function useWorkspaceStore<T extends IWorkspaceStore<string, unknown>>() {
FILE: desktop/src/contexts/DevPodContext/workspaceStore/workspaceStore.ts
type TLastActions (line 14) | type TLastActions = Readonly<{ active: readonly TActionObj[]; history: r...
type TStartActionArgs (line 15) | type TStartActionArgs = Readonly<{
type IWorkspaceStore (line 21) | interface IWorkspaceStore<TKey extends string, TW> {
class InternalWorkspaceStore (line 38) | class InternalWorkspaceStore<TKey extends string, TWorkspace> {
method constructor (line 45) | constructor(key?: string) {
method subscribe (line 50) | public subscribe(listener: VoidFunction): TUnsubscribeFn {
method get (line 56) | public get(key: TKey): TWorkspace | undefined {
method getAll (line 60) | public getAll(): readonly TWorkspace[] {
method getWorkspaceActions (line 64) | public getWorkspaceActions(workspaceKey: TKey): TActionObj[] {
method getCurrentAction (line 71) | public getCurrentAction(workspaceKey: TKey): TActionObj | undefined {
method getAllActions (line 75) | public getAllActions(): TLastActions {
method removeWorkspace (line 79) | public removeWorkspace(workspaceKey: TKey): void {
method startAction (line 84) | public startAction({ actionName, workspaceKey, actionFn }: TStartActio...
method setWorkspaces (line 115) | public setWorkspaces(newWorkspaces: Map<TKey, TWorkspace>) {
method setWorkspace (line 120) | public setWorkspace(id: TKey, newWorkspace: TWorkspace) {
method actionDidChange (line 125) | private actionDidChange() {
method workspacesDidChange (line 131) | private workspacesDidChange() {
class WorkspaceStore (line 138) | class WorkspaceStore implements IWorkspaceStore<TWorkspaceID, TWorkspace> {
method get (line 141) | public get(id: TWorkspaceID): TWorkspace | undefined {
method getAll (line 145) | public getAll(): readonly TWorkspace[] {
method setWorkspace (line 149) | public setWorkspace(id: TWorkspaceID, newWorkspace: TWorkspace): void {
method setWorkspaces (line 153) | public setWorkspaces(newWorkspaces: readonly TWorkspaceWithoutStatus[]...
method removeWorkspace (line 179) | public removeWorkspace(workspaceID: TWorkspaceID): void {
method subscribe (line 183) | public subscribe(listener: VoidFunction): TUnsubscribeFn {
method setStatus (line 187) | public setStatus(workspaceID: TWorkspaceID, status: string | null | un...
method getAllActions (line 204) | public getAllActions(): TLastActions {
method getCurrentAction (line 208) | public getCurrentAction(workspaceID: TWorkspaceID): TActionObj | undef...
method getWorkspaceActions (line 212) | public getWorkspaceActions(workspaceID: TWorkspaceID): TActionObj[] {
method startAction (line 216) | public startAction(args: TStartActionArgs): Action["id"] {
type TInstanceID (line 221) | type TInstanceID = string
class ProWorkspaceStore (line 222) | class ProWorkspaceStore implements IWorkspaceStore<TInstanceID, ProWorks...
method constructor (line 224) | constructor(id: TProID) {
method get (line 228) | public get(key: TInstanceID): ProWorkspaceInstance | undefined {
method getAll (line 232) | public getAll(): readonly ProWorkspaceInstance[] {
method setWorkspace (line 236) | public setWorkspace(key: TInstanceID, newWorkspace: ProWorkspaceInstan...
method setWorkspaces (line 240) | public setWorkspaces(newInstances: readonly ProWorkspaceInstance[]): v...
method removeWorkspace (line 253) | public removeWorkspace(workspaceKey: TInstanceID): void {
method subscribe (line 257) | public subscribe(listener: VoidFunction): TUnsubscribeFn {
method setStatus (line 262) | public setStatus(_workspaceKey: TInstanceID, _status: string): void {
method getAllActions (line 267) | public getAllActions(): TLastActions {
method getCurrentAction (line 271) | public getCurrentAction(workspaceKey: TInstanceID): TActionObj | undef...
method getWorkspaceActions (line 275) | public getWorkspaceActions(workspaceKey: TInstanceID): TActionObj[] {
method startAction (line 279) | public startAction(args: TStartActionArgs): Action["id"] {
FILE: desktop/src/contexts/DevPodContext/workspaces/useAllWorkspaceActions.ts
function useAllWorkspaceActions (line 5) | function useAllWorkspaceActions() {
function sortByCreationDesc (line 15) | function sortByCreationDesc(a: TActionObj, b: TActionObj) {
FILE: desktop/src/contexts/DevPodContext/workspaces/usePollWorkspaces.ts
function usePollWorkspaces (line 7) | function usePollWorkspaces() {
FILE: desktop/src/contexts/DevPodContext/workspaces/useWorkspace.ts
type TWorkspaceResult (line 8) | type TWorkspaceResult<T> = Readonly<{
function useWorkspaceActions (line 32) | function useWorkspaceActions(
function useWorkspace (line 75) | function useWorkspace<TW extends TIdentifiable>(
type TStartWorkspaceActionArgs (line 270) | type TStartWorkspaceActionArgs = Readonly<{
function startWorkspaceAction (line 277) | function startWorkspaceAction({
type TStopWorkspaceActionArgs (line 303) | type TStopWorkspaceActionArgs = Readonly<{
function stopWorkspaceAction (line 309) | function stopWorkspaceAction({
type TRemoveWorkspaceActionArgs (line 334) | type TRemoveWorkspaceActionArgs = Readonly<{
function removeWorkspaceAction (line 341) | function removeWorkspaceAction({
FILE: desktop/src/contexts/DevPodContext/workspaces/useWorkspaces.ts
function useWorkspaces (line 4) | function useWorkspaces<TW>(): readonly TW[] {
FILE: desktop/src/contexts/SettingsContext/SettingsContext.tsx
function getSettingKeys (line 36) | function getSettingKeys(): readonly TSetting[] {
constant SETTING_STORE_KEY (line 41) | const SETTING_STORE_KEY = "settings"
function SettingsProvider (line 46) | function SettingsProvider({ children }: Readonly<{ children?: ReactNode ...
FILE: desktop/src/contexts/SettingsContext/useSettings.ts
type TSettings (line 4) | type TSettings = Settings
type TSetting (line 5) | type TSetting = keyof TSettings
type TSettingsContext (line 7) | type TSettingsContext = Readonly<{
function useSettings (line 13) | function useSettings() {
function useChangeSettings (line 17) | function useChangeSettings() {
FILE: desktop/src/contexts/ToolbarContext/ToolbarContext.tsx
function ToolbarProvider (line 4) | function ToolbarProvider({ children }: Readonly<{ children: ReactNode }>) {
FILE: desktop/src/contexts/ToolbarContext/useToolbar.ts
type TToolbarContext (line 3) | type TToolbarContext = Readonly<{
type TToolbarAction (line 9) | type TToolbarAction = Readonly<{
function useToolbar (line 14) | function useToolbar() {
FILE: desktop/src/gen/Asset.ts
type Asset (line 3) | interface Asset {
FILE: desktop/src/gen/Author.ts
type Author (line 3) | interface Author {
FILE: desktop/src/gen/ColorMode.ts
type ColorMode (line 3) | type ColorMode = "dark" | "light"
FILE: desktop/src/gen/DaemonState.ts
type DaemonState (line 3) | type DaemonState = "stopped" | "pending" | "running"
FILE: desktop/src/gen/DaemonStatus.ts
type DaemonStatus (line 4) | interface DaemonStatus {
FILE: desktop/src/gen/Release.ts
type Release (line 5) | interface Release {
FILE: desktop/src/gen/Settings.ts
type Settings (line 6) | interface Settings {
FILE: desktop/src/gen/SidebarPosition.ts
type SidebarPosition (line 3) | type SidebarPosition = "left" | "right"
FILE: desktop/src/gen/Zoom.ts
type Zoom (line 3) | type Zoom = "sm" | "md" | "lg" | "xl"
FILE: desktop/src/icons/CPU.tsx
constant CPU (line 4) | const CPU = createIcon({
FILE: desktop/src/icons/ProviderPlaceholder.tsx
function ProviderPlaceholder (line 4) | function ProviderPlaceholder(iconProps: IconProps) {
FILE: desktop/src/lib/debugSettings.ts
constant DEBUG_STORE_KEY (line 5) | const DEBUG_STORE_KEY = "debug"
constant DEBUG_OPTIONS (line 6) | const DEBUG_OPTIONS = ["commands", "actions", "workspaces"] as const
type TDebugOption (line 7) | type TDebugOption = (typeof DEBUG_OPTIONS)[number]
type TDebug (line 8) | type TDebug = Readonly<{
type TDebugStore (line 14) | type TDebugStore = Record<TDebugOption, boolean>
type TInternalDebug (line 15) | type TInternalDebug = Readonly<{
function init (line 19) | function init(): TDebug & TInternalDebug {
type TUseDebug (line 43) | type TUseDebug = Readonly<{ options: Record<TDebugOption, boolean> }> & ...
function useInternalDebug (line 44) | function useInternalDebug(): TUseDebug {
function debug (line 81) | function debug(option: TDebugOption, ...args: Parameters<(typeof console...
FILE: desktop/src/lib/eventManager.ts
type TEventHandler (line 5) | type TEventHandler<TEvents, TEventName extends keyof TEvents = keyof TEv...
type THandler (line 8) | type THandler<TFn = Function> = Readonly<{ notify: TFn }> &
type TBaseEvents (line 11) | type TBaseEvents = Record<string | number | symbol, unknown>
type TEventManager (line 13) | type TEventManager<TEvents extends TBaseEvents> = Readonly<{
class EventManager (line 33) | class EventManager<TEvents extends TBaseEvents> implements TEventManager...
method toHandler (line 36) | public static toHandler<TFn extends Function>(
method subscribe (line 49) | public subscribe<TEventName extends keyof TEvents>(
method isSubscribed (line 63) | public isSubscribed<TEventName extends keyof TEvents>(
method unsubscribe (line 75) | public unsubscribe<TEventName extends keyof TEvents>(
method publish (line 94) | public publish<TEventName extends keyof TEvents>(
method clear (line 110) | public clear<TEventName extends keyof TEvents>(eventName: TEventName):...
class SingleEventManager (line 115) | class SingleEventManager<T> {
method subscribe (line 118) | subscribe(handler: TEventHandler<{ event: T }, "event">): VoidFunction {
method isSubscribed (line 122) | isSubscribed(handler: TEventHandler<{ event: T }, "event">): boolean {
method unsubscribe (line 126) | unsubscribe(handler: TEventHandler<{ event: T }, "event">): void {
method publish (line 130) | publish(event: T): boolean {
method clear (line 134) | clear(): void {
FILE: desktop/src/lib/helpers.ts
function exists (line 8) | function exists<T extends any | null | undefined>(
function isError (line 14) | function isError(error: unknown): error is Error {
function noop (line 18) | function noop(): void {}
function noopAsync (line 19) | async function noopAsync(): Promise<void> {}
function serializeMap (line 24) | function serializeMap<T extends Map<unknown, unknown>>(map: T): string {
function deserializeMap (line 28) | function deserializeMap<T extends Map<unknown, unknown>>(serializedMap: ...
function isEmpty (line 32) | function isEmpty<T extends { length: number }>(arg: T): boolean {
function safeJSONParse (line 36) | function safeJSONParse<T>(arg: string): T | null {
function getErrorFromChildProcess (line 44) | function getErrorFromChildProcess(result: ChildProcess<string>): Err<Fai...
function parseOutput (line 75) | function parseOutput(arg: string): TLogOutput[] {
function getKeys (line 95) | function getKeys<T extends object>(arg: T): readonly (keyof T)[] {
function sleep (line 99) | function sleep(ms: number): Promise<void> {
function getActionDisplayName (line 103) | function getActionDisplayName(action: TActionObj): string {
function getIDEDisplayName (line 111) | function getIDEDisplayName(ide: TIDE) {
function randomString (line 116) | function randomString(length: number): string {
function remToPx (line 120) | function remToPx(rem: string): number {
function getIDEName (line 124) | function getIDEName(ide: TWorkspace["ide"], ides: TIDEs | undefined) {
function getWorkspaceSourceName (line 130) | function getWorkspaceSourceName({
function deepCopy (line 160) | function deepCopy<T>(obj: T): T | undefined {
function canHealthCheck (line 168) | function canHealthCheck(providerConfig: TProvider["config"]): boolean {
function hasCapability (line 172) | function hasCapability(
FILE: desktop/src/lib/modals/useDeleteWorkspaceModal.tsx
function useDeleteWorkspaceModal (line 17) | function useDeleteWorkspaceModal(
FILE: desktop/src/lib/modals/useLoginProModal.tsx
type TFormValues (line 35) | type TFormValues = {
type TSetupProInitialData (line 44) | type TSetupProInitialData = {
function useLoginProModal (line 50) | function useLoginProModal() {
function useReLoginProModal (line 304) | function useReLoginProModal() {
FILE: desktop/src/lib/modals/useRebuildWorkspaceModal.tsx
function useRebuildWorkspaceModal (line 15) | function useRebuildWorkspaceModal(
FILE: desktop/src/lib/modals/useResetWorkspaceModal.tsx
function useResetWorkspaceModal (line 15) | function useResetWorkspaceModal(
FILE: desktop/src/lib/modals/useStopWorkspaceModal.tsx
function useStopWorkspaceModal (line 15) | function useStopWorkspaceModal(onClick: (closeModal: VoidFunction) => vo...
FILE: desktop/src/lib/pro/name.ts
function getDisplayName (line 1) | function getDisplayName(
function safeMaxName (line 23) | async function safeMaxName(str: string, maxLength: number): Promise<stri...
FILE: desktop/src/lib/pro/parameters.tsx
type TParameterWithValue (line 8) | type TParameterWithValue = StorageV1AppParameter & { value?: string | nu...
function getParametersWithValues (line 10) | function getParametersWithValues(
function getParameters (line 45) | function getParameters(
function findLatestVersion (line 69) | function findLatestVersion(
function sortByVersionDesc (line 75) | function sortByVersionDesc(
function stripVersionPrefix (line 82) | function stripVersionPrefix(version: string): string {
FILE: desktop/src/lib/pro/source.ts
class Source (line 4) | class Source {
method constructor (line 8) | constructor(type?: TWorkspaceSourceType, value?: string) {
method fromRaw (line 13) | static fromRaw(rawSource?: string): Source {
method stringify (line 29) | public stringify(): string {
FILE: desktop/src/lib/pro/time.ts
function getLastActivity (line 4) | function getLastActivity(instance: ProWorkspaceInstance): Date | undefin...
FILE: desktop/src/lib/pro/useConnectionStatus.tsx
type TConnectionStatus (line 6) | type TConnectionStatus = Partial<TPlatformHealthCheck> & {
function useConnectionStatus (line 9) | function useConnectionStatus(): TConnectionStatus {
FILE: desktop/src/lib/randomWords.ts
function randomWords (line 1964) | function randomWords(
FILE: desktop/src/lib/releases.ts
function useReleases (line 6) | function useReleases(): readonly Release[] | undefined {
FILE: desktop/src/lib/result.ts
class Err (line 1) | class Err<TError extends Error> {
method constructor (line 5) | constructor(public readonly val: TError) {}
method unwrap (line 7) | public unwrap(): undefined {
class Ok (line 12) | class Ok<T> {
method constructor (line 16) | constructor(public readonly val: T) {}
method unwrap (line 18) | public unwrap(): T {
type ResultError (line 24) | type ResultError = Ok<undefined> | Err<Failed>
type Result (line 26) | type Result<T> = Ok<T> | Err<Failed>
type ErrorType (line 29) | type ErrorType = string
class Return (line 39) | class Return {
method Ok (line 40) | static Ok() {
method Value (line 44) | static Value<TVal>(val: TVal) {
method Failed (line 48) | static Failed(message: string, reason: string = "", type: ErrorType = ...
method Error (line 52) | static Error<TError extends Error>(val: TError): Err<TError> {
class Failed (line 57) | class Failed extends Error {
method constructor (line 58) | constructor(
FILE: desktop/src/lib/store.ts
type TBaseStore (line 6) | type TBaseStore = Record<string | number | symbol, unknown>
type TStore (line 8) | type TStore<T extends TBaseStore> = Readonly<{
type TStorageBackend (line 15) | type TStorageBackend<T extends TBaseStore = TBaseStore> = Omit<TStore<T>...
class Store (line 17) | class Store<T extends TBaseStore> implements TStore<T> {
method constructor (line 19) | constructor(private backend: TStorageBackend<T>) {}
method set (line 21) | public async set<TKey extends keyof T>(key: TKey, value: T[TKey]): Pro...
method get (line 26) | public async get<TKey extends keyof T>(key: TKey): Promise<T[TKey] | n...
method remove (line 30) | public async remove<TKey extends keyof T>(key: TKey): Promise<void> {
method subscribe (line 34) | public subscribe<TKey extends keyof T>(
method clear (line 43) | public async clear(): Promise<void> {
class LocalStorageBackend (line 48) | class LocalStorageBackend<T extends TBaseStore> implements TStorageBacke...
method constructor (line 49) | constructor(private storageKey: string) {}
method getKey (line 51) | private getKey(key: keyof TBaseStore): string {
method set (line 55) | public async set<TKey extends keyof T>(key: TKey, value: T[TKey]): Pro...
method get (line 63) | public async get<TKey extends keyof T>(key: TKey): Promise<T[TKey] | n...
method remove (line 76) | public async remove<TKey extends keyof T>(key: TKey): Promise<void> {
method clear (line 80) | public async clear(): Promise<void> {
class FileStorageBackend (line 85) | class FileStorageBackend<T extends TBaseStore> implements TStorageBacken...
method constructor (line 88) | constructor(name: string) {
method set (line 93) | public async set<TKey extends keyof T>(key: TKey, value: T[TKey]): Pro...
method get (line 102) | public async get<TKey extends keyof T>(key: TKey): Promise<T[TKey] | n...
method remove (line 115) | public async remove<TKey extends keyof T>(key: TKey): Promise<void> {
method clear (line 120) | public async clear(): Promise<void> {
class LocalStorageToFileMigrationBackend (line 126) | class LocalStorageToFileMigrationBackend<T extends TBaseStore>
method constructor (line 132) | constructor(private storageKey: string) {
method set (line 137) | public async set<TKey extends keyof T>(key: TKey, value: T[TKey]): Pro...
method get (line 147) | public async get<TKey extends keyof T>(key: TKey): Promise<T[TKey] | n...
method remove (line 163) | public async remove<TKey extends keyof T>(key: TKey): Promise<void> {
method clear (line 167) | public async clear(): Promise<void> {
FILE: desktop/src/lib/systemInfo.ts
function usePlatform (line 5) | function usePlatform(): TPlatform | undefined {
function useArch (line 14) | function useArch(): TArch | undefined {
type TSystemTheme (line 23) | type TSystemTheme = Awaited<Exclude<ReturnType<typeof client.getSystemTh...
function useSystemTheme (line 24) | function useSystemTheme(): TSystemTheme | undefined {
FILE: desktop/src/lib/types.ts
type TAction (line 1) | type TAction<
constant PRO_INSTANCE_DETAILS (line 13) | const PRO_INSTANCE_DETAILS = ["logs", "configuration"] as const
type TProInstanceDetail (line 14) | type TProInstanceDetail = (typeof PRO_INSTANCE_DETAILS)[number]
FILE: desktop/src/lib/useDownloadLogs.ts
function useDownloadLogs (line 7) | function useDownloadLogs() {
FILE: desktop/src/lib/useFormErrors.ts
type TErr (line 4) | type TErr<TPrefix extends string> = `${TPrefix}Error`
type TFormErrors (line 5) | type TFormErrors<T extends Record<string, unknown>> = {
function useFormErrors (line 9) | function useFormErrors<TFormValues extends FieldValues>(
FILE: desktop/src/lib/useHover.ts
function useHover (line 3) | function useHover<T extends HTMLButtonElement>(): [boolean, LegacyRef<T>] {
FILE: desktop/src/lib/useSelection.ts
function useSelection (line 3) | function useSelection<TIdType extends string | number = string>() {
FILE: desktop/src/lib/useSortWorkspaces.tsx
type ESortWorkspaceMode (line 6) | enum ESortWorkspaceMode {
constant DEFAULT_SORT_WORKSPACE_MODE (line 13) | const DEFAULT_SORT_WORKSPACE_MODE = ESortWorkspaceMode.RECENTLY_USED
type TSortable (line 15) | type TSortable<TOriginal> = {
function sortWorkspaces (line 21) | function sortWorkspaces<T>(
function useSortWorkspaces (line 50) | function useSortWorkspaces(
function useSortProWorkspaces (line 69) | function useSortProWorkspaces(
FILE: desktop/src/lib/useStoreTroubleshoot.ts
function useStoreTroubleshoot (line 9) | function useStoreTroubleshoot() {
FILE: desktop/src/lib/useUpdate.ts
function useUpdate (line 6) | function useUpdate() {
FILE: desktop/src/lib/useVersion.ts
function useVersion (line 5) | function useVersion(): string | undefined {
FILE: desktop/src/main.tsx
function Root (line 48) | function Root() {
FILE: desktop/src/queryKeys.ts
method workspace (line 19) | workspace(id: TWorkspaceID): string[] {
method workspaceStatus (line 22) | workspaceStatus(id: TWorkspaceID): string[] {
method provider (line 25) | provider(id: TProviderID): string[] {
method providerOptions (line 29) | providerOptions(id: TProviderID): string[] {
method providerSetOptions (line 32) | providerSetOptions(id: TProviderID): string[] {
method providerUpdate (line 35) | providerUpdate(id: TProviderID): string[] {
method proWorkspaceTemplates (line 38) | proWorkspaceTemplates(host: string, project: string): string[] {
method proClusters (line 41) | proClusters(host: string, project: string): string[] {
method connectionStatus (line 44) | connectionStatus(host: string): string[] {
method versionInfo (line 47) | versionInfo(host: string): string[] {
method proProviderUpdates (line 50) | proProviderUpdates(proInstances: TProInstances | undefined) {
method userProfile (line 53) | userProfile(name: string | undefined) {
FILE: desktop/src/routes.tsx
method ACTION (line 14) | get ACTION(): string {
method WORKSPACE_CREATE (line 17) | get WORKSPACE_CREATE(): string {
method toWorkspaceCreate (line 20) | toWorkspaceCreate(
method toAction (line 40) | toAction(actionID: TActionID, onSuccess?: string): string {
method getActionID (line 47) | getActionID(params: Params<string>): string | undefined {
method getWorkspaceCreateParamsFromSearchParams (line 51) | getWorkspaceCreateParamsFromSearchParams(searchParams: URLSearchParams):...
method PROVIDER (line 67) | get PROVIDER(): string {
method toProvider (line 70) | toProvider(providerID: string): string {
method getProviderId (line 73) | getProviderId(params: Params<string>): string | undefined {
method toProInstance (line 85) | toProInstance(host: string): string {
method toProWorkspace (line 88) | toProWorkspace(host: string, instanceID: string): string {
method toProWorkspaceCreate (line 93) | toProWorkspaceCreate(host: string, fromPreset?: string): string {
method toProSelectPreset (line 98) | toProSelectPreset(host: string): string {
method toProWorkspaceDetail (line 103) | toProWorkspaceDetail(host: string, instanceID: string, detail: TProInsta...
method toProSettings (line 108) | toProSettings(host: string): string {
method toProCredentials (line 113) | toProCredentials(host: string): string {
method toProProfile (line 118) | toProProfile(host: string): string {
method getProWorkspaceDetailsParams (line 123) | getProWorkspaceDetailsParams(
FILE: desktop/src/runner.ts
class ManagementV1Runner (line 19) | class ManagementV1Runner {
method getAttributeTypeMap (line 72) | static getAttributeTypeMap() {
method constructor (line 76) | public constructor() {}
class ManagementV1RunnerSpec (line 82) | class ManagementV1RunnerSpec {
method getAttributeTypeMap (line 168) | static getAttributeTypeMap() {
method constructor (line 172) | public constructor() {}
class ManagementV1RunnerStatus (line 178) | class ManagementV1RunnerStatus {
method getAttributeTypeMap (line 230) | static getAttributeTypeMap() {
method constructor (line 234) | public constructor() {}
class StorageV1RunnerClusterRef (line 237) | class StorageV1RunnerClusterRef {
method getAttributeTypeMap (line 290) | static getAttributeTypeMap() {
method constructor (line 294) | public constructor() {}
class StorageV1RunnerPodTemplate (line 297) | class StorageV1RunnerPodTemplate {
method getAttributeTypeMap (line 323) | static getAttributeTypeMap() {
method constructor (line 327) | public constructor() {}
class StorageV1RunnerPersistentVolumeClaimTemplateSpec (line 330) | class StorageV1RunnerPersistentVolumeClaimTemplateSpec {
method getAttributeTypeMap (line 372) | static getAttributeTypeMap() {
method constructor (line 376) | public constructor() {}
type StorageV1RunnerPersistentVolumeClaimTemplateSpecAccessModesEnum (line 379) | enum StorageV1RunnerPersistentVolumeClaimTemplateSpecAccessModesEnum {
class StorageV1RunnerPodTemplateSpec (line 386) | class StorageV1RunnerPodTemplateSpec {
method getAttributeTypeMap (line 502) | static getAttributeTypeMap() {
method constructor (line 506) | public constructor() {}
class StorageV1RunnerPersistentVolumeClaimTemplate (line 509) | class StorageV1RunnerPersistentVolumeClaimTemplate {
method getAttributeTypeMap (line 535) | static getAttributeTypeMap() {
method constructor (line 539) | public constructor() {}
class StorageV1RunnerServiceTemplate (line 542) | class StorageV1RunnerServiceTemplate {
method getAttributeTypeMap (line 568) | static getAttributeTypeMap() {
method constructor (line 572) | public constructor() {}
class StorageV1RunnerServiceTemplateSpec (line 575) | class StorageV1RunnerServiceTemplateSpec {
method getAttributeTypeMap (line 597) | static getAttributeTypeMap() {
method constructor (line 601) | public constructor() {}
type StorageV1RunnerServiceTemplateSpecTypeEnum (line 604) | enum StorageV1RunnerServiceTemplateSpecTypeEnum {
FILE: desktop/src/types.ts
type TMaybe (line 4) | type TMaybe<T> = T | null | undefined
type TUnsubscribeFn (line 5) | type TUnsubscribeFn = VoidFunction
type TComparable (line 6) | type TComparable<T> = Readonly<{ eq(b: T): boolean }>
type TIdentifiable (line 7) | type TIdentifiable = Readonly<{ id: string }>
type TStreamID (line 8) | type TStreamID = string
type TDeepNonNullable (line 9) | type TDeepNonNullable<T> = {
type TLogOutput (line 14) | type TLogOutput = Readonly<{ time: Date; message?: string; level: string }>
type TQueryResult (line 15) | type TQueryResult<TData extends Readonly<object>> = [
type TRunnable (line 19) | type TRunnable<TRunConfig> = Readonly<{ run(config: TRunConfig): void }>
type TIDEs (line 23) | type TIDEs = readonly TIDE[]
type TIDE (line 24) | type TIDE = Readonly<{
type TProviderID (line 36) | type TProviderID = string
type TOptionID (line 37) | type TOptionID = string
type TWithProviderID (line 38) | type TWithProviderID = Readonly<{ providerID: TProviderID }>
type TProviders (line 39) | type TProviders = Record<TProviderID, TProvider>
type TProvider (line 40) | type TProvider = Readonly<{
type TNamedProvider (line 54) | type TNamedProvider = TProvider & Readonly<{ name: string }>
type TProviderConfig (line 55) | type TProviderConfig = Readonly<{
type TProviderOptionGroup (line 69) | type TProviderOptionGroup = Readonly<{
type TProviderSource (line 74) | type TProviderSource = Readonly<{
type TProviderOptions (line 81) | type TProviderOptions = Record<string, TProviderOption>
type TProviderOption (line 82) | type TProviderOption = Readonly<{
type TOptionEnum (line 114) | type TOptionEnum = Readonly<{
type TAddProviderConfig (line 119) | type TAddProviderConfig = Readonly<{
type TConfigureProviderConfig (line 122) | type TConfigureProviderConfig = Readonly<{
type TProviderManager (line 128) | type TProviderManager = Readonly<{
type TCheckProviderUpdateResult (line 132) | type TCheckProviderUpdateResult = Readonly<{
type TWorkspaceID (line 140) | type TWorkspaceID = NonNullable<TWorkspace["id"]>
type TWithWorkspaceID (line 141) | type TWithWorkspaceID = Readonly<{ workspaceID: TWorkspaceID }>
type TWorkspace (line 142) | type TWorkspace = Readonly<{
type TWorkspaceWithoutStatus (line 156) | type TWorkspaceWithoutStatus = Omit<TWorkspace, "status"> & Readonly<{ s...
type TWorkspaceStatusResult (line 157) | type TWorkspaceStatusResult = Readonly<{
type TWorkspaceSourceType (line 163) | type TWorkspaceSourceType = "local" | "git" | "image"
type TWorkspaceStartConfig (line 164) | type TWorkspaceStartConfig = Readonly<{
type TWorkspaceSource (line 176) | type TWorkspaceSource = {
constant SUPPORTED_IDES (line 185) | const SUPPORTED_IDES = [
type TSupportedIDE (line 203) | type TSupportedIDE = (typeof SUPPORTED_IDES)[number]
type TImportWorkspaceConfig (line 204) | type TImportWorkspaceConfig = Readonly<{
type TContextOptions (line 215) | type TContextOptions = Record<TContextOptionName, TContextOption>
type TContextOptionName (line 217) | type TContextOptionName =
type TContextOption (line 222) | type TContextOption = Readonly<{
type TProID (line 232) | type TProID = string
type TWithProID (line 233) | type TWithProID = Readonly<{ id: TProID }>
type TProInstance (line 234) | type TProInstance = Readonly<{
type TProInstances (line 241) | type TProInstances = readonly TProInstance[]
type TProInstanceManager (line 242) | type TProInstanceManager = Readonly<{
type TProInstanceLoginConfig (line 250) | type TProInstanceLoginConfig = Readonly<{
type TListProInstancesConfig (line 255) | type TListProInstancesConfig = Readonly<
type TPlatformVersionInfo (line 261) | type TPlatformVersionInfo = Readonly<{
type TDevcontainerSetup (line 268) | type TDevcontainerSetup = Readonly<{
type TCommunityContributions (line 275) | type TCommunityContributions = Readonly<{
type TCommunityProvider (line 278) | type TCommunityProvider = Readonly<{
type TPlatformHealthCheck (line 282) | type TPlatformHealthCheck = Readonly<{
type TPlatformUpdateCheck (line 288) | type TPlatformUpdateCheck = Readonly<{
type TUserSecretType (line 296) | type TUserSecretType = (typeof UserSecret)[keyof typeof UserSecret]
type TGitCredentialData (line 297) | type TGitCredentialData = {
type TGitCredentialHelperData (line 304) | type TGitCredentialHelperData = Readonly<{
function isWithWorkspaceID (line 311) | function isWithWorkspaceID(arg: unknown): arg is TWithWorkspaceID {
FILE: desktop/src/useCommunityContributions.ts
function useCommunityContributions (line 6) | function useCommunityContributions(): Readonly<{
FILE: desktop/src/useIDEs.ts
constant FLEET_IDE_NAME (line 9) | const FLEET_IDE_NAME = "fleet"
constant JUPYTER_IDE_NAME (line 10) | const JUPYTER_IDE_NAME = "jupyternotebook"
constant VSCODE_INSIDERS (line 11) | const VSCODE_INSIDERS = "vscode-insiders"
constant CURSOR (line 12) | const CURSOR = "cursor"
constant POSITRON (line 13) | const POSITRON = "positron"
constant CODIUM (line 14) | const CODIUM = "codium"
constant ZED (line 15) | const ZED = "zed"
constant RSTUDIO (line 16) | const RSTUDIO = "rstudio"
constant WINDSURF (line 17) | const WINDSURF = "windsurf"
function useIDEs (line 19) | function useIDEs() {
function useGroupIDEs (line 52) | function useGroupIDEs(ides?: TIDEs) {
FILE: desktop/src/useWelcomeModal.tsx
constant IS_FIRST_VISIT_KEY (line 23) | const IS_FIRST_VISIT_KEY = "devpod-is-first-visit"
function useWelcomeModal (line 25) | function useWelcomeModal() {
FILE: desktop/src/views/Actions/Action.tsx
function Action (line 13) | function Action() {
FILE: desktop/src/views/Actions/Actions.tsx
function Actions (line 6) | function Actions() {
FILE: desktop/src/views/Actions/useActionTitle.tsx
function useActionTitle (line 10) | function useActionTitle(): TViewTitle | null {
FILE: desktop/src/views/Pro/BackToWorkspaces.tsx
function BackToWorkspaces (line 7) | function BackToWorkspaces() {
FILE: desktop/src/views/Pro/CreateWorkspace/CreateWorkspace.tsx
function CreateWorkspace (line 33) | function CreateWorkspace() {
function buildWorkspaceInstance (line 128) | async function buildWorkspaceInstance(
function getKubeName (line 227) | async function getKubeName(name: string): Promise<Result<string>> {
function getID (line 244) | function getID(name: string): string {
FILE: desktop/src/views/Pro/CreateWorkspace/CreateWorkspaceForm.tsx
type TCreateWorkspaceFormProps (line 41) | type TCreateWorkspaceFormProps = Readonly<{
function CreateWorkspaceForm (line 52) | function CreateWorkspaceForm({
type TCreateWorkspaceRowProps (line 317) | type TCreateWorkspaceRowProps = Readonly<{
function CreateWorkspaceRow (line 321) | function CreateWorkspaceRow({ label, children }: TCreateWorkspaceRowProp...
function getDefaultValues (line 334) | function getDefaultValues(
FILE: desktop/src/views/Pro/CreateWorkspace/DevContainerInput.tsx
type TDevContainerInputProps (line 17) | type TDevContainerInputProps = Readonly<{
function DevContainerInput (line 21) | function DevContainerInput({
function determineEnvironmentTemplate (line 151) | function determineEnvironmentTemplate(
FILE: desktop/src/views/Pro/CreateWorkspace/IDEInput.tsx
type TIDEInputProps (line 9) | type TIDEInputProps = Readonly<{
function IDEInput (line 14) | function IDEInput({ ides, field, onClick }: TIDEInputProps) {
type TIDECardProps (line 35) | type TIDECardProps = Readonly<{
function IDECard (line 41) | function IDECard({ name, isSelected, icon, onClick }: TIDECardProps) {
FILE: desktop/src/views/Pro/CreateWorkspace/InfrastructureTemplateInput.tsx
type TOptionsInputProps (line 24) | type TOptionsInputProps = Readonly<{
function InfrastructureTemplateInput (line 29) | function InfrastructureTemplateInput({
type TOptionFormFieldProps (line 207) | type TOptionFormFieldProps = Partial<
function OptionFormField (line 216) | function OptionFormField({
function convertParameterType (line 369) | function convertParameterType(paramType: StorageV1AppParameter["type"]):...
function createTraversablePropertyPath (line 390) | function createTraversablePropertyPath(path: string): string[] {
function getDeepValue (line 397) | function getDeepValue<T>(obj: any, path: string): T | undefined {
FILE: desktop/src/views/Pro/CreateWorkspace/PresetInput.tsx
type TPresetInputProps (line 16) | type TPresetInputProps = Readonly<{
function PresetInput (line 23) | function PresetInput({ preset, presets, loading, isUpdate, setPreset }: ...
FILE: desktop/src/views/Pro/CreateWorkspace/RunnerInput.tsx
function TargetInput (line 6) | function TargetInput({
FILE: desktop/src/views/Pro/CreateWorkspace/SourceInput.tsx
constant GIT_REPOSITORY_PATTERN (line 29) | const GIT_REPOSITORY_PATTERN =
constant GIT_REPOSITORY_REGEX (line 31) | const GIT_REPOSITORY_REGEX = new RegExp(GIT_REPOSITORY_PATTERN)
constant BRANCH_REGEX (line 32) | const BRANCH_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@([a-zA-Z0-9\...
constant COMMIT_REGEX (line 33) | const COMMIT_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@sha256:([a-z...
constant PR_REGEX (line 34) | const PR_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@pull\\/([0-9]+)\...
constant SUBPATH_REGEX (line 35) | const SUBPATH_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@subpath:([a...
constant ADVANCED_GIT_SETTING_TABS (line 43) | const ADVANCED_GIT_SETTING_TABS = [
type TAdvancedGitSetting (line 49) | type TAdvancedGitSetting = (typeof AdvancedGitSetting)[keyof typeof Adva...
constant INITIAL_ADVANCED_SETTINGS (line 50) | const INITIAL_ADVANCED_SETTINGS = { option: AdvancedGitSetting.BRANCH, v...
type TSourceInputProps (line 52) | type TSourceInputProps = Readonly<{ isDisabled: boolean; resetPreset: Vo...
function SourceInput (line 53) | function SourceInput({ isDisabled, resetPreset }: TSourceInputProps) {
function appendGitSetting (line 334) | function appendGitSetting(
function pruneGitSettings (line 357) | function pruneGitSettings(value: string): string {
function getAdvancedSettingsPlaceholder (line 366) | function getAdvancedSettingsPlaceholder(setting: TAdvancedGitSetting | u...
function parseAdvancedSettings (line 383) | function parseAdvancedSettings(value: string | undefined): {
FILE: desktop/src/views/Pro/CreateWorkspace/UpdateWorkspace.tsx
type TUpdateWorkspaceProps (line 19) | type TUpdateWorkspaceProps = Readonly<{
function UpdateWorkspace (line 23) | function UpdateWorkspace({ instance, template }: TUpdateWorkspaceProps) {
function updateWorkspaceInstance (line 94) | function updateWorkspaceInstance(
FILE: desktop/src/views/Pro/CreateWorkspace/types.ts
type TFormValues (line 15) | type TFormValues = {
type TTarget (line 27) | type TTarget = string // either runner or cluster, depending on provider
type TOptions (line 28) | type TOptions = {
type TDevContainerType (line 34) | type TDevContainerType = "path" | "external"
FILE: desktop/src/views/Pro/Credentials/AddGitHTTPCredentials.tsx
type TFormValues (line 27) | type TFormValues = {
type TCreateGitHTTPCredentialsProps (line 43) | type TCreateGitHTTPCredentialsProps = Readonly<{
function AddGitHTTPCredentials (line 47) | function AddGitHTTPCredentials({ isDisabled, onCreate }: TCreateGitHTTPC...
type TFormSectionProps (line 237) | type TFormSectionProps = Readonly<{
function FormSection (line 245) | function FormSection({
FILE: desktop/src/views/Pro/Credentials/AddGitSSHCredentials.tsx
type TFormValues (line 20) | type TFormValues = {
type TAddGitSSHCredentialsProps (line 28) | type TAddGitSSHCredentialsProps = Readonly<{
function AddGitSSHCredentials (line 32) | function AddGitSSHCredentials({ isDisabled, onCreate }: TAddGitSSHCreden...
type TFormSectionProps (line 137) | type TFormSectionProps = Readonly<{
function FormSection (line 145) | function FormSection({
FILE: desktop/src/views/Pro/Credentials/Credentials.tsx
function Credentials (line 50) | function Credentials() {
type TSecretTypeTagProps (line 191) | type TSecretTypeTagProps = Readonly<{ type: string | undefined }>
function SecretTypeTag (line 192) | function SecretTypeTag({ type }: TSecretTypeTagProps) {
function useCreateCredentialModal (line 208) | function useCreateCredentialModal(
FILE: desktop/src/views/Pro/ListWorkspaces.tsx
function ListWorkspaces (line 46) | function ListWorkspaces() {
function isOwner (line 250) | function isOwner(instance: ProWorkspaceInstance, self: ManagementV1Self ...
FILE: desktop/src/views/Pro/ProInstance.tsx
function ProInstance (line 11) | function ProInstance() {
FILE: desktop/src/views/Pro/Profile.tsx
function Profile (line 4) | function Profile() {
FILE: desktop/src/views/Pro/SelectPreset/SelectPreset.tsx
function SelectPreset (line 30) | function SelectPreset() {
function PresetBox (line 147) | function PresetBox({
FILE: desktop/src/views/Pro/Settings.tsx
function Settings (line 5) | function Settings() {
FILE: desktop/src/views/Pro/Workspace/Configuration.tsx
function Configuration (line 4) | function Configuration({ instance, template }: TTabProps) {
FILE: desktop/src/views/Pro/Workspace/Logs.tsx
constant MAX_LOGS (line 38) | const MAX_LOGS = 10
function Logs (line 40) | function Logs({ host, instance }: TTabProps) {
type TActionAccordionItemProps (line 98) | type TActionAccordionItemProps = Readonly<{
function ActionAccordionItem (line 104) | function ActionAccordionItem({
type TActionTerminalProps (line 187) | type TActionTerminalProps = Readonly<{
function ActionTerminal (line 190) | function ActionTerminal({ actionID }: TActionTerminalProps) {
type TDownloadLogsButtonProps (line 264) | type TDownloadLogsButtonProps = Readonly<{ actionID: string }>
function DownloadLogsButton (line 265) | function DownloadLogsButton({ actionID }: TDownloadLogsButtonProps) {
FILE: desktop/src/views/Pro/Workspace/Tabs.tsx
constant DETAILS_TABS (line 10) | const DETAILS_TABS: Readonly<{
type TWorkspaceTabProps (line 18) | type TWorkspaceTabProps = Readonly<{}> & TTabProps
function WorkspaceTabs (line 19) | function WorkspaceTabs({ ...tabProps }: TWorkspaceTabProps) {
FILE: desktop/src/views/Pro/Workspace/Workspace.tsx
function Workspace (line 29) | function Workspace() {
FILE: desktop/src/views/Pro/Workspace/WorkspaceCardHeader.tsx
type TWorkspaceCardHeaderContext (line 52) | type TWorkspaceCardHeaderContext = ProWorkspaceInstance
type TWorkspaceCardHeaderProps (line 55) | type TWorkspaceCardHeaderProps = Readonly<{
function WorkspaceCardHeader (line 64) | function WorkspaceCardHeader({
type TControlsProps (line 189) | type TControlsProps = Readonly<{
function Controls (line 197) | function Controls({
function getSourceDetail (line 303) | function getSourceDetail(source: TWorkspaceSource | undefined): ReactNod...
function getWorkspaceIDE (line 347) | function getWorkspaceIDE(
FILE: desktop/src/views/Pro/Workspace/WorkspaceDetails.tsx
type TWorkspaceDetailsProps (line 38) | type TWorkspaceDetailsProps = Readonly<{
function WorkspaceDetails (line 45) | function WorkspaceDetails({
type TWorkspaceInfoDetailProps (line 222) | type TWorkspaceInfoDetailProps = Readonly<{
function WorkspaceInfoDetail (line 227) | function WorkspaceInfoDetail({ icon: Icon, label, tooltipLabel }: TWorks...
function getSourceInfo (line 244) | function getSourceInfo(
function formatTemplateDetail (line 270) | function formatTemplateDetail(
type TStackedWorkspaceInfoDetailProps (line 288) | type TStackedWorkspaceInfoDetailProps = Readonly<{
function StackedWorkspaceInfoDetail (line 294) | function StackedWorkspaceInfoDetail({
type TParameterDetailProps (line 320) | type TParameterDetailProps = Readonly<{
function ParameterDetail (line 325) | function ParameterDetail({ icon: Icon, label, children }: TParameterDeta...
type TKubernetesDetailsProps (line 341) | type TKubernetesDetailsProps = Readonly<{
function KubernetesDetails (line 344) | function KubernetesDetails({ status }: TKubernetesDetailsProps) {
function PodStatus (line 423) | function PodStatus({ podStatus }: { podStatus: ManagementV1DevPodWorkspa...
function PvcStatus (line 493) | function PvcStatus({ pvcStatus }: { pvcStatus: ManagementV1DevPodWorkspa...
function quantityToScalarBigInt (line 539) | function quantityToScalarBigInt(quantity: string | number | undefined): ...
function calculateUsagePercentage (line 551) | function calculateUsagePercentage(current: number | bigint, total: numbe...
function formatCPU (line 567) | function formatCPU(input: string | undefined): string | undefined {
function formatMemoryGi (line 611) | function formatMemoryGi(input: string | undefined): string | undefined {
function formatContainerImage (line 634) | function formatContainerImage(fullImageName: string): string {
function getResourceDetails (line 647) | function getResourceDetails(
FILE: desktop/src/views/Pro/Workspace/WorkspaceInstanceCard.tsx
type TWorkspaceInstanceCardProps (line 24) | type TWorkspaceInstanceCardProps = Readonly<{
function WorkspaceInstanceCard (line 31) | function WorkspaceInstanceCard({
FILE: desktop/src/views/Pro/Workspace/WorkspaceStatus.tsx
type TWorkspaceStatusProps (line 57) | type TWorkspaceStatusProps = Readonly<{
function WorkspaceStatus (line 61) | function WorkspaceStatus({ status, deletionTimestamp }: TWorkspaceStatus...
function WorkspaceDisplayStatusBadge (line 67) | function WorkspaceDisplayStatusBadge({
type TStatusBadgeProps (line 79) | type TStatusBadgeProps = Readonly<{
function StatusBadge (line 85) | function StatusBadge({ icon, displayStatus, color, compact }: TStatusBad...
FILE: desktop/src/views/Pro/Workspace/status.ts
type TWorkspaceDisplayStatus (line 24) | type TWorkspaceDisplayStatus =
function determineDisplayStatus (line 27) | function determineDisplayStatus(
FILE: desktop/src/views/Pro/Workspace/types.ts
type TTabProps (line 5) | type TTabProps = Readonly<{
FILE: desktop/src/views/Pro/Workspace/useTemplate.ts
function useTemplate (line 7) | function useTemplate(instance: ManagementV1DevPodWorkspaceInstance | und...
FILE: desktop/src/views/Pro/helpers.ts
function presetDisplayName (line 3) | function presetDisplayName(preset: ManagementV1DevPodWorkspacePreset | u...
FILE: desktop/src/views/Providers/AddProvider/ConfigureProviderOptionsForm.tsx
type TFieldValues (line 58) | type TFieldValues = Readonly<{
type TCommonProps (line 63) | type TCommonProps = Readonly<{
type TConfigureProviderOptionsFormProps (line 74) | type TConfigureProviderOptionsFormProps = TWithWorkspace | TWithoutWorks...
type TWithWorkspace (line 75) | type TWithWorkspace = Readonly<{
type TWithoutWorkspace (line 80) | type TWithoutWorkspace = Readonly<{
function ConfigureProviderOptionsForm (line 86) | function ConfigureProviderOptionsForm(props: TConfigureProviderOptionsFo...
type TProviderOptionsFormProps (line 96) | type TProviderOptionsFormProps = TWithoutWorkspace
function ProviderOptionsForm (line 97) | function ProviderOptionsForm(props: TProviderOptionsFormProps) {
type TWorkspaceProviderOptionsFormProps (line 110) | type TWorkspaceProviderOptionsFormProps = TWithWorkspace
function WorkspaceProviderOptionsForm (line 111) | function WorkspaceProviderOptionsForm({ workspace, ...props }: TWorkspac...
type TConfigureOptionsFormProps (line 119) | type TConfigureOptionsFormProps = TConfigureProviderOptionsFormProps &
function ConfigureOptionsForm (line 125) | function ConfigureOptionsForm({
function stripOptionChildren (line 395) | function stripOptionChildren(
function filterOptions (line 407) | function filterOptions(
function useOptions (line 421) | function useOptions(
FILE: desktop/src/views/Providers/AddProvider/LoadingProviderIndicator.tsx
function LoadingProviderIndicator (line 3) | function LoadingProviderIndicator({ label }: Readonly<{ label: string | ...
FILE: desktop/src/views/Providers/AddProvider/OptionFormField.tsx
type TOptionFormField (line 17) | type TOptionFormField = TOptionWithID &
function OptionFormField (line 20) | function OptionFormField({
function wrapFunction (line 186) | function wrapFunction<TFn extends (event: any) => any>(
FILE: desktop/src/views/Providers/AddProvider/SetupClonedProvider.tsx
type TCloneProviderProps (line 21) | type TCloneProviderProps = Readonly<{
function SetupClonedProvider (line 27) | function SetupClonedProvider({ cloneProviderInfo, onFinish, reset }: TCl...
FILE: desktop/src/views/Providers/AddProvider/SetupProviderSourceForm.tsx
constant ALLOWED_NAMES_REGEX (line 53) | const ALLOWED_NAMES_REGEX = /^[a-z0-9\\-]+$/
constant DEFAULT_VAL_OPTS (line 54) | const DEFAULT_VAL_OPTS: SetValueConfig = {
type TSetupProviderSourceFormProps (line 59) | type TSetupProviderSourceFormProps = Readonly<{
function SetupProviderSourceForm (line 65) | function SetupProviderSourceForm({
type TCustomNameInputProps (line 443) | type TCustomNameInputProps = Readonly<{
function CustomNameInput (line 450) | function CustomNameInput({ field, isInvalid, onAccept, isDisabled }: TCu...
type TCustomProviderInputProps (line 479) | type TCustomProviderInputProps = Readonly<{
function CustomProviderInput (line 485) | function CustomProviderInput({ field, isInvalid, onAccept }: TCustomProv...
type TCommunityProviderInfo (line 536) | type TCommunityProviderInfo = Readonly<{
function mapCommunityProviderInfo (line 540) | function mapCommunityProviderInfo(
function stripDevpodPrefix (line 566) | function stripDevpodPrefix(rawCommunityProvider: string): string {
function sortCommunityProviderInfo (line 570) | function sortCommunityProviderInfo(a: TCommunityProviderInfo, b: TCommun...
FILE: desktop/src/views/Providers/AddProvider/SetupProviderSteps.tsx
type TSetupProviderStepsProps (line 10) | type TSetupProviderStepsProps = Readonly<{
function SetupProviderSteps (line 19) | function SetupProviderSteps({
FILE: desktop/src/views/Providers/AddProvider/helpers.ts
constant ALLOWED_NAMES_REGEX (line 3) | const ALLOWED_NAMES_REGEX = /^[a-z0-9\\-]+$/
function mergeProviderOptions (line 5) | function mergeProviderOptions(
FILE: desktop/src/views/Providers/AddProvider/types.ts
type TFormValues (line 7) | type TFormValues = {
type TCloneProviderInfo (line 12) | type TCloneProviderInfo = Readonly<{
type TSetupProviderResult (line 18) | type TSetupProviderResult = TWithProviderID &
FILE: desktop/src/views/Providers/AddProvider/useAddProvider.ts
type TAddUserMutationOptions (line 6) | type TAddUserMutationOptions = UseMutationOptions<
type TUseAddProvider (line 18) | type TUseAddProvider = Pick<TAddUserMutationOptions, "onSuccess" | "onEr...
function useAddProvider (line 19) | function useAddProvider({ onSuccess, onError }: TUseAddProvider) {
FILE: desktop/src/views/Providers/AddProvider/useProviderOptions.ts
type TOptionGroup (line 6) | type TOptionGroup = Readonly<{ options: TOptionWithID[] }> & Omit<TProvi...
type TAllOptions (line 7) | type TAllOptions = Readonly<{
function useProviderDisplayOptions (line 13) | function useProviderDisplayOptions(
function processDisplayOptions (line 27) | function processDisplayOptions(
function optionMatches (line 74) | function optionMatches(optionName: string, optionID: string): boolean {
FILE: desktop/src/views/Providers/AddProvider/useSetupProvider.ts
type TSetupProviderState (line 7) | type TSetupProviderState = Readonly<
type TCompleteSetupProviderAction (line 20) | type TCompleteSetupProviderAction = TAction<
type TActions (line 28) | type TActions =
function setupProviderReducer (line 38) | function setupProviderReducer(state: TSetupProviderState, action: TActio...
function useSetupProvider (line 56) | function useSetupProvider() {
FILE: desktop/src/views/Providers/ListProviders.tsx
type TProviderInfo (line 9) | type TProviderInfo = Readonly<{ id: TProviderID; data: TProvider }>
function ListProviders (line 10) | function ListProviders() {
FILE: desktop/src/views/Providers/Provider.tsx
function Provider (line 9) | function Provider() {
FILE: desktop/src/views/Providers/ProviderCard.tsx
type TProviderCardProps (line 43) | type TProviderCardProps = {
function ProviderCard (line 50) | function ProviderCard({ id, provider, remove }: TProviderCardProps) {
FILE: desktop/src/views/Providers/Providers.tsx
function Providers (line 6) | function Providers() {
FILE: desktop/src/views/Providers/helpers.ts
type TOptionWithID (line 4) | type TOptionWithID = Readonly<{
function getOptionValue (line 10) | function getOptionValue(option: TOptionWithID) {
function canCreateMachine (line 13) | function canCreateMachine(providerConfig: TProviderConfig | undefined | ...
function getOptionFallbackDisplayName (line 22) | function getOptionFallbackDisplayName(id: TOptionID) {
function getVisibleOptions (line 29) | function getVisibleOptions(
function mergeOptionDefinitions (line 52) | function mergeOptionDefinitions(
FILE: desktop/src/views/Providers/useDeleteProviderModal.tsx
function useDeleteProviderModal (line 18) | function useDeleteProviderModal(
FILE: desktop/src/views/Providers/useProviderTitle.tsx
function useProviderTitle (line 10) | function useProviderTitle(): TViewTitle | null {
FILE: desktop/src/views/Providers/useSetupProviderModal.tsx
function useSetupProviderModal (line 18) | function useSetupProviderModal() {
FILE: desktop/src/views/Settings/ClearableInput.tsx
type TClearableInputProps (line 5) | type TClearableInputProps = Readonly<{
function ClearableInput (line 11) | function ClearableInput({
FILE: desktop/src/views/Settings/Settings.tsx
constant SETTINGS_TABS (line 56) | const SETTINGS_TABS = [
function Settings (line 64) | function Settings() {
function GeneralSettings (line 89) | function GeneralSettings() {
function CustomizationSettings (line 167) | function CustomizationSettings() {
function AppearanceSettings (line 230) | function AppearanceSettings() {
function UpdateSettings (line 273) | function UpdateSettings() {
function ExperimentalSettings (line 376) | function ExperimentalSettings() {
type TSettingDescriptionProps (line 520) | type TSettingDescriptionProps = Readonly<{ children: ReactNode }>
function SettingDescription (line 521) | function SettingDescription({ children }: TSettingDescriptionProps) {
type TSettingSectionProps (line 529) | type TSettingSectionProps = Readonly<{
function SettingSection (line 535) | function SettingSection({
function SettingDivider (line 560) | function SettingDivider() {
FILE: desktop/src/views/Settings/useContextOptions.tsx
constant DEFAULT_DEVPOD_AGENT_URL (line 9) | const DEFAULT_DEVPOD_AGENT_URL = "https://github.com/loft-sh/devpod/rele...
function useContextOptions (line 11) | function useContextOptions() {
function useAgentURLOption (line 35) | function useAgentURLOption() {
function useTelemetryOption (line 70) | function useTelemetryOption() {
function useDockerCredentialsForwardingOption (line 100) | function useDockerCredentialsForwardingOption() {
function useGitCredentialsForwardingOption (line 126) | function useGitCredentialsForwardingOption() {
FILE: desktop/src/views/Settings/useIDESettings.tsx
function useIDESettings (line 8) | function useIDESettings() {
FILE: desktop/src/views/Settings/useSettingsOptions.tsx
function useCLIFlagsOption (line 7) | function useCLIFlagsOption() {
function useExtraEnvVarsOption (line 35) | function useExtraEnvVarsOption() {
function useDotfilesOption (line 71) | function useDotfilesOption() {
function useSSHKeySignatureOption (line 95) | function useSSHKeySignatureOption() {
function useProxyOptions (line 119) | function useProxyOptions() {
FILE: desktop/src/views/Workspaces/CreateWorkspace/CreateWorkspace.tsx
function CreateWorkspace (line 51) | function CreateWorkspace() {
type TProviderInputProps (line 445) | type TProviderInputProps = Readonly<{
function ProviderInput (line 450) | function ProviderInput({ options, field, onAddProviderClicked }: TProvid...
type TIDEInputProps (line 519) | type TIDEInputProps = Readonly<{
function IDEInput (line 524) | function IDEInput({ ides, field, onClick }: TIDEInputProps) {
FILE: desktop/src/views/Workspaces/CreateWorkspace/ProviderOptionsPopover.tsx
type TProviderOptionsPopoverProps (line 31) | type TProviderOptionsPopoverProps = Readonly<{ provider: TNamedProvider;...
function ProviderOptionsPopover (line 32) | function ProviderOptionsPopover({ provider, trigger }: TProviderOptionsP...
type TProviderOptionListProps (line 163) | type TProviderOptionListProps = Readonly<{ options: readonly TOptionWith...
function ProviderOptionList (line 165) | function ProviderOptionList({ options }: TProviderOptionListProps) {
FILE: desktop/src/views/Workspaces/CreateWorkspace/WorkspaceSourceInput.tsx
constant GIT_REPOSITORY_PATTERN (line 30) | const GIT_REPOSITORY_PATTERN =
constant GIT_REPOSITORY_REGEX (line 32) | const GIT_REPOSITORY_REGEX = new RegExp(GIT_REPOSITORY_PATTERN)
constant BRANCH_REGEX (line 33) | const BRANCH_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@([a-zA-Z0-9\...
constant COMMIT_REGEX (line 34) | const COMMIT_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@sha256:([a-z...
constant PR_REGEX (line 35) | const PR_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@pull\\/([0-9]+)\...
constant SUBPATH_REGEX (line 36) | const SUBPATH_REGEX = new RegExp(`^${GIT_REPOSITORY_PATTERN}@subpath:([a...
constant ADVANCED_GIT_SETTING_TABS (line 44) | const ADVANCED_GIT_SETTING_TABS = [
type TAdvancedGitSetting (line 50) | type TAdvancedGitSetting = (typeof AdvancedGitSetting)[keyof typeof Adva...
constant INITIAL_ADVANCED_SETTINGS (line 51) | const INITIAL_ADVANCED_SETTINGS = { option: AdvancedGitSetting.BRANCH, v...
constant SOURCE_TYPE_MAP (line 53) | const SOURCE_TYPE_MAP = {
type TWorkspaceSourceInputProps (line 61) | type TWorkspaceSourceInputProps = Readonly<{
function WorkspaceSourceInput (line 66) | function WorkspaceSourceInput({
function appendGitSetting (line 270) | function appendGitSetting(
function pruneGitSettings (line 293) | function pruneGitSettings(value: string): string {
function getAdvancedSettingsPlaceholder (line 302) | function getAdvancedSettingsPlaceholder(setting: TAdvancedGitSetting | u...
function parseAdvancedSettings (line 319) | function parseAdvancedSettings(value: string | undefined): {
FILE: desktop/src/views/Workspaces/CreateWorkspace/constants.ts
constant WORKSPACE_EXAMPLES (line 16) | const WORKSPACE_EXAMPLES = [
constant COMMUNITY_WORKSPACE_EXAMPLES (line 57) | const COMMUNITY_WORKSPACE_EXAMPLES = [
FILE: desktop/src/views/Workspaces/CreateWorkspace/types.ts
type TFormValues (line 14) | type TFormValues = {
type TCreateWorkspaceSearchParams (line 23) | type TCreateWorkspaceSearchParams = ReturnType<
type TCreateWorkspaceArgs (line 26) | type TCreateWorkspaceArgs = Readonly<{
type TSelectProviderOptions (line 34) | type TSelectProviderOptions = Readonly<{
FILE: desktop/src/views/Workspaces/CreateWorkspace/useCreateWorkspaceForm.tsx
constant DEFAULT_PREBUILD_REPOSITORY_KEY (line 27) | const DEFAULT_PREBUILD_REPOSITORY_KEY = "devpod-create-prebuild-repository"
constant DEFAULT_CONTAINER_PATH (line 28) | const DEFAULT_CONTAINER_PATH = "__internal-default"
function useCreateWorkspaceForm (line 30) | function useCreateWorkspaceForm(onCreateWorkspace: (args: TCreateWorkspa...
function isWorkspaceNameAvailable (line 254) | function isWorkspaceNameAvailable(workspaceID: string, workspaces: reado...
function useSelectDevcontainerModal (line 258) | function useSelectDevcontainerModal({
FILE: desktop/src/views/Workspaces/ListWorkspaces.tsx
type TWorkspacesInfo (line 33) | type TWorkspacesInfo = Readonly<{
function ListWorkspaces (line 37) | function ListWorkspaces() {
function getCurrentFilterCount (line 225) | function getCurrentFilterCount(filter: string[] | "all", total: number) {
function getProviderIcon (line 233) | function getProviderIcon(provider: TProvider, colorMode: ColorMode): str...
FILE: desktop/src/views/Workspaces/WorkspaceCard.tsx
type TWorkspaceCardProps (line 47) | type TWorkspaceCardProps = Readonly<{
function WorkspaceCard (line 53) | function WorkspaceCard({ workspaceID, isSelected, onSelectionChange }: T...
function getRunnerName (line 347) | function getRunnerName(workspace: TWorkspace, provider: TProvider | unde...
function getTemplate (line 361) | function getTemplate(workspace: TWorkspace, provider: TProvider | undefi...
function getTemplateOptions (line 375) | function getTemplateOptions(
FILE: desktop/src/views/Workspaces/WorkspaceControls.tsx
type TWorkspaceControlsProps (line 41) | type TWorkspaceControlsProps = Readonly<{
function WorkspaceControls (line 59) | function WorkspaceControls({
function useShareWorkspace (line 271) | function useShareWorkspace(
FILE: desktop/src/views/Workspaces/WorkspaceStatusBadge.tsx
type TWorkspaceStatusBadgeProps (line 7) | type TWorkspaceStatusBadgeProps = Readonly<{
function WorkspaceStatusBadge (line 14) | function WorkspaceStatusBadge({
FILE: desktop/src/views/Workspaces/Workspaces.tsx
function Workspaces (line 6) | function Workspaces() {
FILE: desktop/src/views/Workspaces/useWorkspaceTitle.tsx
function useWorkspaceTitle (line 9) | function useWorkspaceTitle(): TViewTitle | null {
FILE: desktop/update-window/src/main.tsx
function handleLaterClicked (line 10) | function handleLaterClicked() {
function handleRestartClicked (line 14) | function handleRestartClicked() {
function Root (line 18) | function Root() {
FILE: docs/src/components/Highlight/Highlight.js
class Highlight (line 4) | class Highlight extends React.Component {
method render (line 5) | render() {
FILE: docs/src/components/Step/Step.js
class Step (line 5) | class Step extends React.Component {
method render (line 6) | render() {
FILE: docs/src/pages/index.js
function Home (line 5) | function Home() {
FILE: e2e/e2e_suite_test.go
function TestRunE2ETests (line 32) | func TestRunE2ETests(t *testing.T) {
FILE: e2e/framework/command.go
method FindWorkspace (line 15) | func (f *Framework) FindWorkspace(ctx context.Context, id string) (*prov...
method DevPodListParsed (line 31) | func (f *Framework) DevPodListParsed(ctx context.Context) ([]*provider2....
method DevPodList (line 47) | func (f *Framework) DevPodList(ctx context.Context) (string, error) {
method DevPodUpStreams (line 57) | func (f *Framework) DevPodUpStreams(ctx context.Context, workspace strin...
method DevPodUpWithIDE (line 70) | func (f *Framework) DevPodUpWithIDE(ctx context.Context, additionalArgs ...
method DevPodBuild (line 81) | func (f *Framework) DevPodBuild(ctx context.Context, additionalArgs ...s...
method DevPodUp (line 92) | func (f *Framework) DevPodUp(ctx context.Context, additionalArgs ...stri...
method DevPodUpRecreate (line 103) | func (f *Framework) DevPodUpRecreate(ctx context.Context, additionalArgs...
method DevPodUpReset (line 114) | func (f *Framework) DevPodUpReset(ctx context.Context, additionalArgs .....
method DevPodSSH (line 125) | func (f *Framework) DevPodSSH(ctx context.Context, workspace string, com...
method DevPodSSHEchoTestString (line 133) | func (f *Framework) DevPodSSHEchoTestString(ctx context.Context, workspa...
method DevPodProviderOptionsCheckNamespaceDescription (line 141) | func (f *Framework) DevPodProviderOptionsCheckNamespaceDescription(ctx c...
method DevPodProviderList (line 149) | func (f *Framework) DevPodProviderList(ctx context.Context, extraArgs .....
method DevPodProviderUse (line 158) | func (f *Framework) DevPodProviderUse(ctx context.Context, provider stri...
method DevPodStatus (line 167) | func (f *Framework) DevPodStatus(ctx context.Context, extraArgs ...strin...
method DevPodStop (line 184) | func (f *Framework) DevPodStop(ctx context.Context, workspace string) er...
method DevPodProviderAdd (line 194) | func (f *Framework) DevPodProviderAdd(ctx context.Context, args ...strin...
method DevPodProviderDelete (line 204) | func (f *Framework) DevPodProviderDelete(ctx context.Context, args ...st...
method DevPodProviderUpdate (line 215) | func (f *Framework) DevPodProviderUpdate(ctx context.Context, args ...st...
method DevPodMachineCreate (line 225) | func (f *Framework) DevPodMachineCreate(args []string) error {
method DevPodMachineDelete (line 235) | func (f *Framework) DevPodMachineDelete(args []string) error {
method DevPodWorkspaceStop (line 245) | func (f *Framework) DevPodWorkspaceStop(ctx context.Context, extraArgs ....
method DevPodWorkspaceDelete (line 251) | func (f *Framework) DevPodWorkspaceDelete(ctx context.Context, workspace...
method SetupGPG (line 258) | func (f *Framework) SetupGPG(tmpDir string) error {
method DevPodSSHGpgTestKey (line 289) | func (f *Framework) DevPodSSHGpgTestKey(ctx context.Context, workspace s...
method DevpodPortTest (line 314) | func (f *Framework) DevpodPortTest(ctx context.Context, port strin
Copy disabled (too large)
Download .json
Condensed preview — 13349 files, each showing path, character count, and a content snippet. Download the .json file for the full structured content (17,139K chars).
[
{
"path": ".devcontainer/devcontainer.json",
"chars": 250,
"preview": "{\n \"name\": \"DevPod Development\",\n \"image\": \"ghcr.io/loft-sh/devpod:dev-6b64450abdb0ebc2ce7f663f9ff935c56679f8b6\",\n \"r"
},
{
"path": ".devcontainer/post_create.sh",
"chars": 393,
"preview": "\n#!/usr/bin/env bash\n\nset -euo pipefail\n\nlog() {\n echo \"[POST_CREATE] $*\"\n}\n\n# Start docker daemon. The script should'v"
},
{
"path": ".github/ISSUE_TEMPLATE/bug-report.md",
"chars": 906,
"preview": "---\nname: Bug report\nabout: Create a report to help us reproduce and fix a bug\nlabels:\n- kind/bug\n---\n\n<!-- Please use t"
},
{
"path": ".github/ISSUE_TEMPLATE/feature-request.md",
"chars": 254,
"preview": "---\nname: Feature request\nabout: Suggest an idea for this project\nlabels:\n- kind/feature\n---\n\n**Is your feature request "
},
{
"path": ".github/devcontainer/Dockerfile",
"chars": 1126,
"preview": "FROM mcr.microsoft.com/devcontainers/go:1.23-bullseye\n\nARG TARGETOS\nARG TARGETARCH\n\n# We want to setup our own user late"
},
{
"path": ".github/devcontainer/devcontainer.json",
"chars": 701,
"preview": "{\n \"name\": \"DevPod Development Image\",\n \"build\": {\n \"dockerfile\": \"Dockerfile\",\n \"context\": \".\"\n },\n \"features"
},
{
"path": ".github/licenses.tmpl",
"chars": 403,
"preview": "---\ntitle: Open Source Licenses\nsidebar_label: OSS Licenses\n---\n\n# Devpod dependencies\n\nThe following open source depend"
},
{
"path": ".github/workflows/build-devcontainer-image.yaml",
"chars": 2822,
"preview": "name: Build Dev Container\n\non:\n workflow_dispatch:\n push:\n branches:\n - \"main\"\n paths:\n - \".github/dev"
},
{
"path": ".github/workflows/e2e-tests.yaml",
"chars": 4013,
"preview": "name: E2E tests\n\non:\n release:\n types: [prereleased]\n workflow_dispatch: {}\n pull_request:\n branches:\n - m"
},
{
"path": ".github/workflows/e2e-win-full-tests.yaml",
"chars": 1849,
"preview": "name: E2E Win full tests\n\non:\n release:\n types: [prereleased]\n workflow_dispatch: {}\nconcurrency:\n group: ${{ gith"
},
{
"path": ".github/workflows/go-licenses-check.yaml",
"chars": 786,
"preview": "name: go-licenses-check\n\non:\n pull_request:\n branches:\n - main\n paths:\n - .github/workflows/go-licenses"
},
{
"path": ".github/workflows/go-licenses.yaml",
"chars": 1293,
"preview": "name: go-licenses\n\non:\n push:\n branches:\n - main\n paths:\n - .github/licenses.tmpl\n - .github/workf"
},
{
"path": ".github/workflows/golangci-lint.yaml",
"chars": 627,
"preview": "name: golangci-lint\n\non:\n push:\n tags:\n - v*\n branches:\n - master\n - main\n pull_request:\n\npermiss"
},
{
"path": ".github/workflows/release.yaml",
"chars": 29687,
"preview": "name: Publish release\non:\n release:\n types: [prereleased]\n\njobs:\n create-release:\n if: startsWith(github.ref, 'r"
},
{
"path": ".github/workflows/stale.yaml",
"chars": 985,
"preview": "name: Close inactive issues\non:\n schedule:\n - cron: \"30 1 * * *\"\n\njobs:\n close-issues:\n runs-on: ubuntu-latest\n "
},
{
"path": ".github/workflows/ui-ci.yaml",
"chars": 794,
"preview": "name: UI CI\n\non:\n workflow_dispatch: {}\n pull_request:\n branches:\n - main\n - release-*\n paths:\n -"
},
{
"path": ".github/workflows/unit-tests.yaml",
"chars": 702,
"preview": "name: Unit tests\n\non:\n workflow_dispatch: {}\n pull_request:\n types:\n - opened\n - reopened\n - synchro"
},
{
"path": ".gitignore",
"chars": 127,
"preview": "/.idea\n.DS_Store\n/test\n/e2e/bin\n/devpod\n/devpod.exe\n/devpod-cli\n# Unit test targets\n/main\n/profile.out\n/package-lock.jso"
},
{
"path": ".golangci.yaml",
"chars": 1051,
"preview": "linters:\n # We want to gradually introduce new linters to the project\n disable-all: true\n enable:\n - asasalint\n "
},
{
"path": ".vscode/launch.json",
"chars": 488,
"preview": "{\n // Use IntelliSense to learn about possible attributes.\n // Hover to view descriptions of existing attributes.\n"
},
{
"path": ".vscode/settings.json",
"chars": 161,
"preview": "{\n\t\"cSpell.words\": [\n\t\t\"devpod\",\n\t\t\"perrors\"\n\t],\n\t\"[mdx]\": {\n\t\t\"editor.wordWrap\": \"on\"\n\t},\n\t\"rust-analyzer.linkedProject"
},
{
"path": "COMMUNITY.md",
"chars": 993,
"preview": "# Community Calls \n\nThis repository contains the maintainer community calls from the DevPod Community. Join us on [Slack"
},
{
"path": "CONTRIBUTING.md",
"chars": 2729,
"preview": "# Development\n\n## Development Setup\n\n1. Clone the repository locally\n2. If you want to change something in DevPod agent "
},
{
"path": "LICENSE",
"chars": 16725,
"preview": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\""
},
{
"path": "Makefile",
"chars": 978,
"preview": "GOOS := $(shell go env GOOS)\nGOARCH := $(shell go env GOARCH)\nSKIP_INSTALL := false\n\n# Platform host\nPLATFORM_HOST := lo"
},
{
"path": "README.md",
"chars": 4022,
"preview": "<br>\n<a href=\"https://www.devpod.sh\">\n <picture width=\"500\">\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"d"
},
{
"path": "SECURITY.md",
"chars": 927,
"preview": "# Security Policy\nWe will disclose fixes for vulnerabilities in the release notes and urge you to upgrade once a new rel"
},
{
"path": "cmd/agent/agent.go",
"chars": 2170,
"preview": "package agent\n\nimport (\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent/container\"\n\t\"github.com/loft-sh/devpod/cmd/agent/wo"
},
{
"path": "cmd/agent/container/container.go",
"chars": 674,
"preview": "package container\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewContainerCmd retur"
},
{
"path": "cmd/agent/container/credentials_server.go",
"chars": 5862,
"preview": "package container\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"strconv\"\n\n\t\"github.com/"
},
{
"path": "cmd/agent/container/daemon.go",
"chars": 8201,
"preview": "package container\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"os/signal\"\n\t\"string"
},
{
"path": "cmd/agent/container/openvscode_async.go",
"chars": 1644,
"preview": "package container\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/com"
},
{
"path": "cmd/agent/container/setup.go",
"chars": 21831,
"preview": "//go:build !windows\n\npackage container\n\nimport (\n\t\"context\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"ne"
},
{
"path": "cmd/agent/container/setup_loft_platform_access.go",
"chars": 2658,
"preview": "package container\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/credentials\"\n"
},
{
"path": "cmd/agent/container/setup_windows.go",
"chars": 397,
"preview": "//go:build windows\n\npackage container\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc"
},
{
"path": "cmd/agent/container/ssh_server.go",
"chars": 2206,
"preview": "package container\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\thelperssh \"github.com"
},
{
"path": "cmd/agent/container/vscode_async.go",
"chars": 2329,
"preview": "package container\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/com"
},
{
"path": "cmd/agent/container_tunnel.go",
"chars": 3817,
"preview": "package agent\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent/w"
},
{
"path": "cmd/agent/daemon.go",
"chars": 5767,
"preview": "package agent\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/f"
},
{
"path": "cmd/agent/docker_credentials.go",
"chars": 6293,
"preview": "package agent\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"st"
},
{
"path": "cmd/agent/git_credentials.go",
"chars": 4513,
"preview": "package agent\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"st"
},
{
"path": "cmd/agent/git_ssh_signature.go",
"chars": 1843,
"preview": "package agent\n\nimport (\n\t\"errors\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/gitsshsigning\""
},
{
"path": "cmd/agent/git_ssh_signature_helper.go",
"chars": 1519,
"preview": "package agent\n\nimport (\n\t\"fmt\"\n\t\"os/user\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/gitssh"
},
{
"path": "cmd/agent/workspace/build.go",
"chars": 2958,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/age"
},
{
"path": "cmd/agent/workspace/delete.go",
"chars": 2835,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/"
},
{
"path": "cmd/agent/workspace/install_dotfiles.go",
"chars": 4554,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/fla"
},
{
"path": "cmd/agent/workspace/logs.go",
"chars": 1387,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/"
},
{
"path": "cmd/agent/workspace/logs_daemon.go",
"chars": 1401,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"io\"\n\t\"os\"\n\t\"path/filepath\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com"
},
{
"path": "cmd/agent/workspace/setup_gpg.go",
"chars": 4150,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/lo"
},
{
"path": "cmd/agent/workspace/status.go",
"chars": 1716,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/de"
},
{
"path": "cmd/agent/workspace/stop.go",
"chars": 1691,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/ag"
},
{
"path": "cmd/agent/workspace/up.go",
"chars": 14930,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strconv\"\n\n\t\"github.co"
},
{
"path": "cmd/agent/workspace/update_config.go",
"chars": 1108,
"preview": "package workspace\n\nimport (\n\t\"context\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/agent\"\n\t\""
},
{
"path": "cmd/agent/workspace/workspace.go",
"chars": 786,
"preview": "package workspace\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewWorkspaceCmd retur"
},
{
"path": "cmd/build.go",
"chars": 7728,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/"
},
{
"path": "cmd/completion/suggestions.go",
"chars": 3003,
"preview": "package completion\n\nimport (\n\t\"strings\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/"
},
{
"path": "cmd/context/context.go",
"chars": 571,
"preview": "package context\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewContextCmd returns a"
},
{
"path": "cmd/context/create.go",
"chars": 3686,
"preview": "package context\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devp"
},
{
"path": "cmd/context/delete.go",
"chars": 1651,
"preview": "package context\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/conf"
},
{
"path": "cmd/context/list.go",
"chars": 2062,
"preview": "package context\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n"
},
{
"path": "cmd/context/options.go",
"chars": 2249,
"preview": "package context\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.co"
},
{
"path": "cmd/context/set_options.go",
"chars": 1658,
"preview": "package context\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/conf"
},
{
"path": "cmd/context/use.go",
"chars": 1444,
"preview": "package context\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/conf"
},
{
"path": "cmd/delete.go",
"chars": 2993,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/devpod/cmd/fla"
},
{
"path": "cmd/export.go",
"chars": 2715,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-"
},
{
"path": "cmd/flags/flags.go",
"chars": 1517,
"preview": "package flags\n\nimport (\n\t\"github.com/loft-sh/devpod/pkg/platform\"\n\tflag \"github.com/spf13/pflag\"\n)\n\ntype GlobalFlags str"
},
{
"path": "cmd/helper/check_provider_update.go",
"chars": 3008,
"preview": "package helper\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/blang/semver\"\n\t\"github.com"
},
{
"path": "cmd/helper/docker_credentials.go",
"chars": 1014,
"preview": "package helper\n\nimport (\n\t\"fmt\"\n\t\"os/user\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/crede"
},
{
"path": "cmd/helper/fleet_helper.go",
"chars": 1879,
"preview": "package helper\n\nimport (\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"g"
},
{
"path": "cmd/helper/get_image.go",
"chars": 960,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh"
},
{
"path": "cmd/helper/get_provider_name.go",
"chars": 1202,
"preview": "package helper\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/"
},
{
"path": "cmd/helper/get_workspace_config.go",
"chars": 2977,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"gith"
},
{
"path": "cmd/helper/get_workspace_name.go",
"chars": 925,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/file\""
},
{
"path": "cmd/helper/get_workspace_uid.go",
"chars": 755,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/encod"
},
{
"path": "cmd/helper/helper.go",
"chars": 1455,
"preview": "package helper\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/agent\"\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft"
},
{
"path": "cmd/helper/http/http.go",
"chars": 349,
"preview": "package http\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewHTTPCmd returns a new c"
},
{
"path": "cmd/helper/http/request.go",
"chars": 2080,
"preview": "package http\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"os\"\n\t\"strings\"\n\n\tdevpodhttp \"github.com/loft-sh/devpod/pkg/"
},
{
"path": "cmd/helper/json/get.go",
"chars": 1719,
"preview": "package json\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/PaesslerAG/jsonpath\"\n\t\"gi"
},
{
"path": "cmd/helper/json/json.go",
"chars": 345,
"preview": "package json\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewJSONCmd returns a new c"
},
{
"path": "cmd/helper/sh.go",
"chars": 1254,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/pkg/shell\"\n\t\"github.com/spf13/cobra\"\n)\n\nty"
},
{
"path": "cmd/helper/ssh_client.go",
"chars": 1970,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"os\"\n\n\tcommand2 \"github.com/loft-sh/devpod/pkg/command\"\n\t\"github.com/pkg/errors\"\n\t\""
},
{
"path": "cmd/helper/ssh_git_clone.go",
"chars": 2520,
"preview": "package helper\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"strings\"\n\n\tcommand2 \"github.com/loft-sh/devpod/pkg/command\"\n\t\""
},
{
"path": "cmd/helper/ssh_server.go",
"chars": 3892,
"preview": "package helper\n\nimport (\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/lo"
},
{
"path": "cmd/helper/strings/strings.go",
"chars": 332,
"preview": "package strings\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewStringsCmd returns a"
},
{
"path": "cmd/ide/ide.go",
"chars": 439,
"preview": "package ide\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewIDECmd returns a new com"
},
{
"path": "cmd/ide/list.go",
"chars": 2117,
"preview": "package ide\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"gi"
},
{
"path": "cmd/ide/options.go",
"chars": 2344,
"preview": "package ide\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/lo"
},
{
"path": "cmd/ide/set_options.go",
"chars": 1531,
"preview": "package ide\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/p"
},
{
"path": "cmd/ide/use.go",
"chars": 2376,
"preview": "package ide\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/p"
},
{
"path": "cmd/import.go",
"chars": 9141,
"preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/"
},
{
"path": "cmd/list.go",
"chars": 2772,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"githu"
},
{
"path": "cmd/logs.go",
"chars": 3581,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/de"
},
{
"path": "cmd/logs_daemon.go",
"chars": 1983,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/cl"
},
{
"path": "cmd/machine/create.go",
"chars": 1306,
"preview": "package machine\n\nimport (\n\t\"context\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/client\"\n\t\"g"
},
{
"path": "cmd/machine/delete.go",
"chars": 2083,
"preview": "package machine\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/clie"
},
{
"path": "cmd/machine/inspect.go",
"chars": 1510,
"preview": "package machine\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-s"
},
{
"path": "cmd/machine/list.go",
"chars": 2636,
"preview": "package machine\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"sort\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/flag"
},
{
"path": "cmd/machine/machine.go",
"chars": 657,
"preview": "package machine\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewMachineCmd returns a"
},
{
"path": "cmd/machine/ssh.go",
"chars": 5516,
"preview": "package machine\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\tdevagent \"github.com/lo"
},
{
"path": "cmd/machine/start.go",
"chars": 1122,
"preview": "package machine\n\nimport (\n\t\"context\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/client\"\n\t\"g"
},
{
"path": "cmd/machine/status.go",
"chars": 2599,
"preview": "package machine\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-s"
},
{
"path": "cmd/machine/stop.go",
"chars": 1110,
"preview": "package machine\n\nimport (\n\t\"context\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/client\"\n\t\"g"
},
{
"path": "cmd/ping.go",
"chars": 1498,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/devpod/c"
},
{
"path": "cmd/pro/add/add.go",
"chars": 387,
"preview": "package add\n\nimport (\n\tproflags \"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewAddCmd crea"
},
{
"path": "cmd/pro/add/cluster.go",
"chars": 9432,
"preview": "package add\n\nimport (\n\t\"cmp\"\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"time\"\n\n\t\"github.com/loft-sh/log\"\n\t\"github.co"
},
{
"path": "cmd/pro/check_health.go",
"chars": 2151,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent\"\n\t\"github.com/loft-sh/devpod/cmd"
},
{
"path": "cmd/pro/check_update.go",
"chars": 2250,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent\"\n\t\"github.com/loft-sh/de"
},
{
"path": "cmd/pro/completion/suggestions.go",
"chars": 921,
"preview": "package completion\n\nimport (\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/pkg/config\"\n\t\"github.com/loft-sh/devpod/pkg/platfor"
},
{
"path": "cmd/pro/create_workspace.go",
"chars": 2133,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/daemon/daemon.go",
"chars": 1090,
"preview": "package daemon\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod/pkg/c"
},
{
"path": "cmd/pro/daemon/netcheck.go",
"chars": 2770,
"preview": "package daemon\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent\"\n\t\"github.com/loft-sh/devpo"
},
{
"path": "cmd/pro/daemon/start.go",
"chars": 4390,
"preview": "package daemon\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"syscall\"\n\n\tmanagementv"
},
{
"path": "cmd/pro/daemon/status.go",
"chars": 2112,
"preview": "package daemon\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\tplatformdaemon \"github.com/loft-sh/devpod/pkg/daemon/platf"
},
{
"path": "cmd/pro/delete.go",
"chars": 4862,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\tproflags \"github.com/loft-sh/devpod/cmd/pro/flags\"\n\tprov"
},
{
"path": "cmd/pro/flags/flags.go",
"chars": 559,
"preview": "package flags\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/platform/client\"\n\tflag \"g"
},
{
"path": "cmd/pro/import_workspace.go",
"chars": 8677,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\n\tproflags \"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/lof"
},
{
"path": "cmd/pro/list.go",
"chars": 4370,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\t\"time\"\n\n\tproflags \"github.com/loft-sh/devpod/cmd/pro/f"
},
{
"path": "cmd/pro/list_clusters.go",
"chars": 2043,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/list_projects.go",
"chars": 1795,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/list_templates.go",
"chars": 2053,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/list_workspaces.go",
"chars": 1778,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/login.go",
"chars": 10118,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/blang/semver\"\n\tproflags \"github.com/loft-sh/"
},
{
"path": "cmd/pro/pro.go",
"chars": 3000,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/cmd/pr"
},
{
"path": "cmd/pro/provider/create/create.go",
"chars": 388,
"preview": "package create\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewCmd creates a new"
},
{
"path": "cmd/pro/provider/create/workspace.go",
"chars": 4298,
"preview": "package create\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tmanagementv1 \"github.com/loft-sh/api/v4/pkg/ap"
},
{
"path": "cmd/pro/provider/delete.go",
"chars": 1661,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-s"
},
{
"path": "cmd/pro/provider/get/get.go",
"chars": 460,
"preview": "package get\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewCmd creates a new co"
},
{
"path": "cmd/pro/provider/get/self.go",
"chars": 1052,
"preview": "package get\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"githu"
},
{
"path": "cmd/pro/provider/get/version.go",
"chars": 2400,
"preview": "package get\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"githu"
},
{
"path": "cmd/pro/provider/get/workspace.go",
"chars": 1304,
"preview": "package get\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-s"
},
{
"path": "cmd/pro/provider/health.go",
"chars": 1531,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/loft-sh/d"
},
{
"path": "cmd/pro/provider/list/clusters.go",
"chars": 1846,
"preview": "package list\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\tmanagementv1 \"github.com/loft-sh/api/v4/pkg/apis/manag"
},
{
"path": "cmd/pro/provider/list/list.go",
"chars": 513,
"preview": "package list\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewCmd creates a new c"
},
{
"path": "cmd/pro/provider/list/projects.go",
"chars": 1762,
"preview": "package list\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\n\tmanagementv1 \"github.com/loft-sh/api/v4/pkg/apis/management/"
},
{
"path": "cmd/pro/provider/list/templates.go",
"chars": 6714,
"preview": "package list\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/blang/semv"
},
{
"path": "cmd/pro/provider/list/workspaces.go",
"chars": 2603,
"preview": "package list\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\tmanagementv1 \"github.com/loft-sh/api/v4/pkg/apis/manag"
},
{
"path": "cmd/pro/provider/provider.go",
"chars": 2247,
"preview": "package provider\n\nimport (\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent\"\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"gi"
},
{
"path": "cmd/pro/provider/rebuild.go",
"chars": 1951,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flag"
},
{
"path": "cmd/pro/provider/ssh.go",
"chars": 1668,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-s"
},
{
"path": "cmd/pro/provider/status.go",
"chars": 2087,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tstoragev1 \"github.com/loft-sh/api/v4/pkg/api"
},
{
"path": "cmd/pro/provider/stop.go",
"chars": 1744,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tstoragev1 \"github.com/loft-sh/api/v4/pkg/apis/storage/v1\"\n\n\t\""
},
{
"path": "cmd/pro/provider/up.go",
"chars": 4343,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\""
},
{
"path": "cmd/pro/provider/update/update.go",
"chars": 388,
"preview": "package update\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewCmd creates a new"
},
{
"path": "cmd/pro/provider/update/workspace.go",
"chars": 3433,
"preview": "package update\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\n\tmanagementv1 \"github.com/loft-sh/api/v4/pkg/ap"
},
{
"path": "cmd/pro/provider/watch/watch.go",
"chars": 386,
"preview": "package watch\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewCmd creates a new "
},
{
"path": "cmd/pro/provider/watch/workspaces.go",
"chars": 9225,
"preview": "package watch\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"sync\"\n\t\"time\"\n\n\tmanagementv1 \"github.com/loft-s"
},
{
"path": "cmd/pro/rebuild.go",
"chars": 2219,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"net/url\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\""
},
{
"path": "cmd/pro/reset/password.go",
"chars": 5344,
"preview": "package reset\n\nimport (\n\t\"context\"\n\t\"crypto/sha256\"\n\t\"fmt\"\n\t\"strings\"\n\n\tstoragev1 \"github.com/loft-sh/api/v4/pkg/apis/st"
},
{
"path": "cmd/pro/reset/reset.go",
"chars": 359,
"preview": "package reset\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewResetCmd creates a"
},
{
"path": "cmd/pro/self.go",
"chars": 1679,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/sleep.go",
"chars": 4056,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\tclusterv1 \"github.com/loft-sh/agentapi/v4/pkg/apis/loft/clu"
},
{
"path": "cmd/pro/start.go",
"chars": 50628,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"crypto/tls\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\""
},
{
"path": "cmd/pro/update_provider.go",
"chars": 2312,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\tprovidercmd \"github.com/"
},
{
"path": "cmd/pro/update_workspace.go",
"chars": 2169,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/version.go",
"chars": 1900,
"preview": "package pro\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"github.com/loft-sh/devpod"
},
{
"path": "cmd/pro/wakeup.go",
"chars": 3880,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strconv\"\n\t\"time\"\n\n\tclusterv1 \"github.com/loft-sh/agentapi/v4/pkg/apis/loft/clu"
},
{
"path": "cmd/pro/watch_workspaces.go",
"chars": 2536,
"preview": "package pro\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com/loft-sh/devpod/cmd/pro/flags\"\n\t\"gith"
},
{
"path": "cmd/profile.go",
"chars": 645,
"preview": "//go:build profile\n\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"net/http\"\n\t\"net/http/pprof\"\n\t\"os\"\n)\n\nfunc init() {\n\tgo func() "
},
{
"path": "cmd/provider/add.go",
"chars": 4906,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/dev"
},
{
"path": "cmd/provider/delete.go",
"chars": 4270,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/dev"
},
{
"path": "cmd/provider/list-default-providers.go",
"chars": 1596,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/loft-sh/devpod/"
},
{
"path": "cmd/provider/list.go",
"chars": 2971,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\""
},
{
"path": "cmd/provider/options.go",
"chars": 4440,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"sort\"\n\t\"strconv\"\n\n\t\"github.com/loft-sh/devpod/cmd/comple"
},
{
"path": "cmd/provider/provider.go",
"chars": 683,
"preview": "package provider\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/spf13/cobra\"\n)\n\n// NewProviderCmd returns"
},
{
"path": "cmd/provider/set_options.go",
"chars": 3241,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/dev"
},
{
"path": "cmd/provider/update.go",
"chars": 2204,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/pkg/con"
},
{
"path": "cmd/provider/use.go",
"chars": 5926,
"preview": "package provider\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/dev"
},
{
"path": "cmd/root.go",
"chars": 4582,
"preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\n\t\"github.com/loft-sh/devpod/cmd/agent\"\n\t\"github.com/loft-sh/devpod/cmd/co"
},
{
"path": "cmd/ssh.go",
"chars": 21373,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"encoding/base64\"\n\t\"fmt\"\n\t\"io\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t"
},
{
"path": "cmd/status.go",
"chars": 3727,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.c"
},
{
"path": "cmd/stop.go",
"chars": 3860,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/cmd/completion\"\n\t\"github.com/loft-sh/devpod/cmd/fla"
},
{
"path": "cmd/troubleshoot.go",
"chars": 8769,
"preview": "package cmd\n\nimport (\n\t\"context\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\n\tmanagementv1 \"github.com/loft-sh/api/v4/pkg/apis/ma"
},
{
"path": "cmd/up.go",
"chars": 42890,
"preview": "package cmd\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"net\"\n\t\"os\"\n\t\"os/exec\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"slices\"\n\t"
},
{
"path": "cmd/upgrade.go",
"chars": 944,
"preview": "package cmd\n\nimport (\n\t\"github.com/loft-sh/devpod/pkg/upgrade\"\n\t\"github.com/loft-sh/log\"\n\t\"github.com/pkg/errors\"\n\t\"gith"
},
{
"path": "cmd/use/use.go",
"chars": 595,
"preview": "package use\n\nimport (\n\t\"github.com/loft-sh/devpod/cmd/flags\"\n\t\"github.com/loft-sh/devpod/cmd/ide\"\n\t\"github.com/loft-sh/d"
},
{
"path": "cmd/version.go",
"chars": 572,
"preview": "package cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/loft-sh/devpod/pkg/version\"\n\t\"github.com/spf13/cobra\"\n)\n\n// VersionCmd holds "
},
{
"path": "community.yaml",
"chars": 718,
"preview": "providers:\n - repository: https://github.com/alexandrevilain/devpod-provider-ovhcloud\n - repository: https://github.co"
},
{
"path": "desktop/.gitignore",
"chars": 280,
"preview": "# Logs\nlogs\n*.log\nnpm-debug.log*\nyarn-debug.log*\nyarn-error.log*\npnpm-debug.log*\nlerna-debug.log*\n\nnode_modules\ndist\ndis"
},
{
"path": "desktop/.npmrc",
"chars": 16,
"preview": "save-exact=true\n"
},
{
"path": "desktop/.prettierignore",
"chars": 35,
"preview": "/src-tauri\n/public\n/.vscode\n/dist\n\n"
},
{
"path": "desktop/.prettierrc",
"chars": 161,
"preview": "{\n \"trailingComma\": \"es5\",\n \"printWidth\": 100,\n \"tabWidth\": 2,\n \"semi\": false,\n \"singleQuote\": false,\n \"bracketSpa"
},
{
"path": "desktop/.vscode/extensions.json",
"chars": 80,
"preview": "{\n \"recommendations\": [\"tauri-apps.tauri-vscode\", \"rust-lang.rust-analyzer\"]\n}\n"
},
{
"path": "desktop/README.md",
"chars": 3160,
"preview": "# Devpod Desktop\n\n[Open Example Devpod](devpod://open?workspace=vscode-remote-try-go&source=https://github.com/Microsoft"
},
{
"path": "desktop/eslint.config.js",
"chars": 2778,
"preview": "import { fixupConfigRules, fixupPluginRules } from \"@eslint/compat\"\nimport react from \"eslint-plugin-react\"\nimport types"
},
{
"path": "desktop/flatpak/DevPod.metainfo.xml",
"chars": 1818,
"preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<component type=\"desktop-application\">\n <id>sh.loft.devpod</id>\n\n <name>Devpod<"
},
{
"path": "desktop/flatpak/sh.loft.devpod.tmpl",
"chars": 2325,
"preview": "id: sh.loft.devpod\n\nruntime: org.gnome.Platform\nruntime-version: '47'\nsdk: org.gnome.Sdk\n\ncommand: \"sh.loft.devpod\"\nfini"
},
{
"path": "desktop/index.html",
"chars": 356,
"preview": "<!doctype html>\n<html lang=\"en\">\n <head>\n <meta charset=\"UTF-8\" />\n <link rel=\"icon\" type=\"image/svg+xml\" href=\"/"
},
{
"path": "desktop/package.json",
"chars": 3250,
"preview": "{\n \"name\": \"devpod\",\n \"private\": true,\n \"version\": \"0.0.0\",\n \"type\": \"module\",\n \"scripts\": {\n \"dev\": \"vite\",\n "
},
{
"path": "desktop/src/App/App.tsx",
"chars": 2542,
"preview": "import { Box, Code, Container, Link, Text, VStack, useColorModeValue } from \"@chakra-ui/react\"\nimport { useEffect, useMe"
},
{
"path": "desktop/src/App/Changelog.tsx",
"chars": 1379,
"preview": "import { Box, Heading, Link, ListItem, UnorderedList } from \"@chakra-ui/react\"\nimport Markdown from \"markdown-to-jsx\"\nim"
},
{
"path": "desktop/src/App/OSSApp.tsx",
"chars": 9839,
"preview": "import { client } from \"@/client\"\nimport { QueryKeys } from \"@/queryKeys\"\nimport {\n Box,\n Flex,\n Grid,\n GridItem,\n "
},
{
"path": "desktop/src/App/ProApp.tsx",
"chars": 8904,
"preview": "import { STATUS_BAR_HEIGHT } from \"@/constants\"\nimport { ProviderProvider } from \"@/contexts/DevPodContext/DevPodProvide"
},
{
"path": "desktop/src/App/constants.ts",
"chars": 252,
"preview": "import { BoxProps } from \"@chakra-ui/react\"\nimport { isLinux, isMacOS, isWindows } from \"../lib\"\n\nexport const showTitle"
},
{
"path": "desktop/src/App/index.ts",
"chars": 39,
"preview": "export { App, ErrorPage } from \"./App\"\n"
},
{
"path": "desktop/src/App/useAppReady.tsx",
"chars": 15124,
"preview": "import { QueryKeys } from \"@/queryKeys\"\nimport { TProInstance } from \"@/types\"\nimport {\n Button,\n HStack,\n Modal,\n M"
},
{
"path": "desktop/src/App/useChangelogModal.tsx",
"chars": 2038,
"preview": "import {\n Button,\n Modal,\n ModalBody,\n ModalCloseButton,\n ModalContent,\n ModalFooter,\n ModalHeader,\n ModalOverla"
},
{
"path": "desktop/src/App/usePreserveLocation.tsx",
"chars": 1046,
"preview": "import { useEffect } from \"react\"\nimport { Location, matchRoutes, useLocation } from \"react-router\"\nimport { client } fr"
},
{
"path": "desktop/src/ProRoot.tsx",
"chars": 93,
"preview": "import { Outlet } from \"react-router-dom\"\n\nexport function ProRoot() {\n return <Outlet />\n}\n"
},
{
"path": "desktop/src/Theme/ThemeProvider.tsx",
"chars": 1070,
"preview": "import { ChakraProvider, Theme, ToastProviderProps, extendTheme } from \"@chakra-ui/react\"\nimport { ReactNode, useEffect,"
},
{
"path": "desktop/src/Theme/button.ts",
"chars": 4017,
"preview": "import { defineStyleConfig } from \"@chakra-ui/react\"\nimport { mode } from \"@chakra-ui/theme-tools\"\nimport { theme as def"
}
]
// ... and 13149 more files (download for full content)
About this extraction
This page contains the full source code of the loft-sh/devpod GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 13349 files (104.8 MB), approximately 4.8M tokens, and a symbol index with 25041 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.