Full Code of semaphoreui/semaphore for AI

develop 64749e880b1d cached
722 files
6.4 MB
1.7M tokens
10498 symbols
1 requests
Download .txt
Showing preview only (6,867K chars total). Download the full file or copy to clipboard to get everything.
Repository: semaphoreui/semaphore
Branch: develop
Commit: 64749e880b1d
Files: 722
Total size: 6.4 MB

Directory structure:
gitextract_0gdlbcvx/

├── .codacy.yml
├── .cursorignore
├── .devcontainer/
│   ├── config-runner.json
│   ├── config.json
│   ├── devcontainer.json
│   └── postCreateCommand.sh
├── .dockerignore
├── .dredd/
│   ├── dredd.docker.yml
│   ├── dredd.local.yml
│   ├── dredd.testing.yml
│   ├── dredd.windows.yml
│   ├── hooks/
│   │   ├── capabilities.go
│   │   ├── helpers.go
│   │   └── main.go
│   └── server-wrapper.sh
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   ├── problem.yml
│   │   └── question.yml
│   ├── copilot-instructions.md
│   └── workflows/
│       ├── community_beta.yml
│       ├── community_release.yml
│       ├── dev.yml
│       ├── pro_selfhosted_beta.yml
│       └── pro_selfhosted_release.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── .postman/
│   ├── api
│   ├── api_4023cf7c-aabb-4d5a-a742-72dadbd4924a
│   ├── api_5306c424-9fc0-4923-be37-fbda305ca8de
│   ├── api_9a8524cc-4892-4b54-a6b3-1ef18d907626
│   └── postman/
│       └── collections/
│           └── Semaphore API.json
├── .vscode/
│   └── launch.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── TERRAFORM_ARGS_IMPROVEMENT.md
├── Taskfile.yml
├── api/
│   ├── api_test.go
│   ├── apps.go
│   ├── apps_test.go
│   ├── auth.go
│   ├── cache.go
│   ├── debug/
│   │   ├── gc.go
│   │   └── pprof.go
│   ├── events.go
│   ├── helpers/
│   │   ├── context.go
│   │   ├── event_log.go
│   │   ├── helpers.go
│   │   ├── helpers_test.go
│   │   ├── query_params.go
│   │   ├── route_params.go
│   │   └── write_response.go
│   ├── integration.go
│   ├── integration_test.go
│   ├── login.go
│   ├── login_test.go
│   ├── options.go
│   ├── projects/
│   │   ├── backup_restore.go
│   │   ├── environment.go
│   │   ├── integration.go
│   │   ├── integration_alias.go
│   │   ├── integration_extract_value.go
│   │   ├── integration_matcher.go
│   │   ├── inventory.go
│   │   ├── inventory_test.go
│   │   ├── keys.go
│   │   ├── project.go
│   │   ├── projects.go
│   │   ├── repository.go
│   │   ├── schedules.go
│   │   ├── secret_storages.go
│   │   ├── tasks.go
│   │   ├── templates.go
│   │   ├── users.go
│   │   └── views.go
│   ├── router.go
│   ├── runners/
│   │   └── runners.go
│   ├── runners.go
│   ├── sockets/
│   │   ├── handler.go
│   │   └── pool.go
│   ├── system_info.go
│   ├── tasks/
│   │   └── tasks.go
│   ├── user.go
│   └── users.go
├── api-docs.yml
├── cli/
│   ├── cmd/
│   │   ├── migrate.go
│   │   ├── project.go
│   │   ├── project_export.go
│   │   ├── project_import.go
│   │   ├── root.go
│   │   ├── runner.go
│   │   ├── runner_register.go
│   │   ├── runner_setup.go
│   │   ├── runner_start.go
│   │   ├── runner_unregister.go
│   │   ├── server.go
│   │   ├── setup.go
│   │   ├── syslog.go
│   │   ├── syslog_windows.go
│   │   ├── token.go
│   │   ├── user.go
│   │   ├── user_add.go
│   │   ├── user_change.go
│   │   ├── user_delete.go
│   │   ├── user_get.go
│   │   ├── user_list.go
│   │   ├── user_totp.go
│   │   ├── vault.go
│   │   ├── vault_rekey.go
│   │   └── version.go
│   ├── main.go
│   └── setup/
│       └── setup.go
├── db/
│   ├── APIToken.go
│   ├── AccessKey.go
│   ├── Alias.go
│   ├── BackupEntity.go
│   ├── Environment.go
│   ├── Environment_test.go
│   ├── Event.go
│   ├── ExportEntityType.go
│   ├── Integration.go
│   ├── Inventory.go
│   ├── Migration.go
│   ├── Option.go
│   ├── Project.go
│   ├── ProjectInvite.go
│   ├── ProjectInvite_test.go
│   ├── ProjectStats.go
│   ├── ProjectUser.go
│   ├── ProjectUser_test.go
│   ├── Repository.go
│   ├── Repository_test.go
│   ├── Role.go
│   ├── Runner.go
│   ├── Schedule.go
│   ├── SecretStorage.go
│   ├── Session.go
│   ├── Store.go
│   ├── Store_test.go
│   ├── Task.go
│   ├── TaskParams.go
│   ├── Template.go
│   ├── TemplateVault.go
│   ├── Template_alias.go
│   ├── TerraformInventoryAlias.go
│   ├── TerraformInventoryState_pro.go
│   ├── TerraformInventoryStore_pro.go
│   ├── User.go
│   ├── View.go
│   ├── ansible.go
│   ├── bolt/
│   │   ├── BoltDb.go
│   │   ├── BoltDb_test.go
│   │   ├── Task_test.go
│   │   ├── access_key.go
│   │   ├── environment.go
│   │   ├── event.go
│   │   ├── global_runner.go
│   │   ├── global_runner_test.go
│   │   ├── integrations.go
│   │   ├── integrations_alias.go
│   │   ├── inventory.go
│   │   ├── migration.go
│   │   ├── migration_2_10_12.go
│   │   ├── migration_2_10_12_test.go
│   │   ├── migration_2_10_16.go
│   │   ├── migration_2_10_16_test.go
│   │   ├── migration_2_10_24.go
│   │   ├── migration_2_10_24_test.go
│   │   ├── migration_2_10_33.go
│   │   ├── migration_2_10_33_test.go
│   │   ├── migration_2_14_7.go
│   │   ├── migration_2_14_7_test.go
│   │   ├── migration_2_17_0.go
│   │   ├── migration_2_17_0_test.go
│   │   ├── migration_2_17_2.go
│   │   ├── migration_2_8_28.go
│   │   ├── migration_2_8_28_test.go
│   │   ├── migration_2_8_40.go
│   │   ├── migration_2_8_40_test.go
│   │   ├── migration_2_8_91.go
│   │   ├── migration_2_8_91_test.go
│   │   ├── option.go
│   │   ├── option_test.go
│   │   ├── project.go
│   │   ├── project_invite.go
│   │   ├── project_test.go
│   │   ├── public_alias.go
│   │   ├── repository.go
│   │   ├── role.go
│   │   ├── runner_pro.go
│   │   ├── runner_pro_test.go
│   │   ├── schedule.go
│   │   ├── secret_storage.go
│   │   ├── session.go
│   │   ├── task.go
│   │   ├── template.go
│   │   ├── template_test.go
│   │   ├── template_vault.go
│   │   ├── template_vault_test.go
│   │   ├── user.go
│   │   ├── user_test.go
│   │   ├── view.go
│   │   └── view_test.go
│   ├── config.go
│   ├── config_test.go
│   ├── factory/
│   │   └── store.go
│   ├── migration/
│   │   └── migration.go
│   └── sql/
│       ├── SqlDb.go
│       ├── SqlDb_test.go
│       ├── access_key.go
│       ├── environment.go
│       ├── event.go
│       ├── global_runner.go
│       ├── integration.go
│       ├── integration_alias.go
│       ├── inventory.go
│       ├── migration.go
│       ├── migration_2_10_24.go
│       ├── migration_2_8_28.go
│       ├── migration_2_8_42.go
│       ├── migrations/
│       │   ├── v0.0.0.sql
│       │   ├── v1.0.0.sql
│       │   ├── v1.2.0.sql
│       │   ├── v1.3.0.sql
│       │   ├── v1.4.0.sql
│       │   ├── v1.5.0.sql
│       │   ├── v1.6.0.sql
│       │   ├── v1.7.0.sql
│       │   ├── v1.8.0.sql
│       │   ├── v1.9.0.sql
│       │   ├── v2.10.12.sql
│       │   ├── v2.10.15.sql
│       │   ├── v2.10.16.sql
│       │   ├── v2.10.24.sql
│       │   ├── v2.10.26.sql
│       │   ├── v2.10.28.sql
│       │   ├── v2.10.33.sql
│       │   ├── v2.10.46.sql
│       │   ├── v2.11.5.sql
│       │   ├── v2.12.0.sql
│       │   ├── v2.12.15.sql
│       │   ├── v2.12.3.sql
│       │   ├── v2.12.4.sql
│       │   ├── v2.12.5.sql
│       │   ├── v2.13.0.sql
│       │   ├── v2.14.0.err.sql
│       │   ├── v2.14.0.sql
│       │   ├── v2.14.1.err.sql
│       │   ├── v2.14.1.sql
│       │   ├── v2.14.12.err.sql
│       │   ├── v2.14.12.sql
│       │   ├── v2.14.5.sql
│       │   ├── v2.14.7.sql
│       │   ├── v2.15.0.err.sql
│       │   ├── v2.15.0.sql
│       │   ├── v2.15.1.err.sql
│       │   ├── v2.15.1.sql
│       │   ├── v2.15.1.sqlite.sql
│       │   ├── v2.15.2.err.sql
│       │   ├── v2.15.2.sql
│       │   ├── v2.15.3.err.sql
│       │   ├── v2.15.3.sql
│       │   ├── v2.15.4.err.sql
│       │   ├── v2.15.4.sql
│       │   ├── v2.16.0.err.sql
│       │   ├── v2.16.0.sql
│       │   ├── v2.16.1.err.sql
│       │   ├── v2.16.1.sql
│       │   ├── v2.16.2.err.sql
│       │   ├── v2.16.2.sql
│       │   ├── v2.16.3.err.sql
│       │   ├── v2.16.3.sql
│       │   ├── v2.16.50.err.sql
│       │   ├── v2.16.50.sql
│       │   ├── v2.16.8.err.sql
│       │   ├── v2.16.8.sql
│       │   ├── v2.17.0.err.sql
│       │   ├── v2.17.0.sql
│       │   ├── v2.17.1.err.sql
│       │   ├── v2.17.1.sql
│       │   ├── v2.17.15.err.sql
│       │   ├── v2.17.15.sql
│       │   ├── v2.17.2.err.sql
│       │   ├── v2.17.2.sql
│       │   ├── v2.2.1.sql
│       │   ├── v2.3.0.sql
│       │   ├── v2.3.1.sql
│       │   ├── v2.3.2.sql
│       │   ├── v2.4.0.sql
│       │   ├── v2.5.0.sql
│       │   ├── v2.5.2.sql
│       │   ├── v2.7.1.sql
│       │   ├── v2.7.10.sql
│       │   ├── v2.7.12.sql
│       │   ├── v2.7.13.sql
│       │   ├── v2.7.4.sql
│       │   ├── v2.7.6.sql
│       │   ├── v2.7.8.sql
│       │   ├── v2.7.9.sql
│       │   ├── v2.8.0.sql
│       │   ├── v2.8.1.sql
│       │   ├── v2.8.20.sql
│       │   ├── v2.8.25.sql
│       │   ├── v2.8.26.sql
│       │   ├── v2.8.36.sql
│       │   ├── v2.8.38.sql
│       │   ├── v2.8.39.sql
│       │   ├── v2.8.40.sql
│       │   ├── v2.8.42.sql
│       │   ├── v2.8.51.sql
│       │   ├── v2.8.57.sql
│       │   ├── v2.8.58.sql
│       │   ├── v2.8.7.sql
│       │   ├── v2.8.8.sql
│       │   ├── v2.8.91.sql
│       │   ├── v2.9.100.sql
│       │   ├── v2.9.46.sql
│       │   ├── v2.9.6.sql
│       │   ├── v2.9.60.sql
│       │   ├── v2.9.61.sql
│       │   ├── v2.9.62.sql
│       │   ├── v2.9.70.sql
│       │   └── v2.9.97.sql
│       ├── option.go
│       ├── project.go
│       ├── project_invite.go
│       ├── repository.go
│       ├── role.go
│       ├── runner.go
│       ├── schedule.go
│       ├── secret_storage.go
│       ├── session.go
│       ├── task.go
│       ├── template.go
│       ├── template_vault.go
│       ├── user.go
│       └── view.go
├── db_lib/
│   ├── AccessKeyInstaller.go
│   ├── AnsibleApp.go
│   ├── AnsiblePlaybook.go
│   ├── AppFactory.go
│   ├── CmdGitClient.go
│   ├── GitClientFactory.go
│   ├── GitRepository.go
│   ├── GoGitClient.go
│   ├── LocalApp.go
│   ├── LocalApp_test.go
│   ├── ShellApp.go
│   └── TerraformApp.go
├── deployment/
│   ├── compose/
│   │   ├── README.md
│   │   ├── dredd/
│   │   │   ├── base.yml
│   │   │   ├── boltdb.yml
│   │   │   ├── mariadb.yml
│   │   │   ├── mysql.yml
│   │   │   ├── postgres.yml
│   │   │   └── sqlite.yml
│   │   ├── runner/
│   │   │   ├── base.yml
│   │   │   ├── build.yml
│   │   │   └── config.yml
│   │   ├── server/
│   │   │   ├── base.yml
│   │   │   ├── build.yml
│   │   │   └── config.yml
│   │   └── store/
│   │       ├── boltdb.yml
│   │       ├── local.yml
│   │       ├── mariadb.yml
│   │       ├── mysql.yml
│   │       ├── postgres.yml
│   │       └── sqlite.yml
│   ├── docker/
│   │   ├── README.md
│   │   ├── dredd/
│   │   │   ├── Dockerfile
│   │   │   └── entrypoint
│   │   ├── runner/
│   │   │   ├── Dockerfile
│   │   │   ├── ansible.cfg
│   │   │   ├── goss.yaml
│   │   │   └── runner-wrapper
│   │   └── server/
│   │       ├── Dockerfile
│   │       ├── ansible.cfg
│   │       ├── goss.yaml
│   │       ├── powershell/
│   │       │   └── Dockerfile
│   │       └── server-wrapper
│   ├── packaging/
│   │   └── semaphore.spec
│   └── systemd/
│       ├── README.md
│       ├── env
│       ├── runner.service
│       ├── semaphore.service
│       └── util/
│           ├── install.sh
│           └── uninstall.sh
├── examples/
│   ├── authentik_ldap/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   └── docker-compose.yml
│   ├── openldap/
│   │   ├── README.md
│   │   └── docker-compose.yml
│   └── terraform_args_example.json
├── go.mod
├── go.sum
├── hook_helpers/
│   └── hooks_helpers.go
├── pkg/
│   ├── common_errors/
│   │   └── common_errors.go
│   ├── conv/
│   │   └── conv.go
│   ├── random/
│   │   └── string.go
│   ├── ssh/
│   │   ├── agent.go
│   │   └── agent_test.go
│   ├── task_logger/
│   │   └── task_logger.go
│   └── tz/
│       └── time.go
├── pro/
│   ├── api/
│   │   ├── auth_verify.go
│   │   ├── projects/
│   │   │   ├── runners.go
│   │   │   └── terraform_inventory.go
│   │   ├── roles.go
│   │   ├── subscriptions.go
│   │   └── terraform.go
│   ├── db/
│   │   ├── factory/
│   │   │   └── factory.go
│   │   └── sql/
│   │       ├── ansible_task.go
│   │       └── terraform_inventory.go
│   ├── go.mod
│   ├── go.sum
│   ├── pkg/
│   │   ├── features/
│   │   │   └── features.go
│   │   └── stage_parsers/
│   │       └── next_step.go
│   └── services/
│       ├── ha/
│       │   └── ha.go
│       ├── server/
│       │   ├── access_key_serializer_dvls.go
│       │   ├── access_key_serializer_vault.go
│       │   ├── log_write_svc.go
│       │   ├── secret_storage_svc.go
│       │   └── subscription_svc.go
│       └── tasks/
│           └── task_state_store_factory.go
├── pro_interfaces/
│   ├── log_write_svc.go
│   ├── project_runner_ctl.go
│   ├── subscription_ctl.go
│   ├── subscription_svc.go
│   └── terraform_inventory_ctl.go
├── qodana.yaml
├── renovate.json
├── services/
│   ├── export/
│   │   ├── AccessKey.go
│   │   ├── Environment.go
│   │   ├── Event.go
│   │   ├── Exporter.go
│   │   ├── Integration.go
│   │   ├── IntegrationAliases.go
│   │   ├── IntegrationExtractValue.go
│   │   ├── IntegrationMatcher.go
│   │   ├── Inventory.go
│   │   ├── Option.go
│   │   ├── Project.go
│   │   ├── ProjectUser.go
│   │   ├── Repository.go
│   │   ├── Role.go
│   │   ├── Runner.go
│   │   ├── Schedule.go
│   │   ├── SecretStorage.go
│   │   ├── Task.go
│   │   ├── TaskOutput.go
│   │   ├── TaskStage.go
│   │   ├── TaskStageResult.go
│   │   ├── Template.go
│   │   ├── TemplateRoles.go
│   │   ├── TemplateVault.go
│   │   ├── User.go
│   │   └── View.go
│   ├── project/
│   │   ├── backup.go
│   │   ├── backup_marshal.go
│   │   ├── backup_marshal_test.go
│   │   ├── backup_test.go
│   │   ├── restore.go
│   │   └── types.go
│   ├── runners/
│   │   ├── job_pool.go
│   │   ├── running_job.go
│   │   └── types.go
│   ├── schedules/
│   │   ├── SchedulePool.go
│   │   └── SchedulePool_test.go
│   ├── server/
│   │   ├── AccessKey_test.go
│   │   ├── access_key_encryption_svc.go
│   │   ├── access_key_installation_svc.go
│   │   ├── access_key_serializer.go
│   │   ├── access_key_serializer_local.go
│   │   ├── access_key_svc.go
│   │   ├── environment_svc.go
│   │   ├── intergration_svc.go
│   │   ├── inventory_svc.go
│   │   ├── project_svc.go
│   │   ├── project_svc_test.go
│   │   └── secret_storage_svc.go
│   ├── session_svc.go
│   └── tasks/
│       ├── LocalJob.go
│       ├── LocalJob_inventory.go
│       ├── RemoteJob.go
│       ├── TaskPool.go
│       ├── TaskPool_test.go
│       ├── TaskRunner.go
│       ├── TaskRunner_logging.go
│       ├── TaskRunner_test.go
│       ├── alert.go
│       ├── alert_test_sender.go
│       ├── hooks/
│       │   ├── ansible.go
│       │   ├── common.go
│       │   └── factory.go
│       ├── http_test.go
│       ├── task_state_store.go
│       └── templates/
│           ├── dingtalk.tmpl
│           ├── email.tmpl
│           ├── gotify.tmpl
│           ├── microsoft-teams.tmpl
│           ├── rocketchat.tmpl
│           ├── slack.tmpl
│           └── telegram.tmpl
├── test/
│   ├── e2e/
│   │   ├── .gitignore
│   │   ├── package.json
│   │   ├── playwright.config.ts
│   │   └── tests/
│   │       ├── fixtures.ts
│   │       ├── task.spec.ts
│   │       └── variable-group.spec.ts
│   └── mcp/
│       ├── api/
│       │   ├── AGENT.md
│       │   ├── data/
│       │   │   └── case4/
│       │   │       └── test.sh
│       │   ├── run.sh
│       │   └── test_plan.md
│       └── e2e/
│           ├── .gitignore
│           ├── AGENT.md
│           ├── package.json
│           ├── playwright.config.ts
│           ├── run.sh
│           └── test_plan.md
├── util/
│   ├── App.go
│   ├── OdbcProvider.go
│   ├── ansi.go
│   ├── config.go
│   ├── config_assign_test.go
│   ├── config_auth.go
│   ├── config_sysproc.go
│   ├── config_sysproc_windows.go
│   ├── config_test.go
│   ├── debug.go
│   ├── encryption.go
│   ├── errorLogging.go
│   ├── mailer/
│   │   ├── auth.go
│   │   └── mailer.go
│   ├── shell.go
│   ├── test_helpers.go
│   └── version.go
└── web/
    ├── .browserslistrc
    ├── .editorconfig
    ├── .eslintrc.js
    ├── README.md
    ├── babel.config.js
    ├── gulp-gpt-translate.js
    ├── gulpfile.js
    ├── package.json
    ├── public/
    │   ├── index.html
    │   ├── swagger/
    │   │   ├── api-docs.yml
    │   │   ├── index.css
    │   │   ├── index.html
    │   │   ├── oauth2-redirect.html
    │   │   ├── swagger-initializer.js
    │   │   ├── swagger-ui-bundle.js
    │   │   ├── swagger-ui-es-bundle-core.js
    │   │   ├── swagger-ui-es-bundle.js
    │   │   ├── swagger-ui-standalone-preset.js
    │   │   ├── swagger-ui.css
    │   │   └── swagger-ui.js
    │   └── test.txt
    ├── src/
    │   ├── App.vue
    │   ├── assets/
    │   │   ├── fonts/
    │   │   │   └── LICENSE.txt
    │   │   └── scss/
    │   │       ├── components.scss
    │   │       └── main.scss
    │   ├── components/
    │   │   ├── AboutDialog.vue
    │   │   ├── AnsibleStageView.vue
    │   │   ├── AppFieldsMixin.js
    │   │   ├── AppForm.vue
    │   │   ├── AppsMixin.js
    │   │   ├── ArgsPicker.vue
    │   │   ├── ChangePasswordForm.vue
    │   │   ├── CopyClipboardButton.vue
    │   │   ├── CronInput.vue
    │   │   ├── DashboardMenu.vue
    │   │   ├── DvlsIcon.vue
    │   │   ├── EditDialog.vue
    │   │   ├── EditRoleForm.vue
    │   │   ├── EditTeamMemberDialog.vue
    │   │   ├── EditTemplateDialog.vue
    │   │   ├── EditTemplatePermissionDialog.vue
    │   │   ├── EditTemplatePermissionForm.vue
    │   │   ├── EditViewsForm.vue
    │   │   ├── EnvironmentForm.vue
    │   │   ├── HashicorpVaultIcon.vue
    │   │   ├── IndeterminateProgressCircular.vue
    │   │   ├── IntegrationExtractValueForm.vue
    │   │   ├── IntegrationExtractorChildValueFormBase.js
    │   │   ├── IntegrationExtractorForm.vue
    │   │   ├── IntegrationExtractorFormBase.js
    │   │   ├── IntegrationExtractorRefsView.vue
    │   │   ├── IntegrationExtractorsBase.js
    │   │   ├── IntegrationForm.vue
    │   │   ├── IntegrationMatcherForm.vue
    │   │   ├── IntegrationRefsView.vue
    │   │   ├── InventoryForm.vue
    │   │   ├── InventorySelectForm.vue
    │   │   ├── ItemFormBase.js
    │   │   ├── ItemListPageBase.js
    │   │   ├── KeyForm.vue
    │   │   ├── KeyStoreMenu.vue
    │   │   ├── LineChart.vue
    │   │   ├── NewTaskDialog.vue
    │   │   ├── ObjectRefsDialog.vue
    │   │   ├── ObjectRefsView.vue
    │   │   ├── OpenTofuIcon.vue
    │   │   ├── PageBottomSheet.vue
    │   │   ├── PageMixin.js
    │   │   ├── PermissionsCheck.js
    │   │   ├── ProjectForm.vue
    │   │   ├── ProjectMixin.js
    │   │   ├── PulumiIcon.vue
    │   │   ├── RepositoryForm.vue
    │   │   ├── RestoreProjectForm.vue
    │   │   ├── RichEditor.vue
    │   │   ├── RunnerForm.vue
    │   │   ├── ScheduleForm.vue
    │   │   ├── SecretStorageForm.vue
    │   │   ├── SecretStorageSyncOptionsForm.vue
    │   │   ├── SingleLineEditable.vue
    │   │   ├── SubscriptionForm.vue
    │   │   ├── SubscriptionLabel.vue
    │   │   ├── SurveyVars.vue
    │   │   ├── SystemInfoDialog.vue
    │   │   ├── SystemSettingsDialog.vue
    │   │   ├── TableSettingsSheet.vue
    │   │   ├── TaskDetails.vue
    │   │   ├── TaskForm.vue
    │   │   ├── TaskLink.vue
    │   │   ├── TaskList.vue
    │   │   ├── TaskLogDialog.vue
    │   │   ├── TaskLogView.vue
    │   │   ├── TaskLogViewRecord.vue
    │   │   ├── TaskParamsAnsibleForm.vue
    │   │   ├── TaskParamsForm.vue
    │   │   ├── TaskParamsTerraformForm.vue
    │   │   ├── TaskStats.vue
    │   │   ├── TaskStatus.vue
    │   │   ├── TeamMemberForm.vue
    │   │   ├── TeamMenu.vue
    │   │   ├── TemplateForm.vue
    │   │   ├── TemplatePermissionsChips.vue
    │   │   ├── TemplateSelectForm.vue
    │   │   ├── TemplateVaults.vue
    │   │   ├── TerraformAliasForm.vue
    │   │   ├── TerraformInventoryForm.vue
    │   │   ├── TerraformStateView.vue
    │   │   ├── TerragruntIcon.vue
    │   │   ├── UserForm.vue
    │   │   ├── YesNoDialog.vue
    │   │   └── chartjs-adapter-day.js
    │   ├── event-bus.js
    │   ├── lang/
    │   │   ├── de.js
    │   │   ├── en.js
    │   │   ├── es.js
    │   │   ├── fr.js
    │   │   ├── index.js
    │   │   ├── it.js
    │   │   ├── ja.js
    │   │   ├── ko.js
    │   │   ├── nl.js
    │   │   ├── pl.js
    │   │   ├── pt.js
    │   │   ├── pt_br.js
    │   │   ├── ru.js
    │   │   ├── uk.js
    │   │   ├── zh_cn.js
    │   │   └── zh_tw.js
    │   ├── lib/
    │   │   ├── FakeWebSocket.js
    │   │   ├── Listenable.js
    │   │   ├── PubSub.js
    │   │   ├── Socket.js
    │   │   ├── api.js
    │   │   ├── constants.js
    │   │   ├── copyToClipboard.js
    │   │   ├── delay.js
    │   │   └── error.js
    │   ├── main.js
    │   ├── plugins/
    │   │   ├── i18.js
    │   │   └── vuetify.js
    │   ├── router/
    │   │   └── index.js
    │   ├── scss/
    │   │   └── variables.scss
    │   ├── socket.js
    │   └── views/
    │       ├── AcceptInvite.vue
    │       ├── Apps.vue
    │       ├── Auth.vue
    │       ├── Options.vue
    │       ├── Roles.vue
    │       ├── Runners.vue
    │       ├── Tasks.vue
    │       ├── Tokens.vue
    │       ├── Users.vue
    │       └── project/
    │           ├── Activity.vue
    │           ├── Environment.vue
    │           ├── History.vue
    │           ├── IntegrationExtractValue.vue
    │           ├── IntegrationExtractor.vue
    │           ├── IntegrationExtractorCrumb.vue
    │           ├── IntegrationMatcher.vue
    │           ├── Integrations.vue
    │           ├── IntegrationsBase.js
    │           ├── Inventory.vue
    │           ├── Invites.vue
    │           ├── Keys.vue
    │           ├── New.vue
    │           ├── Repositories.vue
    │           ├── RestoreProject.vue
    │           ├── Schedule.vue
    │           ├── SecretStorages.vue
    │           ├── Settings.vue
    │           ├── Stats.vue
    │           ├── Team.vue
    │           ├── TemplateView.vue
    │           ├── Templates.vue
    │           └── template/
    │               ├── TemplateDetails.vue
    │               ├── TemplatePerms.vue
    │               └── TemplateTerraformState.vue
    ├── tests/
    │   └── unit/
    │       ├── example.spec.js
    │       └── lib/
    │           ├── Listenable.spec.js
    │           ├── Socket.spec.js
    │           └── error.spec.js
    └── vue.config.js

================================================
FILE CONTENTS
================================================

================================================
FILE: .codacy.yml
================================================
---
exclude_paths:
  - .dredd/**

================================================
FILE: .cursorignore
================================================
/tests/e2e/

================================================
FILE: .devcontainer/config-runner.json
================================================
{
    "web_host": "http://localhost:3000",
    "runner": {
        "token_file": "/home/codespace/.semaphore-runner-token"
    }
}

================================================
FILE: .devcontainer/config.json
================================================
{
   "bolt": {
       "host": "/workspaces/semaphore/database.boltdb",
       "options": {
           "sessionConnection": "false"
       }
   },
   "dialect": "bolt",
   "cookie_hash": "5WJjXCLpvf3Cn5t+C/IV9F0asZUQLakOhCT+eSdIwP0=",
   "cookie_encryption": "6x6mmQWGn6YcsHN1rN0HiQjhYA+7HukcbCxUGHuT2CE="
}



================================================
FILE: .devcontainer/devcontainer.json
================================================
{
  "image": "mcr.microsoft.com/devcontainers/universal:4",
  "features": {
    "ghcr.io/devcontainers/features/go:1": {},
    "ghcr.io/devcontainers/features/node:1": {}
  },
  "postCreateCommand": "./.devcontainer/postCreateCommand.sh"
}


================================================
FILE: .devcontainer/postCreateCommand.sh
================================================
#!/bin/sh

go install github.com/go-task/task/v3/cmd/task@latest

(cd ./web && npm install)

python3 -m venv .venv

./.venv/bin/pip3 install ansible

task build
task dredd:goodman
task dredd:hooks

cp ./.devcontainer/config.json ./.dredd/config.json

./bin/semaphore user add \
    --admin \
    --login admin \
    --name Admin \
    --email admin@example.com \
    --password changeme \
    --config ./.devcontainer/config.json

================================================
FILE: .dockerignore
================================================
web/node_modules/
vendor/


================================================
FILE: .dredd/dredd.docker.yml
================================================
dry-run: null
hookfiles: ./.dredd/compiled_hooks
language: go
server-wait: 5
init: false
custom: {}
names: false
only: []
reporter: []
output: []
header: "Authorization: bearer h4a_i4qslpnxyyref71rk5nqbwxccrs7enwvggx0vfs="
sorted: false
user: null
inline-errors: false
details: false
method: []
color: true
loglevel: debug
path: []
hooks-worker-timeout: 5000
hooks-worker-connect-timeout: 1500
hooks-worker-connect-retry: 500
hooks-worker-after-connect-wait: 100
hooks-worker-term-timeout: 5000
hooks-worker-term-retry: 500
hooks-worker-handler-host: 0.0.0.0
hooks-worker-handler-port: 61321
config: ./.dredd/dredd.yml
blueprint: api-docs.yml
endpoint: 'http://server:3000'


================================================
FILE: .dredd/dredd.local.yml
================================================
dry-run: null
hookfiles: ./.dredd/compiled_hooks
language: go
server-wait: 5
init: false
custom: {}
names: false
only: []
reporter: []
output: []
header: "Authorization: bearer h4a_i4qslpnxyyref71rk5nqbwxccrs7enwvggx0vfs="
sorted: false
user: null
inline-errors: false
details: false
method: []
color: true
loglevel: debug
path: []
hooks-worker-timeout: 5000
hooks-worker-connect-timeout: 1500
hooks-worker-connect-retry: 500
hooks-worker-after-connect-wait: 100
hooks-worker-term-timeout: 5000
hooks-worker-term-retry: 500
hooks-worker-handler-host: 0.0.0.0
hooks-worker-handler-port: 61321
config: ./.dredd/dredd.yml
blueprint: api-docs.yml
endpoint: 'http://localhost:3000'


================================================
FILE: .dredd/dredd.testing.yml
================================================
dry-run: null
hookfiles: ./.dredd/compiled_hooks
language: go
server: ./.dredd/server-wrapper.sh
server-wait: 5
init: false
custom: {}
names: false
only: []
reporter: []
output: []
header: "Authorization: bearer h4a_i4qslpnxyyref71rk5nqbwxccrs7enwvggx0vfs="
sorted: false
user: null
inline-errors: false
details: false
method: []
color: true
loglevel: debug
path: []
hooks-worker-timeout: 5000
hooks-worker-connect-timeout: 1500
hooks-worker-connect-retry: 500
hooks-worker-after-connect-wait: 100
hooks-worker-term-timeout: 5000
hooks-worker-term-retry: 500
hooks-worker-handler-host: 0.0.0.0
hooks-worker-handler-port: 61321
config: ./.dredd/dredd.yml
blueprint: api-docs.yml
endpoint: 'http://localhost:3000'


================================================
FILE: .dredd/dredd.windows.yml
================================================
dry-run: null
hookfiles: ./.dredd/compiled_hooks.exe
language: go
server-wait: 5
init: false
custom: {}
names: false
only: []
reporter: []
output: []
header: "Authorization: bearer h4a_i4qslpnxyyref71rk5nqbwxccrs7enwvggx0vfs="
sorted: false
user: null
inline-errors: false
details: false
method: []
color: true
loglevel: debug
path: []
hooks-worker-timeout: 5000
hooks-worker-connect-timeout: 1500
hooks-worker-connect-retry: 500
hooks-worker-after-connect-wait: 100
hooks-worker-term-timeout: 5000
hooks-worker-term-retry: 500
hooks-worker-handler-host: 0.0.0.0
hooks-worker-handler-port: 61321
config: ./.dredd/dredd.yml
blueprint: api-docs.yml
endpoint: 'http://localhost:3000'


================================================
FILE: .dredd/hooks/capabilities.go
================================================
package main

import (
	"encoding/json"
	"regexp"
	"strconv"
	"strings"

	"github.com/semaphoreui/semaphore/db"
	trans "github.com/snikch/goodman/transaction"
)

// STATE
// Runtime created objects we need to reference in test setups
var testRunnerUser *db.User
var userPathTestUser *db.User
var userProject *db.Project
var userKey *db.AccessKey
var task *db.Task
var schedule *db.Schedule
var view *db.View
var integration *db.Integration
var integrationextractvalue *db.IntegrationExtractValue
var integrationmatch *db.IntegrationMatcher
var invite *db.ProjectInvite

// Runtime created simple ID values for some items we need to reference in other objects
var repoID int
var inventoryID int
var environmentID int
var templateID int
var integrationID int
var integrationExtractValueID int
var integrationMatchID int

var capabilities = map[string][]string{
	"user":                    {},
	"project":                 {"user"},
	"repository":              {"access_key"},
	"inventory":               {"repository"},
	"environment":             {"repository"},
	"template":                {"repository", "inventory", "environment", "view"},
	"task":                    {"template"},
	"schedule":                {"template"},
	"view":                    {},
	"integration":             {"project", "template"},
	"integrationextractvalue": {"integration"},
	"integrationmatcher":      {"integration"},
	"invite":                  {"user", "project"},
}

func capabilityWrapper(cap string) func(t *trans.Transaction) {
	return func(t *trans.Transaction) {
		addCapabilities([]string{cap})
	}
}

func addCapabilities(caps []string) {
	dbConnect()
	defer store.Close("")
	resolved := make([]string, 0)
	uid := getUUID()
	resolveCapability(caps, resolved, uid)
}

func resolveCapability(caps []string, resolved []string, uid string) {
	for _, v := range caps {

		//if cap has deps resolve them
		if val, ok := capabilities[v]; ok {
			resolveCapability(val, resolved, uid)
		}

		//skip if already resolved
		if _, exists := stringInSlice(v, resolved); exists {
			continue
		}

		//Add dep specific stuff
		switch v {
		case "invite":
			invite = addInvite()
		case "schedule":
			schedule = addSchedule()
		case "view":
			view = addView()
		case "user":
			userPathTestUser = addUser()
		case "project":
			userProject = addProject()
			//allow the admin user (test executor) to manipulate the project
			addUserProjectRelation(userProject.ID, testRunnerUser.ID)
			addUserProjectRelation(userProject.ID, userPathTestUser.ID)
		case "access_key":
			userKey = addAccessKey(&userProject.ID)
		case "repository":
			pRepo, err := store.CreateRepository(db.Repository{
				ProjectID: userProject.ID,
				GitURL:    "git@github.com/ansible,semaphore/semaphore",
				GitBranch: "develop",
				SSHKeyID:  userKey.ID,
				Name:      "ITR-" + uid,
			})
			printError(err)
			repoID = pRepo.ID
		case "inventory":
			res, err := store.CreateInventory(db.Inventory{
				ProjectID:    userProject.ID,
				Name:         "ITI-" + uid,
				Type:         "static",
				SSHKeyID:     &userKey.ID,
				BecomeKeyID:  &userKey.ID,
				Inventory:    "Test Inventory",
				RepositoryID: &repoID,
			})
			printError(err)
			inventoryID = res.ID
		case "environment":
			pwd := "test-pass"
			env := "{}"
			secret := db.EnvironmentSecret{
				Type:      db.EnvironmentSecretEnv,
				Name:      "TEST",
				Secret:    "VALUE",
				Operation: "create",
			}
			res, err := store.CreateEnvironment(db.Environment{
				ProjectID: userProject.ID,
				Name:      "ITI-" + uid,
				JSON:      "{}",
				Password:  &pwd,
				ENV:       &env,
			})
			printError(err)
			_, err = store.CreateAccessKey(db.AccessKey{
				String:        secret.Secret,
				EnvironmentID: &res.ID,
				ProjectID:     &userProject.ID,
				Type:          db.AccessKeyString,
				Owner:         secret.Type.GetAccessKeyOwner(),
			})
			printError(err)
			environmentID = res.ID
		case "template":
			args := "[]"
			desc := "Hello, World!"
			branch := "main"
			res, err := store.CreateTemplate(db.Template{
				ProjectID:               userProject.ID,
				InventoryID:             &inventoryID,
				RepositoryID:            repoID,
				EnvironmentID:           &environmentID,
				Name:                    "Test-" + uid,
				Playbook:                "test-playbook.yml",
				Arguments:               &args,
				AllowOverrideArgsInTask: false,
				Description:             &desc,
				ViewID:                  &view.ID,
				App:                     db.AppAnsible,
				GitBranch:               &branch,
				SurveyVars:              []db.SurveyVar{},
			})

			printError(err)
			templateID = res.ID
		case "task":
			task = addTask()
		case "integration":
			integration = addIntegration()
			integrationID = integration.ID
		case "integrationextractvalue":
			integrationextractvalue = addIntegrationExtractValue()
			integrationExtractValueID = integrationextractvalue.ID
		case "integrationmatcher":
			integrationmatch = addIntegrationMatcher()
			integrationMatchID = integrationmatch.ID
		default:
			panic("unknown capability " + v)
		}
		resolved = append(resolved, v)
	}
}

// HOOKS
var skipTest = func(t *trans.Transaction) {
	t.Skip = true
}

// Contains all the substitutions for paths under test
// The parameter example value in the api-doc should respond to the index+1 of the function in this slice
// ie the project id, with example value 1, will be replaced by the return value of pathSubPatterns[0]
var pathSubPatterns = []func() string{
	func() string { return strconv.Itoa(userProject.ID) },
	func() string { return strconv.Itoa(userPathTestUser.ID) },
	func() string { return strconv.Itoa(userKey.ID) },
	func() string { return strconv.Itoa(repoID) },
	func() string { return strconv.Itoa(inventoryID) },
	func() string { return strconv.Itoa(environmentID) },
	func() string { return strconv.Itoa(templateID) },
	func() string { return strconv.Itoa(task.ID) },
	func() string { return strconv.Itoa(schedule.ID) },
	func() string { return strconv.Itoa(view.ID) },
	func() string { return strconv.Itoa(integration.ID) },
	func() string { return strconv.Itoa(integrationextractvalue.ID) },
	func() string { return strconv.Itoa(integrationmatch.ID) },
	func() string { return strconv.Itoa(invite.ID) }, // invite_id, x-example: 14
}

// alterRequestPath with the above slice of functions
func alterRequestPath(t *trans.Transaction) {
	pathArgs := strings.Split(t.FullPath, "/")
	exploded := make([]string, len(pathArgs))
	copy(exploded, pathArgs)
	for k, v := range pathSubPatterns {

		pos, exists := stringInSlice(strconv.Itoa(k+1), exploded)
		if exists {
			pathArgs[pos] = v()
		}
	}
	t.FullPath = strings.Join(pathArgs, "/")

	t.Request.URI = t.FullPath
}

func alterRequestBody(t *trans.Transaction) {
	var request map[string]interface{}
	json.Unmarshal([]byte(t.Request.Body), &request)

	if userProject != nil {
		bodyFieldProcessor("project_id", userProject.ID, &request)
	}
	bodyFieldProcessor("json", "{}", &request)
	if userKey != nil {
		bodyFieldProcessor("ssh_key_id", userKey.ID, &request)
		bodyFieldProcessor("become_key_id", userKey.ID, &request)
	}
	if invite != nil {
		bodyFieldProcessor("invite_id", 4, &request)
	}
	bodyFieldProcessor("environment_id", environmentID, &request)
	bodyFieldProcessor("inventory_id", inventoryID, &request)
	bodyFieldProcessor("repository_id", repoID, &request)
	bodyFieldProcessor("template_id", templateID, &request)
	bodyFieldProcessor("build_template_id", nil, &request)
	if task != nil {
		bodyFieldProcessor("task_id", task.ID, &request)
	}
	if schedule != nil {
		bodyFieldProcessor("schedule_id", schedule.ID, &request)
	}
	if view != nil {
		bodyFieldProcessor("view_id", view.ID, &request)
	}

	if integration != nil {
		bodyFieldProcessor("integration_id", integration.ID, &request)
	}
	if integrationextractvalue != nil {
		bodyFieldProcessor("value_id", integrationextractvalue.ID, &request)
	}
	if integrationmatch != nil {
		bodyFieldProcessor("matcher_id", integrationmatch.ID, &request)
	}

	// Inject object ID to body for PUT requests
	if strings.ToLower(t.Request.Method) == "put" {

		putRequestPathRE := regexp.MustCompile(`\w+/(\d+)/?$`)
		m := putRequestPathRE.FindStringSubmatch(t.FullPath)
		if len(m) > 0 {
			objectID, err := strconv.Atoi(m[1])
			if err != nil {
				panic("Invalid object ID in PUT request " + t.FullPath)
			}
			request["id"] = objectID

		} else {
			panic("Unexpected PUT request " + t.FullPath)
		}
	}

	out, _ := json.Marshal(request)
	t.Request.Body = string(out)
}

func bodyFieldProcessor(id string, sub interface{}, request *map[string]interface{}) {
	if _, ok := (*request)[id]; ok {
		(*request)[id] = sub
	}
}


================================================
FILE: .dredd/hooks/helpers.go
================================================
package main

import (
	"encoding/json"
	"fmt"
	"os"

	"github.com/semaphoreui/semaphore/pkg/tz"

	"github.com/go-gorp/gorp/v3"
	"github.com/semaphoreui/semaphore/db"
	"github.com/semaphoreui/semaphore/db/bolt"
	"github.com/semaphoreui/semaphore/db/factory"
	"github.com/semaphoreui/semaphore/db/sql"
	"github.com/semaphoreui/semaphore/pkg/random"
	"github.com/semaphoreui/semaphore/util"
	"github.com/snikch/goodman/transaction"
)

// Test Runner User
func addTestRunnerUser() {
	uid := getUUID()
	testRunnerUser = &db.User{
		Username: "ITU-" + uid,
		Name:     "ITU-" + uid,
		Email:    uid + "@semaphore.test",
		Created:  db.GetParsedTime(tz.Now()),
		Admin:    true,
	}

	dbConnect()
	defer store.Close("")

	truncateAll()

	newUser, err := store.CreateUserWithoutPassword(*testRunnerUser)

	if err != nil {
		panic(err)
	}

	testRunnerUser.ID = newUser.ID

	addToken(adminToken, testRunnerUser.ID)
}

func truncateAll() {
	var tablesShouldBeTruncated = [...]string{
		"access_key",
		"event",
		"user__token",
		"project",
		"task__output",
		"task",
		"session",
		"project__environment",
		"project__inventory",
		"project__repository",
		"project__template",
		"project__template_vault",
		"project__schedule",
		"project__user",
		"user",
		"project__view",
		"project__integration",
		"project__integration_extract_value",
		"project__integration_matcher",
	}

	switch store.(type) {
	case *bolt.BoltDb:
		// Do nothing
	case *sql.SqlDb:
		switch store.(*sql.SqlDb).Sql().Dialect.(type) {
		case gorp.PostgresDialect:
			// Do nothing
		case gorp.MySQLDialect:
			tx, err := store.(*sql.SqlDb).Sql().Begin()
			if err != nil {
				panic(err)
			}

			_, err = tx.Exec("SET FOREIGN_KEY_CHECKS = 0")
			if err == nil {
				for _, tableName := range tablesShouldBeTruncated {
					tx.Exec("TRUNCATE TABLE " + tableName)
				}
				tx.Exec("SET FOREIGN_KEY_CHECKS = 1")
			}

			if err := tx.Commit(); err != nil {
				panic(err)
			}
		}
	}
}

func removeTestRunnerUser(transactions []*transaction.Transaction) {
	dbConnect()
	defer store.Close("")
	_ = store.DeleteAPIToken(testRunnerUser.ID, adminToken)
	_ = store.DeleteUser(testRunnerUser.ID)
}

// Parameter Substitution
func setupObjectsAndPaths(t *transaction.Transaction) {
	alterRequestPath(t)
	alterRequestBody(t)
}

// Object Lifecycle
func addUserProjectRelation(pid int, user int) {
	_, err := store.CreateProjectUser(db.ProjectUser{
		ProjectID: pid,
		UserID:    user,
		Role:      db.ProjectOwner,
	})
	if err != nil {
		panic(err)
	}
}

func deleteUserProjectRelation(pid int, user int) {
	err := store.DeleteProjectUser(pid, user)
	if err != nil {
		panic(err)
	}
}

func addAccessKey(pid *int) *db.AccessKey {
	uid := getUUID()
	secret := "5up3r53cr3t\n"

	key, err := store.CreateAccessKey(db.AccessKey{
		Name:      "ITK-" + uid,
		Type:      "ssh",
		Secret:    &secret,
		ProjectID: pid,
	})

	if err != nil {
		panic(err)
	}
	return &key
}

func addProject() *db.Project {
	uid := getUUID()
	chat := "Test"
	project := db.Project{
		Name:      "ITP-" + uid,
		Created:   tz.Now(),
		AlertChat: &chat,
	}
	project, err := store.CreateProject(project)
	if err != nil {
		panic(err)
	}

	err = store.UpdateProject(project)
	if err != nil {
		panic(err)
	}

	return &project
}

func addUser() *db.User {
	uid := getUUID()
	user := db.User{
		Created:  tz.Now(),
		Username: "ITU-" + uid,
		Email:    "test@semaphore." + uid,
		Name:     "ITU-" + uid,
	}

	user, err := store.CreateUserWithoutPassword(user)

	if err != nil {
		panic(err)
	}
	return &user
}

func addView() *db.View {
	view, err := store.CreateView(db.View{
		ProjectID: userProject.ID,
		Title:     "Test",
		Position:  1,
	})

	if err != nil {
		panic(err)
	}

	return &view
}

func addInvite() *db.ProjectInvite {
	invite, err := store.CreateProjectInvite(db.ProjectInvite{
		ProjectID:     userProject.ID,
		UserID:        &userPathTestUser.ID,
		Email:         &userPathTestUser.Email,
		Role:          "owner",
		Status:        db.ProjectInvitePending,
		Token:         getUUID(),
		InviterUserID: testRunnerUser.ID,
		Created:       tz.Now(),
		ExpiresAt:     nil, // No expiration for this test
		AcceptedAt:    nil,
	})

	fmt.Println("***************************************")
	fmt.Println("***************************************")
	fmt.Println("***************************************")
	fmt.Println(invite.ID)
	fmt.Println("***************************************")
	fmt.Println("***************************************")
	fmt.Println("***************************************")

	if err != nil {
		panic(err)
	}

	return &invite
}

func addSchedule() *db.Schedule {
	schedule, err := store.CreateSchedule(db.Schedule{
		TemplateID: int(templateID),
		CronFormat: "* * * 1 *",
		ProjectID:  userProject.ID,
	})

	if err != nil {
		panic(err)
	}

	return &schedule
}

func addTask() *db.Task {
	t := db.Task{
		ProjectID:  userProject.ID,
		TemplateID: templateID,
		Status:     "testing",
		UserID:     &userPathTestUser.ID,
		Created:    db.GetParsedTime(tz.Now()),
	}

	t, err := store.CreateTask(t, 0)

	if err != nil {
		fmt.Println("error during insertion of task:")
		if j, e := json.Marshal(t); e == nil {
			fmt.Println(string(j))
		} else {
			fmt.Println("can not stringify task object")
		}
		panic(err)
	}
	return &t
}

func addIntegration() *db.Integration {
	integration, err := store.CreateIntegration(db.Integration{
		ProjectID:  userProject.ID,
		Name:       "Test Integration",
		TemplateID: templateID,
	})
	if err != nil {
		panic(err)
	}

	return &integration
}

func addIntegrationExtractValue() *db.IntegrationExtractValue {
	integrationextractvalue, err := store.CreateIntegrationExtractValue(userProject.ID, db.IntegrationExtractValue{
		Name:          "Value",
		IntegrationID: integrationID,
		ValueSource:   db.IntegrationExtractBodyValue,
		BodyDataType:  db.IntegrationBodyDataJSON,
		Key:           "key",
		Variable:      "var",
		VariableType:  db.IntegrationVariableEnvironment,
	})

	if err != nil {
		panic(err)
	}

	return &integrationextractvalue
}

func addIntegrationMatcher() *db.IntegrationMatcher {
	integrationmatch, err := store.CreateIntegrationMatcher(userProject.ID, db.IntegrationMatcher{
		Name:          "matcher",
		IntegrationID: integrationID,
		MatchType:     "body",
		Method:        "equals",
		BodyDataType:  "json",
		Key:           "key",
		Value:         "value",
	})

	if err != nil {
		panic(err)
	}

	return &integrationmatch
}

// Token Handling
func addToken(tok string, user int) {
	_, err := store.CreateAPIToken(db.APIToken{
		ID:      tok,
		Created: tz.Now(),
		UserID:  user,
		Expired: false,
	})
	if err != nil {
		panic(err)
	}
}

// HELPERS
var randSetup = false

func getUUID() string {
	if !randSetup {
		randSetup = true
	}
	return random.String(8)
}

func loadConfig() {
	cwd, _ := os.Getwd()
	file, _ := os.Open(cwd + "/.dredd/config.json")
	if err := json.NewDecoder(file).Decode(&util.Config); err != nil {
		fmt.Println("Could not decode configuration!")
		panic(err)
	}
}

var store db.Store

func dbConnect() {
	store = factory.CreateStore()

	store.Connect("")
}

func stringInSlice(a string, list []string) (int, bool) {
	for k, b := range list {
		if b == a {
			return k, true
		}
	}
	return 0, false
}

func printError(err error) {
	if err != nil {
		//fmt.Println(err)
		panic(err)
	}
}


================================================
FILE: .dredd/hooks/main.go
================================================
package main

import (
	"strconv"
	"strings"

	"github.com/snikch/goodman/hooks"
	trans "github.com/snikch/goodman/transaction"
)

const (
	adminToken   = "h4a_i4qslpnxyyref71rk5nqbwxccrs7enwvggx0vfs="
	expiredToken = "kwofd61g93-yuqvex8efmhjkgnbxlo8mp1tin6spyhu="
)

var skipTests = []string{
	// TODO - dredd seems not to like the text response from this endpoint
	"/api/ping > PING test > 200 > text/plain; charset=utf-8",
	"/api/ws > Websocket handler > 200 > application/json",
	"authentication > /api/auth/login > Performs Login > 204 > application/json",
	"authentication > /api/auth/logout > Destroys current session > 204 > application/json",
	"/project/{project_id}/notifications/test",
	//"/api/upgrade > Upgrade the server > 200 > application/json",
	// TODO - Skipping this while we work out how to get a 204 response from the api for testing
	//"/api/upgrade > Check if new updates available and fetch /info > 204 > application/json",
}

// Dredd expects that you have already set up the database and run all migrations before it begins.
// It will NOT initialize the database, only insert its test data.
// It does this in a way which ignores errors, which is fine on the ci, but might be an issue locally
// so look at the logs carefully if these tests fail and if in doubt re-init the db
// These hooks do NOT clean up after themselves and they produce a lot of database writes,
// so don't run this in production
func main() {

	h := hooks.NewHooks()
	server := hooks.NewServer(hooks.NewHooksRunner(h))

	//Get database connection info and create an admin who's token is used to execute the tests
	h.BeforeAll(func(t []*trans.Transaction) {
		loadConfig()
		addTestRunnerUser()
	})

	for _, v := range skipTests {
		h.Before(v, skipTest)
	}

	h.BeforeEach(func(t *trans.Transaction) {
		if strings.HasPrefix(t.Name, "user") {
			addCapabilities([]string{"user"})
		} else if strings.HasPrefix(t.Name, "project") || strings.HasPrefix(t.Name, "projects") {
			addCapabilities([]string{"project"})
		}
	})

	h.Before("user > /api/user/tokens/{api_token_id} > Expires API token > 204 > application/json", func(transaction *trans.Transaction) {
		dbConnect()
		defer store.Close("")
		addToken(expiredToken, testRunnerUser.ID)
	})

	h.After("user > /api/user/tokens/{api_token_id} > Expires API token > 204 > application/json", func(transaction *trans.Transaction) {
		dbConnect()
		defer store.Close("")
		//tokens are expired and not deleted so we need to clean up
		_ = store.DeleteAPIToken(testRunnerUser.ID, expiredToken)
	})

	// This one seems to need some manual value setting in the body
	h.Before("user > /api/users/{user_id}/password > Updates user password > 204 > application/json", func(transaction *trans.Transaction) {
		transaction.Request.Body = "{\"password\":\"staub\"}"
	})

	// delete the auto generated association and insert the user id into the query
	h.Before("project > /api/project/{project_id}/users > Link user to project > 204 > application/json", func(transaction *trans.Transaction) {
		dbConnect()
		defer store.Close("")
		deleteUserProjectRelation(userProject.ID, userPathTestUser.ID)
		transaction.Request.Body = "{ \"user_id\": " + strconv.Itoa(userPathTestUser.ID) + ",\"role\": \"owner\"}"
	})

	h.Before("project > /api/project/{project_id}/invites > Get invitations for project > 200 > application/json", capabilityWrapper("invite"))
	h.Before("project > /api/project/{project_id}/invites > Create project invitation > 201 > application/json", capabilityWrapper("invite"))
	h.Before("project > /api/project/{project_id}/invites/{invite_id} > Get specific project invitation > 200 > application/json", capabilityWrapper("invite"))
	h.Before("project > /api/project/{project_id}/invites/{invite_id} > Update project invitation status > 204 > application/json", capabilityWrapper("invite"))
	h.Before("project > /api/project/{project_id}/invites/{invite_id} > Delete project invitation > 204 > application/json", capabilityWrapper("invite"))

	h.Before("integration > /api/project/{project_id}/integrations > get all integrations > 200 > application/json", capabilityWrapper("integration"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id} > Get Integration > 200 > application/json", capabilityWrapper("integration"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id} > Update Integration > 204 > application/json", capabilityWrapper("integration"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id} > Remove integration > 204 > application/json", capabilityWrapper("integration"))

	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/values > Get Integration Extracted Values linked to integration extractor > 200 > application/json", capabilityWrapper("integrationextractvalue"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/values > Add Integration Extracted Value > 204 > application/json", capabilityWrapper("integrationextractvalue"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/values/{extractvalue_id} > Removes integration extract value > 204 > application/json", capabilityWrapper("integrationextractvalue"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/values > Add Integration Extracted Value > 204 > application/json", capabilityWrapper("integration"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/values/{extractvalue_id} > Updates Integration ExtractValue > 204 > application/json", capabilityWrapper("integrationextractvalue"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/matchers > Get Integration Matcher linked to integration extractor > 200 > application/json", capabilityWrapper("integration"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/matchers > Add Integration Matcher > 204 > application/json", capabilityWrapper("integration"))
	h.Before("integration > /api/project/{project_id}/integrations/{integration_id}/matchers/{matcher_id} > Updates Integration Matcher > 204 > application/json", capabilityWrapper("integrationmatcher"))

	h.Before("key-store > /api/project/{project_id}/keys > Add access key > 201 > application/json", capabilityWrapper("access_key"))
	h.Before("key-store > /api/project/{project_id}/keys/{key_id} > Updates access key > 204 > application/json", capabilityWrapper("access_key"))
	h.Before("key-store > /api/project/{project_id}/keys/{key_id} > Removes access key > 204 > application/json", capabilityWrapper("access_key"))

	h.Before("repository > /api/project/{project_id}/repositories > Add repository > 201 > application/json", capabilityWrapper("access_key"))
	h.Before("repository > /api/project/{project_id}/repositories/{repository_id} > Get repository > 200 > application/json", capabilityWrapper("repository"))
	h.Before("repository > /api/project/{project_id}/repositories/{repository_id} > Updates repository > 204 > application/json", capabilityWrapper("repository"))
	h.Before("repository > /api/project/{project_id}/repositories/{repository_id} > Removes repository > 204 > application/json", capabilityWrapper("repository"))

	h.Before("inventory > /api/project/{project_id}/inventory > create inventory > 201 > application/json", capabilityWrapper("inventory"))
	h.Before("inventory > /api/project/{project_id}/inventory/{inventory_id} > Get inventory > 200 > application/json", capabilityWrapper("inventory"))
	h.Before("inventory > /api/project/{project_id}/inventory/{inventory_id} > Updates inventory > 204 > application/json", capabilityWrapper("inventory"))
	h.Before("inventory > /api/project/{project_id}/inventory/{inventory_id} > Removes inventory > 204 > application/json", capabilityWrapper("inventory"))

	h.Before("variable-group > /api/project/{project_id}/environment > Add environment > 201 > application/json", capabilityWrapper("environment"))
	h.Before("variable-group > /api/project/{project_id}/environment/{environment_id} > Get environment > 200 > application/json", capabilityWrapper("environment"))
	h.Before("variable-group > /api/project/{project_id}/environment/{environment_id} > Update environment > 204 > application/json", capabilityWrapper("environment"))
	h.Before("variable-group > /api/project/{project_id}/environment/{environment_id} > Removes environment > 204 > application/json", capabilityWrapper("environment"))

	h.Before("template > /api/project/{project_id}/templates > create template > 201 > application/json", func(t *trans.Transaction) {
		addCapabilities([]string{"repository", "inventory", "environment", "view"})
	})

	h.Before("template > /api/project/{project_id}/templates/{template_id}/stop_all_tasks > Stop all active tasks of template > 204 > application/json", capabilityWrapper("template"))
	h.Before("template > /api/project/{project_id}/templates/{template_id} > Get template > 200 > application/json", capabilityWrapper("template"))
	h.Before("template > /api/project/{project_id}/templates/{template_id} > Updates template > 204 > application/json", capabilityWrapper("template"))
	h.Before("template > /api/project/{project_id}/templates/{template_id} > Removes template > 204 > application/json", capabilityWrapper("template"))

	h.Before("task > /api/project/{project_id}/tasks > Starts a job > 201 > application/json", capabilityWrapper("template"))
	h.Before("task > /api/project/{project_id}/tasks/last > Get last 200 Tasks related to current project > 200 > application/json", capabilityWrapper("template"))

	h.Before("task > /api/project/{project_id}/tasks/{task_id} > Get a single task > 200 > application/json", capabilityWrapper("task"))
	h.Before("task > /api/project/{project_id}/tasks/{task_id} > Deletes task (including output) > 204 > application/json", capabilityWrapper("task"))
	h.Before("task > /api/project/{project_id}/tasks/{task_id}/output > Get task output > 200 > application/json", capabilityWrapper("task"))
	h.Before("task > /api/project/{project_id}/tasks/{task_id}/raw_output > Get task raw output > 200 > text/plain; charset=utf-8", capabilityWrapper("task"))
	h.Before("task > /api/project/{project_id}/tasks/{task_id}/stop > Stop a job > 204 > application/json", capabilityWrapper("task"))

	h.Before("schedule > /api/project/{project_id}/schedules/{schedule_id} > Get schedule > 200 > application/json", capabilityWrapper("schedule"))
	h.Before("schedule > /api/project/{project_id}/schedules/{schedule_id} > Updates schedule > 204 > application/json", capabilityWrapper("schedule"))
	h.Before("schedule > /api/project/{project_id}/schedules/{schedule_id} > Deletes schedule > 204 > application/json", capabilityWrapper("schedule"))

	h.Before("project > /api/project/{project_id}/views/{view_id} > Get view > 200 > application/json", capabilityWrapper("view"))
	h.Before("project > /api/project/{project_id}/views/{view_id} > Updates view > 204 > application/json", capabilityWrapper("view"))
	h.Before("project > /api/project/{project_id}/views/{view_id} > Removes view > 204 > application/json", capabilityWrapper("view"))

	h.Before("project > /api/project/{project_id}/backup > Get backup > 200 > application/json", func(t *trans.Transaction) {
		addCapabilities([]string{"repository", "inventory", "environment", "view", "template"})
	})

	//Add these last as they normalize the requests and path values after hook processing
	h.BeforeAll(func(transactions []*trans.Transaction) {
		for _, t := range transactions {
			h.Before(t.Name, setupObjectsAndPaths)
		}
	})

	// Delete the test runner user so adding him next time does not result in errors
	h.AfterAll(removeTestRunnerUser)

	server.Serve()
	defer server.Listener.Close()
}


================================================
FILE: .dredd/server-wrapper.sh
================================================
#!/bin/sh

export SEMAPHORE_MAX_TASKS_PER_TEMPLATE=300
./semaphore server --config .dredd/config.json

================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github: semaphoreui
#patreon: semaphoreui
#ko_fi: fiftin
open_collective: # semaphore
tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
liberapay: # Replace with a single Liberapay username
issuehunt: # Replace with a single IssueHunt username
otechie: # Replace with a single Otechie username
lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']


================================================
FILE: .github/ISSUE_TEMPLATE/documentation.yml
================================================
---

name: Documentation
description: You have a found missing or invalid documentation
title: "Docs: "
labels: ['documentation', 'triage']

body:
  - type: markdown
    attributes:
      value: |
        Please make sure to go through these steps **before opening an issue**:
        
        - [ ] Read the [documentation](https://docs.semaphoreui.com/)
          - [ ] Read the [troubleshooting guide](https://docs.semaphoreui.com/administration-guide/troubleshooting)
          - [ ] Read the [documentation regarding manual installations](https://docs.semaphoreui.com/administration-guide/installation_manually) if you did install Semaphore that way

        - [ ] Check if there are existing [issues](https://github.com/semaphoreui/semaphore/issues) or [discussions](https://github.com/semaphoreui/semaphore/discussions) regarding your topic

  - type: textarea
    id: problem
    attributes:
      label: Problem
      description: |
        Describe what part of the documentation is missing or wrong!
        Please also tell us what you would expected to find.
        What would you change or add?
    validations:
      required: true

  - type: dropdown
    id: related-to
    attributes:
      label: Related to
      description: |
        To what parts of Semaphore is the documentation related? (if any)

      multiple: true
      options:
        - Web-Frontend (what users interact with)
        - Web-Backend (APIs)
        - Service (scheduled tasks, alerts)
        - Ansible (task execution)
        - Configuration
        - Database
        - Docker
    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
---

name: Feature request
description: You would like to have a new feature implemented
title: "Feature: "
labels: ['feature', 'triage']

body:
  - type: markdown
    attributes:
      value: |
        Please make sure to go through these steps **before opening an issue**:
        
        - [ ] Read the [documentation](https://docs.semaphoreui.com/)
          - [ ] Read the [troubleshooting guide](https://docs.semaphoreui.com/administration-guide/troubleshooting)
          - [ ] Read the [documentation regarding manual installations](https://docs.semaphoreui.com/administration-guide/installation_manually) if you did install Semaphore that way

        - [ ] Check if there are existing [issues](https://github.com/semaphoreui/semaphore/issues) or [discussions](https://github.com/semaphoreui/semaphore/discussions) regarding your topic

  - type: dropdown
    id: related-to
    attributes:
      label: Related to
      description: |
        To what parts of Semaphore is the feature related?

      multiple: true
      options:
        - Web-Frontend (what users interact with)
        - Web-Backend (APIs)
        - Service (scheduled tasks, alerts)
        - Ansible (task execution)
        - Configuration
        - Database
        - Docker
        - Other
    validations:
      required: true

  - type: dropdown
    id: impact
    attributes:
      label: Impact
      description: |
        What impact would the feature have for Semaphore users?

      multiple: false
      options:
        - nice to have
        - nice to have for enterprise usage
        - better user experience
        - security improvements
        - major improvement to user experience
        - must have for enterprise usage
        - must have
    validations:
      required: true

  - type: textarea
    id: feature
    attributes:
      label: Missing Feature
      description: |
        Describe the feature you are missing.
        Why would you like to see such a feature being implemented?

    validations:
      required: true

  - type: textarea
    id: implementation
    attributes:
      label: Implementation
      description: |
        Please think about how the feature should be implemented.
        What would you suggest?
        How should it look and behave?

    validations:
      required: true

  - type: textarea
    id: design
    attributes:
      label: Design
      description: |
        If you have programming experience yourself:
        Please provide us with an example how you would design this feature.

        What edge-cases need to be covered?
        Are there relations to other components that need to be though of?

    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/problem.yml
================================================
---

name: Problem
description: You have encountered problems when using Semaphore
title: "Problem: "
labels: ['problem', 'triage']

body:
  - type: markdown
    attributes:
      value: |
        Please make sure to go through these steps **before opening an issue**:
        
        - [ ] Read the [documentation](https://docs.semaphoreui.com/)
          - [ ] Read the [troubleshooting guide](https://docs.semaphoreui.com/administration-guide/troubleshooting)
          - [ ] Read the [documentation regarding manual installations](https://docs.semaphoreui.com/administration-guide/installation_manually) if you don't use docker

        - [ ] Check if there are existing [issues](https://github.com/semaphoreui/semaphore/issues) or [discussions](https://github.com/semaphoreui/semaphore/discussions) regarding your topic

  - type: textarea
    id: problem
    attributes:
      label: Issue
      description: |
        Describe the problem you encountered and tell us what you would have expected to happen

    validations:
      required: true

  - type: dropdown
    id: impact
    attributes:
      label: Impact
      description: |
        What parts of Semaphore are impacted by the problem?

      multiple: true
      options:
        - Web-Frontend (what users interact with)
        - Web-Backend (APIs)
        - Service (scheduled tasks, alerts)
        - Ansible (task execution)
        - Configuration
        - Database
        - Docker
        - Semaphore Project
        - Other
    validations:
      required: true

  - type: dropdown
    id: install-method
    attributes:
      label: Installation method
      description: |
        How did you install Semaphore?

      multiple: false
      options:
        - Docker
        - Package
        - Binary
        - Snap
    validations:
      required: true


  - type: dropdown
    id: databases
    attributes:
      label: Database
      description: |
        What database you use?

      multiple: true
      options:
        - SQLite
        - MySQL
        - BoltDB
        - Postgres


  - type: dropdown
    id: browsers
    attributes:
      label: Browser
      description: |
        If the problem occurs in the Semaphore WebUI - in what browsers do you see it?

      multiple: true
      options:
        - Firefox
        - Chrome
        - Safari
        - Microsoft Edge
        - Opera

  - type: textarea
    id: version-semaphore
    attributes:
      label: Semaphore Version
      description: |
        What version of Semaphore are you running?
        > Command: `semaphore version`
    validations:
      required: true

  - type: textarea
    id: version-ansible
    attributes:
      label: Ansible Version
      description: |
        If your problem occurs when executing a task:
        > What version of Ansible are you running?
        > Command: `ansible --version`

        If your problem occurs when executing a specific Ansible Module:
        > Provide the Ansible Module versions!
        > Command: `ansible-galaxy collection list`

      render: bash
    validations:
      required: false

  - type: textarea
    id: logs
    attributes:
      label: Logs & errors
      description: |
        Provide logs and error messages you have encountered!
        
        Logs of the service:
        > Docker command: `docker logs <container-name>`
        > Systemd command: `journalctl -u <serivce-name> --no-pager --full -n 250`

        If the error occurs in the WebUI:
        > please add a screenshot
        > check your browser console for errors (`F12` in most browsers)

        Tip: You can attach images or log files by clicking this area to highlight it and then dragging files in.

    validations:
      required: false

  - type: textarea
    id: manual-installation
    attributes:
      label: Manual installation - system information
      description: |
        If you have installed Semaphore using the package or binary:
        
        Please share your operating system & -version!
        > Command: `uname -a`
        
        What reverse proxy are you using?
    validations:
      required: false

  - type: textarea
    id: config
    attributes:
      label: Configuration
      description: |
        Please provide Semaphore configuration related to your problem - like:
        * Config file options
        * Environment variables
        * WebUI configuration
          * Task templates
          * Inventories
          * Environment
          * Repositories
          * ...

    validations:
      required: false

  - type: textarea
    id: additional
    attributes:
      label: Additional information
      description: |
        Do you have additional information that could help troubleshoot the problem?

    validations:
      required: false


================================================
FILE: .github/ISSUE_TEMPLATE/question.yml
================================================
---

name: Question
description: You have a question on how to use Semaphore
title: "Question: "
labels: ['question', 'triage']

body:
  - type: markdown
    attributes:
      value: |
        Please make sure to go through these steps **before opening an issue**:
        
        - [ ] Read the [documentation](https://docs.semaphoreui.com/)
          - [ ] Read the [troubleshooting guide](https://docs.semaphoreui.com/administration-guide/troubleshooting)
          - [ ] Read the [documentation regarding manual installations](https://docs.semaphoreui.com/administration-guide/installation_manually) if you did install Semaphore that way

        - [ ] Check if there are existing [issues](https://github.com/semaphoreui/semaphore/issues) or [discussions](https://github.com/semaphoreui/semaphore/discussions) regarding your topic

  - type: textarea
    id: question
    attributes:
      label: Question
    validations:
      required: true

  - type: dropdown
    id: related-to
    attributes:
      label: Related to
      description: |
        To what parts of Semaphore is the question related? (if any)

      multiple: true
      options:
        - Web-Frontend (what users interact with)
        - Web-Backend (APIs)
        - Service (scheduled tasks, alerts)
        - Ansible (task execution)
        - Configuration
        - Database
        - Documentation
        - Docker
    validations:
      required: false


================================================
FILE: .github/copilot-instructions.md
================================================
# Semaphore UI Development Instructions

**Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.**

Semaphore UI is a modern web interface for managing popular DevOps tools like Ansible, Terraform, PowerShell, and Bash scripts. It's built with Go (backend) and Vue.js (frontend), using Task runner for build automation.

## Working Effectively

### Bootstrap, build, and test the repository:
- Install Go 1.21+ (currently requires go version 1.21 or higher)
- Install Node.js 16+ 
- Install Task runner: `go install github.com/go-task/task/v3/cmd/task@latest`
- Install dependencies: `task deps` -- takes 3 minutes first time (faster with cache). NEVER CANCEL. Set timeout to 5+ minutes.
- Build the application: `task build` -- takes 1.5 minutes. NEVER CANCEL. Set timeout to 3+ minutes.
- Run tests: `task test` -- takes 33 seconds. NEVER CANCEL. Set timeout to 2+ minutes.

### Run the application:
- ALWAYS run the bootstrapping steps first
- Setup database and admin user: `./bin/semaphore setup` (interactive, use BoltDB option 2 for development)
- Start server: `./bin/semaphore server --config ./config.json`
- Web UI: http://localhost:3000 (login: admin / changeme)
- API: http://localhost:3000/api/ (test with: `curl http://localhost:3000/api/ping`)

## Validation

- **CRITICAL**: Always manually validate any new code by building and running the application.
- ALWAYS run through at least one complete end-to-end scenario after making changes:
  1. Build the application: `task build`
  2. Start the server: `./bin/semaphore server --config ./config.json`
  3. Test API endpoint: `curl http://localhost:3000/api/ping` (should return "pong")
  4. Access web UI at http://localhost:3000 and verify it loads
  5. For auth changes: Test login with admin/changeme
- For significant changes, run full setup process to ensure setup still works
- Always build and exercise your changes before considering the task complete

### Complete Validation Scenario (for major changes):
```bash
# 1. Clean build
task build

# 2. Setup database (if config.json doesn't exist)
./bin/semaphore setup  # Choose option 2 (BoltDB), use admin/changeme

# 3. Start server
./bin/semaphore server --config ./config.json

# 4. Test in another terminal
curl http://localhost:3000/api/ping  # Should return "pong"
curl -I http://localhost:3000/       # Should return HTTP 200

# 5. Test web interface manually in browser at http://localhost:3000
# 6. Test login with admin/changeme if auth-related changes
```

### Linting and Code Quality

- Frontend linting: `cd web && npm run lint` (has known warnings about console statements and asset sizes - ignore existing issues)
- Backend linting: `golangci-lint run --timeout=3m` (has known type errors due to module import issues - ignore existing issues) 
- **DO NOT** try to fix existing linting issues unless specifically asked to
- Always run linting on new code you add to ensure it follows project standards
- Install golangci-lint if needed: `go install github.com/golangci/golangci-lint/cmd/golangci-lint@v1.57.2`

## Common Tasks

### Repository Structure
```
.
├── README.md           - Project documentation  
├── CONTRIBUTING.md     - Development guidelines
├── Taskfile.yml       - Task runner configuration
├── go.mod             - Go module dependencies
├── web/               - Vue.js frontend application
│   ├── package.json   - Frontend dependencies
│   ├── src/           - Vue.js source code
│   └── public/        - Static assets
├── cli/               - Go CLI application entry point  
├── api/               - Go API server endpoints
├── db/                - Database models and interfaces
├── services/          - Business logic services
├── util/              - Utility functions and configuration
├── bin/               - Built binaries (after build)
└── config.json       - Runtime configuration (after setup)
```

### Key Commands Reference
```bash
# Install task runner
go install github.com/go-task/task/v3/cmd/task@latest

# Install all dependencies (backend + frontend + tools)
task deps

# Build application (frontend + backend)
task build

# Run tests
task test  

# Run linting
task lint

# Setup application (interactive)
./bin/semaphore setup

# Start server
./bin/semaphore server --config ./config.json

# View available task commands
task --list
```

### Database Options for Development
During setup, choose option 2 (BoltDB) for simplest development setup:
- No external database required
- Database file stored as `database.boltdb` in project root
- Perfect for development and testing

### Frontend Development
- Vue.js 2.x application in `web/` directory
- Built with Vue CLI and Vuetify components
- Build output goes to `api/public/` for serving by Go backend
- Development server not typically used - Go server serves built assets

### Backend Development  
- Go application with CLI and API server
- Uses Gorilla Mux for routing
- Supports multiple databases: MySQL, PostgreSQL, SQLite, BoltDB
- Configuration via JSON file or environment variables

## Troubleshooting

### Build Issues
- If `task` command not found: Install with `go install github.com/go-task/task/v3/cmd/task@latest`
- If Go version errors: Ensure Go 1.21+ is installed
- If npm install fails: Ensure Node.js 16+ is installed
- If build takes too long: This is normal - frontend build can take 60+ seconds

### Runtime Issues  
- If server won't start: Check config.json exists and database is accessible
- If web UI shows errors: Check that frontend build completed successfully in `api/public/`
- If API returns errors: Check server logs for specific error messages

### Database Issues
- For development, always use BoltDB (option 2) during setup
- Database file will be created automatically
- If database errors occur, delete `database.boltdb` and run setup again

## Important Notes

- **NEVER CANCEL** long-running builds or dependency installations
- Set appropriate timeouts: deps (5+ min), build (3+ min), tests (2+ min)  
- The application serves the frontend from the Go backend - no separate frontend server needed
- Configuration is stored in `config.json` after running setup
- Default admin credentials after setup: admin / changeme
- Linting has known issues - focus on not introducing new ones
- Always test changes by running the full application, not just unit tests

================================================
FILE: .github/workflows/community_beta.yml
================================================
name: Community Beta

'on':
  push:
    tags:
      - v*-beta*

permissions:
  contents: write

jobs:
  prerelease:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Install rpm
        run: |
          sudo apt update && sudo apt-get install rpm

      - name: Install deps
        run: |
          task deps

      - name: Import gnupg
        run: |
          echo "${{ secrets.GPG_KEY }}" | tr " " "\n" | base64 -d | gpg --import --batch
          gpg --sign -u "${{ vars.GPG_KEY_ID }}" --pinentry-mode loopback --yes --batch --passphrase "${{ secrets.GPG_PASS }}" --output unlock.sig --detach-sign README.md
          rm -f unlock.sig

      - name: Reset repo
        run: |
          git reset --hard

      - name: Run release
        run: |
          GITHUB_TOKEN=${{ github.token }} \
          PROJECT_NAME=semaphore_community \
          GPG_KEY_ID="${{ vars.GPG_KEY_ID }}" \
          task release:prod

  deploy-beta:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'semaphoreui'

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup qemu
        id: qemu
        uses: docker/setup-qemu-action@v3

      - name: Setup buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}

      - name: Server meta
        id: server
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            semaphoreui/semaphore-community
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}
          flavor: |
            latest=false

      - name: Server build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: ${{ steps.server.outputs.tags }}

      - name: Runner meta
        if: false
        id: runner
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            semaphoreui/runner-community
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}
          flavor: |
            latest=false

      - name: Runner build
        if: false
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: ${{ steps.runner.outputs.tags }}


================================================
FILE: .github/workflows/community_release.yml
================================================
name: Community Release

'on':
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'
      - v*-rc*

permissions:
  contents: write

jobs:
  release:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Install rpm
        run: |
          sudo apt update && sudo apt-get install rpm

      - name: Install deps
        run: |
          task deps

      - name: Import gnupg
        run: |
          echo "${{ secrets.GPG_KEY }}" | tr " " "\n" | base64 -d | gpg --import --batch
          gpg --sign -u "${{ vars.GPG_KEY_ID }}" --pinentry-mode loopback --yes --batch --passphrase "${{ secrets.GPG_PASS }}" --output unlock.sig --detach-sign README.md
          rm -f unlock.sig

      - name: Reset repo
        run: |
          git reset --hard

      - name: Run release
        run: |
          GITHUB_TOKEN=${{ github.token }} \
          GPG_KEY_ID="${{ vars.GPG_KEY_ID }}" \
          PROJECT_NAME=semaphore_community \
            task release:prod

  deploy-prod:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'semaphoreui'

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup qemu
        id: qemu
        uses: docker/setup-qemu-action@v3

      - name: Setup buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}



      - name: Server meta
        id: server
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            semaphoreui/semaphore-community
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}
          flavor: |
            latest=true

      - name: Server build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 # ,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: ${{ steps.server.outputs.tags }}

      - name: Server build with Ansible 2.16.5
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            ANSIBLE_VERSION=9.4.0
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 # ,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: semaphoreui/semaphore-community:${{ github.ref_name }}-ansible2.16.5

      - name: Server build with PowerShell 7.5.0
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            POWERSHELL_VERSION=7.5.0
            SEMAPHORE_IMAGE=semaphoreui/semaphore-community
            SEMAPHORE_VERSION=${{ github.ref_name }}
          file: deployment/docker/server/powershell/Dockerfile
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: semaphoreui/semaphore-community:${{ github.ref_name }}-powershell7.5.0



      - name: Runner meta
        id: runner
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            semaphoreui/runner-community
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}
          flavor: |
            latest=true

      - name: Runner build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: ${{ steps.runner.outputs.tags }}

      - name: Runner build with Ansible 2.16.5
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            ANSIBLE_VERSION=9.4.0
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: semaphoreui/runner-community:${{ github.ref_name }}-ansible2.16.5

      - name: Runner build with PowerShell 7.5.0
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            POWERSHELL_VERSION=7.5.0
            SEMAPHORE_IMAGE=semaphoreui/runner-community
            SEMAPHORE_VERSION=${{ github.ref_name }}
          file: deployment/docker/server/powershell/Dockerfile
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: semaphoreui/runner-community:${{ github.ref_name }}-powershell7.5.0


================================================
FILE: .github/workflows/dev.yml
================================================
name: Dev

'on':
  push:
    branches:
      - develop
      - 2-*-stable
  pull_request:
    branches:
      - develop

jobs:
  build-local:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Install deps
        run: |
          task deps

      - name: Run build
        run: task build

      - name: Check modification
        run: |
          git diff --exit-code --stat -- . ':(exclude)web/package.json' ':(exclude)web/package-lock.json' ':(exclude)go.mod' ':(exclude)go.sum'

      - name: Run tests
        run: task test

      - name: Upload artifacts
        uses: actions/upload-artifact@v4
        with:
          name: semaphore
          path: bin/semaphore
          retention-days: 1

  migrate-mysql:
    runs-on: ubuntu-latest

    needs:
      - build-local

    services:
      mysql:
        image: mysql:8.4
        env:
          MYSQL_ROOT_PASSWORD: p455w0rd
          MYSQL_USER: semaphore
          MYSQL_PASSWORD: p455w0rd
          MYSQL_DATABASE: semaphore
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 3306:3306

    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.json <<EOF
            {
              "mysql": {
                "host": "localhost:3306",
                "user": "semaphore",
                "pass": "p455w0rd",
                "name": "semaphore"
              },
              "dialect": "mysql",
              "email_alert": false
            }
          EOF

      - name: Migrate database
        run: |
          chmod +x ./semaphore && ./semaphore migrate --config config.json

  migrate-mariadb:
    runs-on: ubuntu-latest

    needs:
      - build-local

    services:
      mariadb:
        image: mariadb:10.11
        env:
          MARIADB_ROOT_PASSWORD: p455w0rd
          MARIADB_USER: semaphore
          MARIADB_PASSWORD: p455w0rd
          MARIADB_DATABASE: semaphore
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 3306:3306

    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.json <<EOF
            {
              "mysql": {
                "host": "localhost:3306",
                "user": "semaphore",
                "pass": "p455w0rd",
                "name": "semaphore"
              },
              "dialect": "mysql",
              "email_alert": false
            }
          EOF

      - name: Migrate database
        run: |
          chmod +x ./semaphore && ./semaphore migrate --config config.json

  migrate-postgres:
    runs-on: ubuntu-latest

    needs:
      - build-local

    services:
      postgres:
        image: postgres:12.22
        env:
          POSTGRES_USER: semaphore
          POSTGRES_PASSWORD: p455w0rd
          POSTGRES_DB: semaphore
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432

    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.json <<EOF
            {
              "postgres": {
                "host": "localhost:5432",
                "user": "semaphore",
                "pass": "p455w0rd",
                "name": "semaphore",
                "options": {
                  "sslmode": "disable"
                }
              },
              "dialect": "postgres",
              "email_alert": false
            }
          EOF

      - name: Migrate database
        run: |
          chmod +x ./semaphore && ./semaphore migrate --config config.json

  migrate-sqlite:
    runs-on: ubuntu-latest

    needs:
      - build-local

    steps:
      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.json <<EOF
            {
              "sqlite": {
                "host": "/tmp/db.sqlite"
              },
              "dialect": "sqlite",
              "email_alert": false
            }
          EOF

      - name: Migrate database
        run: |
          chmod +x ./semaphore && ./semaphore migrate --config config.json

  integrate-mysql:
    runs-on: ubuntu-latest

    needs:
      - migrate-mysql

    services:
      mysql:
        image: mysql:8.4
        env:
          MYSQL_ROOT_PASSWORD: p455w0rd
          MYSQL_USER: semaphore
          MYSQL_PASSWORD: p455w0rd
          MYSQL_DATABASE: semaphore
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 3306:3306

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.stdin <<EOF
          1
          localhost:3306
          semaphore
          p455w0rd
          semaphore
          /tmp/semaphore
          http://localhost:3000
          no
          no
          no
          no
          no
          no
          $(pwd)/.dredd
          admin
          admin@localhost
          Developer
          password
          EOF

      - name: Execute setup
        run: |
          chmod +x ./semaphore && ./semaphore setup - < config.stdin

      - name: Launch dredd
        run: |
          task dredd:goodman
          task dredd:deps
          task dredd:hooks
          task dredd:test

  integrate-mariadb:
    runs-on: ubuntu-latest

    needs:
      - migrate-mariadb

    services:
      mariadb:
        image: mariadb:10.11
        env:
          MARIADB_ROOT_PASSWORD: p455w0rd
          MARIADB_USER: semaphore
          MARIADB_PASSWORD: p455w0rd
          MARIADB_DATABASE: semaphore
        options: >-
          --health-cmd "mysqladmin ping"
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 3306:3306

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.stdin <<EOF
          1
          localhost:3306
          semaphore
          p455w0rd
          semaphore
          /tmp/semaphore
          http://localhost:3000
          no
          no
          no
          no
          no
          no
          $(pwd)/.dredd
          admin
          admin@localhost
          Developer
          password
          EOF

      - name: Execute setup
        run: |
          chmod +x ./semaphore && ./semaphore setup - < config.stdin

      - name: Launch dredd
        run: |
          task dredd:goodman
          task dredd:deps
          task dredd:hooks
          task dredd:test

  integrate-postgres:
    runs-on: ubuntu-latest

    needs:
      - migrate-postgres

    services:
      postgres:
        image: postgres:12.22
        env:
          POSTGRES_USER: semaphore
          POSTGRES_PASSWORD: p455w0rd
          POSTGRES_DB: semaphore
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
        ports:
          - 5432:5432

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.stdin <<EOF
          3
          localhost:5432
          semaphore
          p455w0rd
          semaphore
          /tmp/semaphore
          http://localhost:3000
          no
          no
          no
          no
          no
          no
          $(pwd)/.dredd
          admin
          admin@localhost
          Developer
          password
          EOF

      - name: Execute setup
        run: |
          chmod +x ./semaphore && ./semaphore setup - < config.stdin

      - name: Launch dredd
        run: |
          task dredd:goodman
          task dredd:deps
          task dredd:hooks
          task dredd:test

  integrate-sqlite:
    runs-on: ubuntu-latest

    needs:
      - migrate-sqlite

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: semaphore

      - name: Write config
        run: |
          cat > config.stdin <<EOF
          4
          /tmp/database.sqlite
          /tmp/semaphore
          http://localhost:3000
          no
          no
          no
          no
          no
          no
          $(pwd)/.dredd
          admin
          admin@localhost
          Developer
          password
          EOF

      - name: Execute setup
        run: |
          chmod +x ./semaphore && ./semaphore setup - < config.stdin

      - name: Launch dredd
        run: |
          task dredd:goodman
          task dredd:deps
          task dredd:hooks
          task dredd:test

  deploy-server:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'semaphoreui'

    needs:
      - integrate-mysql
      - integrate-mariadb
      - integrate-postgres
      - integrate-sqlite

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup qemu
        id: qemu
        uses: docker/setup-qemu-action@v3

      - name: Setup buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}

      - name: Server meta
        id: server
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            semaphoreui/semaphore-community
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=develop
          flavor: |
            latest=false

      - name: Server build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: ${{ steps.server.outputs.tags }}

  deploy-runner:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'semaphoreui'

    needs:
      - integrate-mysql
      - integrate-mariadb
      - integrate-postgres

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup qemu
        id: qemu
        uses: docker/setup-qemu-action@v3

      - name: Setup buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}

      - name: Runner meta
        id: runner
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            semaphoreui/runner-community
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=develop
          flavor: |
            latest=false

      - name: Runner build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: ${{ steps.runner.outputs.tags }}


================================================
FILE: .github/workflows/pro_selfhosted_beta.yml
================================================
name: Pro Self-Hosted Release

'on':
  push:
    tags:
      - v*-beta*
      - v*-rc*

permissions:
  contents: write

jobs:
  prerelease:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Install rpm
        run: |
          sudo apt update && sudo apt-get install rpm

      - name: Add PRO implementation
        run: |
          git clone https://${{ secrets.GH_TOKEN }}@github.com/semaphoreui/semaphorepro-module.git pro_impl
          go work init . ./pro_impl

      - name: Install deps
        run: |
          task deps APP_BUILD_TYPE=pro_selfhosted

      - name: Import gnupg
        run: |
          echo "${{ secrets.GPG_KEY }}" | tr " " "\n" | base64 -d | gpg --import --batch
          gpg --sign -u "${{ vars.GPG_KEY_ID }}" --pinentry-mode loopback --yes --batch --passphrase "${{ secrets.GPG_PASS }}" --output unlock.sig --detach-sign README.md
          rm -f unlock.sig

      - name: Reset repo
        run: |
          git reset --hard

      - name: Run release
        run: |
          APP_BUILD_TYPE=pro_selfhosted \
          GITHUB_TOKEN=${{ github.token }} \
          GPG_KEY_ID="${{ vars.GPG_KEY_ID }}" \
          PROJECT_NAME=semaphore \
            task release:prod

  deploy-beta:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'semaphoreui'

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup qemu
        id: qemu
        uses: docker/setup-qemu-action@v3

      - name: Setup buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          registry: public.ecr.aws
          username: ${{ vars.AWS_ACCESS_KEY_ID }}
          password: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        env:
          AWS_REGION: us-east-1

      - name: Docker Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}



      - name: Server meta
        id: server
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            public.ecr.aws/semaphore/pro/server
            public.ecr.aws/semaphore/server
            semaphoreui/semaphore
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}

      - name: Server build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            GH_TOKEN=${{ secrets.GH_TOKEN }}
            APP_BUILD_TYPE=pro_selfhosted
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 # ,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: ${{ steps.server.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Server build with Ansible 2.16.5
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            ANSIBLE_VERSION=9.4.0
            GH_TOKEN=${{ secrets.GH_TOKEN }}
            APP_BUILD_TYPE=pro_selfhosted
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 # ,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/server:${{ github.ref_name }}-ansible2.16.5
            public.ecr.aws/semaphore/server:${{ github.ref_name }}-ansible2.16.5
            semaphoreui/semaphore:${{ github.ref_name }}-ansible2.16.5
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Server build with PowerShell 7.5.0
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            POWERSHELL_VERSION=7.5.0
            SEMAPHORE_IMAGE=public.ecr.aws/semaphore/server
            SEMAPHORE_VERSION=${{ github.ref_name }}
            GH_TOKEN=${{ secrets.GH_TOKEN }}
            APP_BUILD_TYPE=pro_selfhosted
          file: deployment/docker/server/powershell/Dockerfile
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/server:${{ github.ref_name }}-powershell7.5.0
            public.ecr.aws/semaphore/server:${{ github.ref_name }}-powershell7.5.0
            semaphoreui/semaphore:${{ github.ref_name }}-powershell7.5.0
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false



      - name: Runner meta
        id: runner
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            public.ecr.aws/semaphore/pro/runner
            public.ecr.aws/semaphore/runner
            semaphoreui/runner
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}

      - name: Runner build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            GH_TOKEN=${{ secrets.GH_TOKEN }}
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: ${{ steps.runner.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Runner build with Ansible 2.16.5
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            ANSIBLE_VERSION=9.4.0
            GH_TOKEN=${{ secrets.GH_TOKEN }}
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/runner:${{ github.ref_name }}-ansible2.16.5
            public.ecr.aws/semaphore/runner:${{ github.ref_name }}-ansible2.16.5
            semaphoreui/runner:${{ github.ref_name }}-ansible2.16.5
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Runner build with PowerShell 7.5.0
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            POWERSHELL_VERSION=7.5.0
            SEMAPHORE_IMAGE=public.ecr.aws/semaphore/runner
            SEMAPHORE_VERSION=${{ github.ref_name }}
            GH_TOKEN=${{ secrets.GH_TOKEN }}
          file: deployment/docker/server/powershell/Dockerfile
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/runner:${{ github.ref_name }}-powershell7.5.0
            public.ecr.aws/semaphore/runner:${{ github.ref_name }}-powershell7.5.0
            semaphoreui/runner:${{ github.ref_name }}-powershell7.5.0
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false


================================================
FILE: .github/workflows/pro_selfhosted_release.yml
================================================
name: Pro Self-Hosted Release

'on':
  push:
    tags:
      - 'v[0-9]+.[0-9]+.[0-9]+'

permissions:
  contents: write

jobs:
  release:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup golang
        uses: actions/setup-go@v5
        with:
          go-version: '^1.24.6'

      - name: Setup nodejs
        uses: actions/setup-node@v4
        with:
          node-version: '24'
          cache: 'npm'
          cache-dependency-path: web/package-lock.json

      - name: Install go-task
        run: |
          go install github.com/go-task/task/v3/cmd/task@latest

      - name: Install rpm
        run: |
          sudo apt update && sudo apt-get install rpm

      - name: Add PRO implementation
        run: |
          git clone https://${{ secrets.GH_TOKEN }}@github.com/semaphoreui/semaphorepro-module.git pro_impl
          go work init . ./pro_impl

      - name: Install deps
        run: |
          task deps APP_BUILD_TYPE=pro_selfhosted

      - name: Import gnupg
        run: |
          echo "${{ secrets.GPG_KEY }}" | tr " " "\n" | base64 -d | gpg --import --batch
          gpg --sign -u "${{ vars.GPG_KEY_ID }}" --pinentry-mode loopback --yes --batch --passphrase "${{ secrets.GPG_PASS }}" --output unlock.sig --detach-sign README.md
          rm -f unlock.sig

      - name: Reset repo
        run: |
          git reset --hard

      - name: Run release
        run: |
          APP_BUILD_TYPE=pro_selfhosted \
          GITHUB_TOKEN=${{ github.token }} \
          GPG_KEY_ID="${{ vars.GPG_KEY_ID }}" \
          PROJECT_NAME=semaphore \
            task release:prod

  deploy-prod:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'semaphoreui'

    steps:
      - name: Checkout source
        uses: actions/checkout@v4

      - name: Setup qemu
        id: qemu
        uses: docker/setup-qemu-action@v3

      - name: Setup buildx
        id: buildx
        uses: docker/setup-buildx-action@v3

      - name: Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          registry: public.ecr.aws
          username: ${{ vars.AWS_ACCESS_KEY_ID }}
          password: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        env:
          AWS_REGION: us-east-1

      - name: Docker Hub login
        uses: docker/login-action@v3
        if: github.event_name != 'pull_request'
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_PASS }}



      - name: Server meta
        id: server
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            public.ecr.aws/semaphore/pro/server
            public.ecr.aws/semaphore/server
            semaphoreui/semaphore
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}
          flavor: |
            latest=true

      - name: Server build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            GH_TOKEN=${{ secrets.GH_TOKEN }}
            APP_BUILD_TYPE=pro_selfhosted
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 # ,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: ${{ steps.server.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Server build with Ansible 2.16.5
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            ANSIBLE_VERSION=9.4.0
            GH_TOKEN=${{ secrets.GH_TOKEN }}
            APP_BUILD_TYPE=pro_selfhosted
          file: deployment/docker/server/Dockerfile
          platforms: linux/amd64,linux/arm64 # ,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/server:${{ github.ref_name }}-ansible2.16.5
            public.ecr.aws/semaphore/server:${{ github.ref_name }}-ansible2.16.5
            semaphoreui/semaphore:${{ github.ref_name }}-ansible2.16.5
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Server build with PowerShell 7.5.0
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            POWERSHELL_VERSION=7.5.0
            SEMAPHORE_IMAGE=public.ecr.aws/semaphore/server
            SEMAPHORE_VERSION=${{ github.ref_name }}
            GH_TOKEN=${{ secrets.GH_TOKEN }}
            APP_BUILD_TYPE=pro_selfhosted
          file: deployment/docker/server/powershell/Dockerfile
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.server.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/server:${{ github.ref_name }}-powershell7.5.0
            public.ecr.aws/semaphore/server:${{ github.ref_name }}-powershell7.5.0
            semaphoreui/semaphore:${{ github.ref_name }}-powershell7.5.0
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false



      - name: Runner meta
        id: runner
        uses: docker/metadata-action@v5
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          images: |
            public.ecr.aws/semaphore/pro/runner
            public.ecr.aws/semaphore/runner
            semaphoreui/runner
          labels: |
            org.opencontainers.image.vendor=SemaphoreUI
            maintainer=Semaphore UI <support@semaphoreui.com>
          tags: |
            type=raw,value=${{ github.ref_name }}
          flavor: |
            latest=true

      - name: Runner build
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            GH_TOKEN=${{ secrets.GH_TOKEN }}
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: ${{ steps.runner.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Runner build with Ansible 2.16.5
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            ANSIBLE_VERSION=9.4.0
            GH_TOKEN=${{ secrets.GH_TOKEN }}
          file: deployment/docker/runner/Dockerfile
          platforms: linux/amd64,linux/arm64 #,linux/arm/v6
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/runner:${{ github.ref_name }}-ansible2.16.5
            public.ecr.aws/semaphore/runner:${{ github.ref_name }}-ansible2.16.5
            semaphoreui/runner:${{ github.ref_name }}-ansible2.16.5
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false

      - name: Runner build with PowerShell 7.5.0
        uses: docker/build-push-action@v5
        with:
          builder: ${{ steps.buildx.outputs.name }}
          context: .
          build-args: |
            POWERSHELL_VERSION=7.5.0
            SEMAPHORE_IMAGE=public.ecr.aws/semaphore/runner
            SEMAPHORE_VERSION=${{ github.ref_name }}
            GH_TOKEN=${{ secrets.GH_TOKEN }}
          file: deployment/docker/server/powershell/Dockerfile
          platforms: linux/amd64
          push: ${{ github.event_name != 'pull_request' }}
          labels: ${{ steps.runner.outputs.labels }}
          tags: |
            public.ecr.aws/semaphore/pro/runner:${{ github.ref_name }}-powershell7.5.0
            public.ecr.aws/semaphore/runner:${{ github.ref_name }}-powershell7.5.0
            semaphoreui/runner:${{ github.ref_name }}-powershell7.5.0
          cache-from: type=gha
          cache-to: type=gha,mode=max
          provenance: false


================================================
FILE: .gitignore
================================================
gin-bin
build/
/test/mcp/*/artifacts/
/certs/
web/public/js/bundle.js
web/public/css/*.*
web/public/html/**/*.*
web/public/fonts/*.*
web/.nyc_output
api/public/**/*
/server.json
/config.json
/config-secondary.json
/config.runner.json
/config.runner.token
/config.runner.key
/runner.json
/runner.token
/runner.key
/.dredd/config.json
/database.boltdb
/database.sqlite
/database.sqlite-journal
/database.boltdb.lock
/database_test.boltdb
.DS_Store
/backup.json
node_modules/

/.idea/
/semaphore.iml
/bin/

/vendor/
/coverage.out
/public/package-lock.json
!.gitkeep

.dredd/compiled_hooks
.dredd/compiled_hooks.exe

__debug_bin*
.task/
/web/.env
/.venv/

/events.log
/tasks.log
/task_results.log
/pro_impl/
/go.work.x
/go.work
/go.work.sum

================================================
FILE: .golangci.yml
================================================
version: "2"

run:
  timeout: "240s"
  # TODO: remove following line to make golangci return non-zero as lint were not passed
  issues-exit-code: 0

linters:
  default: standard
  disable:
    - unused

formatters:
  enable:
    - gofmt
  settings:
    gofmt:
      rewrite-rules:
        - pattern: 'interface{}'
          replacement: 'any'


================================================
FILE: .goreleaser.yml
================================================
version: 2
dist: bin

before:
  hooks:
    - task build:fe

builds:
  - binary: semaphore
    env:
      - CGO_ENABLED=0
    main: ./cli/main.go
    ldflags: -s -w -X github.com/semaphoreui/semaphore/util.Ver={{ .Version }} -X github.com/semaphoreui/semaphore/util.Commit={{ .ShortCommit }} -X github.com/semaphoreui/semaphore/util.Date={{ .Timestamp }}
    tags:
      - netgo
    goos:
      - windows
      - darwin
      - linux
      - freebsd
    goarch:
      - 386
      - amd64
      - arm
      - arm64
      - ppc64le
    ignore:
      - goos: freebsd
        goarch: arm
      - goos: freebsd
        goarch: 386
      - goos: freebsd
        goarch: ppc64le
      - goos: darwin
        goarch: 386
      - goos: darwin
        goarch: arm
      - goos: darwin
        goarch: ppc64le
      - goos: windows
        goarch: ppc64le
      - goos: windows
        goarch: arm

archives:
  - files:
      - LICENSE
    name_template: "{{ .Env.PROJECT_NAME }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
    format_overrides:
      - goos: windows
        format: zip

signs:
  -
    artifacts: checksum
    signature: "{{ .Env.PROJECT_NAME }}_{{ .Version }}_checksums.txt.sig"
    cmd: gpg
    args: [
      "-u", "{{ .Env.GPG_KEY_ID }}",
      "--pinentry-mode", "loopback",
      "--yes",
      "--batch",
      "--output", "${signature}",
      "--detach-sign", "${artifact}"
    ]

checksum:
  name_template: "{{ .Env.PROJECT_NAME }}_{{ .Version }}_checksums.txt"

snapshot:
  name_template: "{{ .Timestamp }}-{{ .ShortCommit }}-SNAPSHOT"

nfpms:
  - file_name_template: "{{ .Env.PROJECT_NAME }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
    package_name: "semaphore"
    description: Modern UI and powerful API for Ansible, Terraform, OpenTofu, PowerShell and other DevOps tools.
    homepage: https://github.com/semaphoreui/semaphore
    vendor: Semaphore UI
    maintainer: Denis Gukov <denis@semaphoreui.com>
    license: MIT

    formats:
      - deb
      - rpm

    dependencies:
      - git

    suggests:
      - ansible

    bindir: /usr/bin

release:
  draft: true
  use_existing_draft: true
  name_template: "{{.Tag}}"


================================================
FILE: .postman/api
================================================
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
apis[] = {"apiId":"4023cf7c-aabb-4d5a-a742-72dadbd4924a"}
apis[] = {"apiId":"5306c424-9fc0-4923-be37-fbda305ca8de"}
apis[] = {"apiId":"9a8524cc-4892-4b54-a6b3-1ef18d907626"}
configVersion = 1.0.0
type = api


================================================
FILE: .postman/api_4023cf7c-aabb-4d5a-a742-72dadbd4924a
================================================
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
configVersion = 1.1.0
type = apiEntityData

[config]
id = 4023cf7c-aabb-4d5a-a742-72dadbd4924a

[config.relations]

[config.relations.collections]
rootDirectory = .postman/collections
files[] = {"id":"2979975-3e2a871a-8dc1-4771-b62a-45f68caa2b1b","path":"Semaphore API Documentation.json","metaData":{"generateCollectionPreferences":"{\"requestNameSource\":\"Fallback\",\"indentCharacter\":\"Space\",\"parametersResolution\":\"Schema\",\"folderStrategy\":\"Paths\",\"includeAuthInfoInExample\":true,\"enableOptionalParameters\":true,\"keepImplicitHeaders\":false,\"includeDeprecated\":true,\"alwaysInheritAuthentication\":false,\"updateCollectionSync\":true,\"requestParametersResolution\":\"Schema\",\"exampleParametersResolution\":\"Schema\"}"}}

[config.relations.collections.metaData]

[config.relations.apiDefinition]
files[] = {"path":"openapi.yml","metaData":{}}

[config.relations.apiDefinition.metaData]
type = openapi:3
rootFiles[] = openapi.yml


================================================
FILE: .postman/api_5306c424-9fc0-4923-be37-fbda305ca8de
================================================
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
configVersion = 1.1.0
type = apiEntityData

[config]
id = 5306c424-9fc0-4923-be37-fbda305ca8de

[config.relations]

[config.relations.collections]
rootDirectory = postman/collections

[config.relations.collections.metaData]

[config.relations.apiDefinition]
files[] = {"path":"openapi.yml","metaData":{}}

[config.relations.apiDefinition.metaData]
type = openapi:3
rootFiles[] = openapi.yml


================================================
FILE: .postman/api_9a8524cc-4892-4b54-a6b3-1ef18d907626
================================================
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY
configVersion = 1.1.0
type = apiEntityData

[config]
id = 9a8524cc-4892-4b54-a6b3-1ef18d907626

[config.relations]

[config.relations.collections]
rootDirectory = postman/collections
files[] = {"id":"2979975-3d96a8d7-604d-47ec-832c-2876f64dbc1f","path":"Semaphore API.json","metaData":{}}

[config.relations.collections.metaData]

[config.relations.apiDefinition]
files[] = {"path":"openapi.yml","metaData":{}}

[config.relations.apiDefinition.metaData]
type = openapi:3
rootFiles[] = openapi.yml


================================================
FILE: .postman/postman/collections/Semaphore API.json
================================================
{
	"info": {
		"_postman_id": "3d96a8d7-604d-47ec-832c-2876f64dbc1f",
		"name": "Semaphore API",
		"description": "Semaphore API provides endpoints for managing and interacting with the Semaphore UI.\nThis documentation outlines the available operations and data models.\n",
		"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json",
		"_uid": "2979975-3d96a8d7-604d-47ec-832c-2876f64dbc1f"
	},
	"item": [
		{
			"name": "ping",
			"item": [
				{
					"name": "PING test",
					"id": "bf5268d0-7ded-46a5-81c6-e1ab34af548f",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Accept",
								"value": "text/plain"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/ping",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"ping"
							]
						}
					},
					"response": [
						{
							"id": "3bb6eb99-c489-4c1d-8c58-24943b3944fa",
							"name": "Successful \"PONG\" reply",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "text/plain"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/ping",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"ping"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "text",
							"header": [
								{
									"key": "Content-Type",
									"value": "text/plain"
								},
								{
									"disabled": false,
									"description": {
										"content": "",
										"type": "text/plain"
									},
									"key": "content-type",
									"value": "<string>"
								}
							],
							"cookie": [],
							"body": "<string>"
						}
					]
				}
			],
			"id": "42b892bf-1031-4529-aaad-fc9cb0f0b39b"
		},
		{
			"name": "ws",
			"item": [
				{
					"name": "Websocket handler",
					"id": "0c5fb481-c1ae-4749-922b-9c204542ebe5",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [],
						"url": {
							"raw": "{{baseUrl}}/ws",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"ws"
							]
						}
					},
					"response": [
						{
							"id": "806acad8-300d-49d7-b90d-efa215abf78b",
							"name": "OK",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/ws",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"ws"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "text",
							"header": [],
							"cookie": []
						},
						{
							"id": "3ddd1e5f-77ca-4004-a6df-6fba17dd91e3",
							"name": "not authenticated",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/ws",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"ws"
									]
								}
							},
							"status": "Unauthorized",
							"code": 401,
							"_postman_previewlanguage": "text",
							"header": [],
							"cookie": []
						}
					]
				}
			],
			"id": "c4ce3efb-64a9-419e-ae7b-710d8daa6559"
		},
		{
			"name": "info",
			"item": [
				{
					"name": "Fetches information about semaphore",
					"id": "b24f5bef-31a9-4b6b-a88b-7335708054b4",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/info",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"info"
							]
						},
						"description": "you must be authenticated to use this"
					},
					"response": [
						{
							"id": "528e9198-1331-47b6-8683-26a4dee42897",
							"name": "ok",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/info",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"info"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n  \"version\": \"<string>\",\n  \"updateBody\": \"<string>\",\n  \"update\": {\n    \"tag_name\": \"<string>\"\n  }\n}"
						}
					]
				}
			],
			"id": "f3b4c4c0-0266-46de-bfd9-ec0ca92cb8ed"
		},
		{
			"name": "auth",
			"item": [
				{
					"name": "login",
					"item": [
						{
							"name": "Fetches login metadata",
							"id": "e54ef912-9074-4d4b-ac87-4a139deaae7e",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/auth/login",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"auth",
										"login"
									]
								},
								"description": "Fetches metadata for login, such as available OIDC providers"
							},
							"response": [
								{
									"id": "88c4efe4-14a7-4995-9f4e-5d799df9691c",
									"name": "Login metadata",
									"originalRequest": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/auth/login",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"auth",
												"login"
											]
										}
									},
									"status": "OK",
									"code": 200,
									"_postman_previewlanguage": "json",
									"header": [
										{
											"key": "Content-Type",
											"value": "application/json"
										}
									],
									"cookie": [],
									"body": "{\n  \"oidc_providers\": [\n    {\n      \"id\": \"<string>\",\n      \"name\": \"<string>\"\n    },\n    {\n      \"id\": \"<string>\",\n      \"name\": \"<string>\"\n    }\n  ]\n}"
								}
							]
						},
						{
							"name": "Performs Login",
							"id": "8e4e1cca-d595-4648-9926-cc59aa0d01c0",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"auth\": \"<string>\",\n  \"password\": \"<string>\"\n}",
									"options": {
										"raw": {
											"headerFamily": "json",
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "{{baseUrl}}/auth/login",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"auth",
										"login"
									]
								},
								"description": "Upon success you will be logged in"
							},
							"response": [
								{
									"id": "d46ea9c6-566d-4797-8257-481ea3ac387d",
									"name": "You are logged in",
									"originalRequest": {
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\n  \"auth\": \"<string>\",\n  \"password\": \"<string>\"\n}",
											"options": {
												"raw": {
													"headerFamily": "json",
													"language": "json"
												}
											}
										},
										"url": {
											"raw": "{{baseUrl}}/auth/login",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"auth",
												"login"
											]
										}
									},
									"status": "No Content",
									"code": 204,
									"_postman_previewlanguage": "text",
									"header": [],
									"cookie": []
								},
								{
									"id": "d924516a-a87b-4e37-b0ee-37b861d55e44",
									"name": "something in body is missing / is invalid",
									"originalRequest": {
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\n  \"auth\": \"<string>\",\n  \"password\": \"<string>\"\n}",
											"options": {
												"raw": {
													"headerFamily": "json",
													"language": "json"
												}
											}
										},
										"url": {
											"raw": "{{baseUrl}}/auth/login",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"auth",
												"login"
											]
										}
									},
									"status": "Bad Request",
									"code": 400,
									"_postman_previewlanguage": "text",
									"header": [],
									"cookie": []
								}
							]
						}
					],
					"id": "aed9631c-e197-4069-85fd-d104db4a2935"
				},
				{
					"name": "logout",
					"item": [
						{
							"name": "Destroys current session",
							"id": "40410efc-af5e-427e-a028-f97718cb6836",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "POST",
								"header": [],
								"url": {
									"raw": "{{baseUrl}}/auth/logout",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"auth",
										"logout"
									]
								}
							},
							"response": [
								{
									"id": "67a542a6-eeab-4de1-8c4d-f4c97f061b40",
									"name": "Your session was successfully nuked",
									"originalRequest": {
										"method": "POST",
										"header": [
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/auth/logout",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"auth",
												"logout"
											]
										}
									},
									"status": "No Content",
									"code": 204,
									"_postman_previewlanguage": "text",
									"header": [],
									"cookie": []
								}
							]
						}
					],
					"id": "56f5320b-b581-4f77-bc09-c6ff2b6650fe"
				},
				{
					"name": "oidc",
					"item": [
						{
							"name": "{provider_id}",
							"item": [
								{
									"name": "login",
									"item": [
										{
											"name": "Begin OIDC authentication flow and redirect to OIDC provider",
											"id": "e89b42ec-0f75-424d-983f-ec083a25629e",
											"protocolProfileBehavior": {
												"disableBodyPruning": true
											},
											"request": {
												"method": "GET",
												"header": [],
												"url": {
													"raw": "{{baseUrl}}/auth/oidc/:provider_id/login",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"auth",
														"oidc",
														":provider_id",
														"login"
													],
													"variable": [
														{
															"key": "provider_id",
															"value": "<string>",
															"description": "(Required) "
														}
													]
												},
												"description": "The user agent is redirected to this endpoint when chosing to sign in via OIDC"
											},
											"response": [
												{
													"id": "dc9ff176-1520-4d23-870e-6de15f0f0bfb",
													"name": "Redirection to the OIDC provider on success, or to the login page on error",
													"originalRequest": {
														"method": "GET",
														"header": [
															{
																"description": "Added as a part of security scheme: apikey",
																"key": "Authorization",
																"value": "<API Key>"
															}
														],
														"url": {
															"raw": "{{baseUrl}}/auth/oidc/:provider_id/login",
															"host": [
																"{{baseUrl}}"
															],
															"path": [
																"auth",
																"oidc",
																":provider_id",
																"login"
															],
															"variable": [
																{
																	"key": "provider_id"
																}
															]
														}
													},
													"status": "Found",
													"code": 302,
													"_postman_previewlanguage": "text",
													"header": [],
													"cookie": []
												}
											]
										}
									],
									"id": "02b6aaf2-f76d-4f7e-9eef-7c1969106934"
								},
								{
									"name": "redirect",
									"item": [
										{
											"name": "Finish OIDC authentication flow, upon succes you will be logged in",
											"id": "a3f83744-c4b2-444d-b67d-0b9e1719b579",
											"protocolProfileBehavior": {
												"disableBodyPruning": true
											},
											"request": {
												"method": "GET",
												"header": [],
												"url": {
													"raw": "{{baseUrl}}/auth/oidc/:provider_id/redirect",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"auth",
														"oidc",
														":provider_id",
														"redirect"
													],
													"variable": [
														{
															"key": "provider_id",
															"value": "<string>",
															"description": "(Required) "
														}
													]
												},
												"description": "The user agent is redirected here by the OIDC provider to complete authentication"
											},
											"response": [
												{
													"id": "c961634e-53b3-464d-8700-1f7a50bd8930",
													"name": "Redirection to the Semaphore root URL on success, or to the login page on error",
													"originalRequest": {
														"method": "GET",
														"header": [
															{
																"description": "Added as a part of security scheme: apikey",
																"key": "Authorization",
																"value": "<API Key>"
															}
														],
														"url": {
															"raw": "{{baseUrl}}/auth/oidc/:provider_id/redirect",
															"host": [
																"{{baseUrl}}"
															],
															"path": [
																"auth",
																"oidc",
																":provider_id",
																"redirect"
															],
															"variable": [
																{
																	"key": "provider_id"
																}
															]
														}
													},
													"status": "Found",
													"code": 302,
													"_postman_previewlanguage": "text",
													"header": [],
													"cookie": []
												}
											]
										}
									],
									"id": "09c8fe31-4e03-4951-9cfc-b35eb5788fdc"
								}
							],
							"id": "4eb69a41-dc94-4d9a-ac10-b4052fefa5e0"
						}
					],
					"id": "4097fae7-9877-4776-a607-4a91236eb004"
				}
			],
			"id": "1c92c5b1-ef55-4bf0-8b0e-942fd4dbd4d6"
		},
		{
			"name": "user",
			"item": [
				{
					"name": "tokens",
					"item": [
						{
							"name": "{api_token_id}",
							"item": [
								{
									"name": "Expires API token",
									"id": "b73a8391-ac14-4de1-96e4-46211d2695a3",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "DELETE",
										"header": [],
										"url": {
											"raw": "{{baseUrl}}/user/tokens/:api_token_id",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"user",
												"tokens",
												":api_token_id"
											],
											"variable": [
												{
													"key": "api_token_id",
													"value": "<string>",
													"description": "(Required) "
												}
											]
										}
									},
									"response": [
										{
											"id": "b065338e-0893-4b2e-a114-0fbebe9df480",
											"name": "Expired API Token",
											"originalRequest": {
												"method": "DELETE",
												"header": [
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"url": {
													"raw": "{{baseUrl}}/user/tokens/:api_token_id",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"user",
														"tokens",
														":api_token_id"
													],
													"variable": [
														{
															"key": "api_token_id"
														}
													]
												}
											},
											"status": "No Content",
											"code": 204,
											"_postman_previewlanguage": "text",
											"header": [],
											"cookie": []
										}
									]
								}
							],
							"id": "16a03dcb-86f4-4b13-9b0b-2ee6e40f277f"
						},
						{
							"name": "Fetch API tokens for user",
							"id": "72430204-c78a-404d-a8b5-cf9b9535e8ec",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/user/tokens",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"user",
										"tokens"
									]
								}
							},
							"response": [
								{
									"id": "a29abb44-c40e-4170-8715-7355facafe4f",
									"name": "API Tokens",
									"originalRequest": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/user/tokens",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"user",
												"tokens"
											]
										}
									},
									"status": "OK",
									"code": 200,
									"_postman_previewlanguage": "json",
									"header": [
										{
											"key": "Content-Type",
											"value": "application/json"
										}
									],
									"cookie": [],
									"body": "[\n  {\n    \"id\": \"<string>\",\n    \"created\": \"<string>\",\n    \"expired\": \"<boolean>\",\n    \"user_id\": \"<integer>\"\n  },\n  {\n    \"id\": \"<string>\",\n    \"created\": \"<string>\",\n    \"expired\": \"<boolean>\",\n    \"user_id\": \"<integer>\"\n  }\n]"
								}
							]
						},
						{
							"name": "Create an API token",
							"id": "cfba220e-2ace-4bcd-8e8d-790ecc4c161b",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "POST",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/user/tokens",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"user",
										"tokens"
									]
								}
							},
							"response": [
								{
									"id": "ab320df0-a87c-4d98-8c66-b746965d8703",
									"name": "API Token",
									"originalRequest": {
										"method": "POST",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/user/tokens",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"user",
												"tokens"
											]
										}
									},
									"status": "Created",
									"code": 201,
									"_postman_previewlanguage": "json",
									"header": [
										{
											"key": "Content-Type",
											"value": "application/json"
										}
									],
									"cookie": [],
									"body": "{\n  \"id\": \"<string>\",\n  \"created\": \"<string>\",\n  \"expired\": \"<boolean>\",\n  \"user_id\": \"<integer>\"\n}"
								}
							]
						}
					],
					"id": "1dbfa3fd-5095-40b3-b767-9905075c41cc"
				},
				{
					"name": "Fetch logged in user",
					"id": "fef2dcea-c231-4700-86e3-352a7509428f",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/user/",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"user",
								""
							]
						}
					},
					"response": [
						{
							"id": "8ac63913-9e63-4e07-9ce1-14e07dc34d20",
							"name": "User",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/user/",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"user",
										""
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"created\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\",\n  \"external\": \"<boolean>\"\n}"
						}
					]
				}
			],
			"id": "320427cd-4a4a-4466-a69a-32854273b1b2"
		},
		{
			"name": "users",
			"item": [
				{
					"name": "{user_id}",
					"item": [
						{
							"name": "password",
							"item": [
								{
									"name": "Updates user password",
									"id": "049ff59a-80e1-4b3d-b5c8-c153f0876b94",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\n  \"password\": \"<string>\"\n}",
											"options": {
												"raw": {
													"headerFamily": "json",
													"language": "json"
												}
											}
										},
										"url": {
											"raw": "{{baseUrl}}/users/:user_id/password",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"users",
												":user_id",
												"password"
											],
											"variable": [
												{
													"key": "user_id",
													"value": "<integer>",
													"description": "(Required) User ID"
												}
											]
										}
									},
									"response": [
										{
											"id": "86c57d98-9b33-442d-be6e-700f3374685d",
											"name": "Password updated",
											"originalRequest": {
												"method": "POST",
												"header": [
													{
														"key": "Content-Type",
														"value": "application/json"
													},
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"body": {
													"mode": "raw",
													"raw": "{\n  \"password\": \"<string>\"\n}",
													"options": {
														"raw": {
															"headerFamily": "json",
															"language": "json"
														}
													}
												},
												"url": {
													"raw": "{{baseUrl}}/users/:user_id/password",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"users",
														":user_id",
														"password"
													],
													"variable": [
														{
															"key": "user_id"
														}
													]
												}
											},
											"status": "No Content",
											"code": 204,
											"_postman_previewlanguage": "text",
											"header": [],
											"cookie": []
										}
									]
								}
							],
							"id": "ff5732a1-5d72-4dcf-8d13-cb1a0352d82b"
						},
						{
							"name": "Fetches a user profile",
							"id": "0ea82762-7ab3-4be4-a7bc-07c12c6443cd",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/users/:user_id/",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"users",
										":user_id",
										""
									],
									"variable": [
										{
											"key": "user_id",
											"value": "<integer>",
											"description": "(Required) User ID"
										}
									]
								}
							},
							"response": [
								{
									"id": "5a9e436e-a27e-490c-aa04-2931ec671450",
									"name": "User profile",
									"originalRequest": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/users/:user_id/",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"users",
												":user_id",
												""
											],
											"variable": [
												{
													"key": "user_id"
												}
											]
										}
									},
									"status": "OK",
									"code": 200,
									"_postman_previewlanguage": "json",
									"header": [
										{
											"key": "Content-Type",
											"value": "application/json"
										}
									],
									"cookie": [],
									"body": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"created\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\",\n  \"external\": \"<boolean>\"\n}"
								}
							]
						},
						{
							"name": "Updates user details",
							"id": "f16b9520-e006-4f1c-a1d6-e1c112a6c737",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "PUT",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\"\n}",
									"options": {
										"raw": {
											"headerFamily": "json",
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "{{baseUrl}}/users/:user_id/",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"users",
										":user_id",
										""
									],
									"variable": [
										{
											"key": "user_id",
											"value": "<integer>",
											"description": "(Required) User ID"
										}
									]
								}
							},
							"response": [
								{
									"id": "8ecb3f54-ba8a-454a-af8a-bd45b3487d81",
									"name": "User Updated",
									"originalRequest": {
										"method": "PUT",
										"header": [
											{
												"key": "Content-Type",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\"\n}",
											"options": {
												"raw": {
													"headerFamily": "json",
													"language": "json"
												}
											}
										},
										"url": {
											"raw": "{{baseUrl}}/users/:user_id/",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"users",
												":user_id",
												""
											],
											"variable": [
												{
													"key": "user_id"
												}
											]
										}
									},
									"status": "No Content",
									"code": 204,
									"_postman_previewlanguage": "text",
									"header": [],
									"cookie": []
								}
							]
						},
						{
							"name": "Deletes user",
							"id": "ab4724a5-0e60-4c1a-a097-cb43677e968f",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "DELETE",
								"header": [],
								"url": {
									"raw": "{{baseUrl}}/users/:user_id/",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"users",
										":user_id",
										""
									],
									"variable": [
										{
											"key": "user_id",
											"value": "<integer>",
											"description": "(Required) User ID"
										}
									]
								}
							},
							"response": [
								{
									"id": "f7a4e7b7-740f-425c-b9bb-238c1e77a2b2",
									"name": "User deleted",
									"originalRequest": {
										"method": "DELETE",
										"header": [
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/users/:user_id/",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"users",
												":user_id",
												""
											],
											"variable": [
												{
													"key": "user_id"
												}
											]
										}
									},
									"status": "No Content",
									"code": 204,
									"_postman_previewlanguage": "text",
									"header": [],
									"cookie": []
								}
							]
						}
					],
					"id": "a1b50f3a-4823-4aec-a930-4dc2eb3e0d5d"
				},
				{
					"name": "Fetches all users",
					"id": "507c369c-033e-4267-8bf2-ae66c9ac3599",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/users",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users"
							]
						}
					},
					"response": [
						{
							"id": "99e6869a-f9a1-4255-9000-bddace414eed",
							"name": "Users",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/users",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"users"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "[\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"username\": \"<string>\",\n    \"email\": \"<string>\",\n    \"created\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"admin\": \"<boolean>\",\n    \"external\": \"<boolean>\"\n  },\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"username\": \"<string>\",\n    \"email\": \"<string>\",\n    \"created\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"admin\": \"<boolean>\",\n    \"external\": \"<boolean>\"\n  }\n]"
						}
					]
				},
				{
					"name": "Creates a user",
					"id": "1f9aeee5-29d9-45a5-a8c2-85cc1837a96a",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"password\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\",\n  \"external\": \"<boolean>\"\n}",
							"options": {
								"raw": {
									"headerFamily": "json",
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/users",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"users"
							]
						}
					},
					"response": [
						{
							"id": "5056ee51-12cb-45ac-97ec-2007d3ea55c1",
							"name": "User created",
							"originalRequest": {
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"password\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\",\n  \"external\": \"<boolean>\"\n}",
									"options": {
										"raw": {
											"headerFamily": "json",
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "{{baseUrl}}/users",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"users"
									]
								}
							},
							"status": "Created",
							"code": 201,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"created\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\",\n  \"external\": \"<boolean>\"\n}"
						},
						{
							"id": "07889849-9235-4c9b-b0a1-8f208cfe0f68",
							"name": "User creation failed",
							"originalRequest": {
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"name\": \"<string>\",\n  \"username\": \"<string>\",\n  \"email\": \"<string>\",\n  \"password\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"admin\": \"<boolean>\",\n  \"external\": \"<boolean>\"\n}",
									"options": {
										"raw": {
											"headerFamily": "json",
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "{{baseUrl}}/users",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"users"
									]
								}
							},
							"status": "Bad Request",
							"code": 400,
							"_postman_previewlanguage": "text",
							"header": [],
							"cookie": []
						}
					]
				}
			],
			"id": "daedae70-868f-4c67-b451-92b64d11f389"
		},
		{
			"name": "projects",
			"item": [
				{
					"name": "restore",
					"item": [
						{
							"name": "Restore Project",
							"id": "ad7d9848-0a4c-4429-8f00-a9c41d0b8b65",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"meta\": {\n    \"name\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"max_parallel_tasks\": \"<integer>\"\n  },\n  \"templates\": [\n    {\n      \"inventory\": \"<string>\",\n      \"repository\": \"<string>\",\n      \"environment\": \"<string>\",\n      \"view\": \"<string>\",\n      \"name\": \"<string>\",\n      \"playbook\": \"<string>\",\n      \"description\": \"<string>\",\n      \"allow_override_args_in_task\": \"<boolean>\",\n      \"suppress_success_alerts\": \"<boolean>\",\n      \"autorun\": \"<boolean>\",\n      \"type\": \"<string>\",\n      \"allow_override_branch_in_task\": \"<boolean>\"\n    },\n    {\n      \"inventory\": \"<string>\",\n      \"repository\": \"<string>\",\n      \"environment\": \"<string>\",\n      \"view\": \"<string>\",\n      \"name\": \"<string>\",\n      \"playbook\": \"<string>\",\n      \"description\": \"<string>\",\n      \"allow_override_args_in_task\": \"<boolean>\",\n      \"suppress_success_alerts\": \"<boolean>\",\n      \"autorun\": \"<boolean>\",\n      \"type\": \"<string>\",\n      \"allow_override_branch_in_task\": \"<boolean>\"\n    }\n  ],\n  \"repositories\": [\n    {\n      \"name\": \"<string>\",\n      \"git_url\": \"<string>\",\n      \"git_branch\": \"<string>\",\n      \"ssh_key\": \"<string>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"git_url\": \"<string>\",\n      \"git_branch\": \"<string>\",\n      \"ssh_key\": \"<string>\"\n    }\n  ],\n  \"keys\": [\n    {\n      \"name\": \"<string>\",\n      \"type\": \"login_password\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"type\": \"ssh\"\n    }\n  ],\n  \"views\": [\n    {\n      \"name\": \"<string>\",\n      \"position\": \"<integer>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"position\": \"<integer>\"\n    }\n  ],\n  \"inventories\": [\n    {\n      \"name\": \"<string>\",\n      \"inventory\": \"<string>\",\n      \"type\": \"static-yaml\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"inventory\": \"<string>\",\n      \"type\": \"static\"\n    }\n  ],\n  \"environments\": [\n    {\n      \"name\": \"<string>\",\n      \"json\": \"<string>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"json\": \"<string>\"\n    }\n  ]\n}",
									"options": {
										"raw": {
											"headerFamily": "json",
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "{{baseUrl}}/projects/restore",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"projects",
										"restore"
									]
								}
							},
							"response": [
								{
									"id": "8120a0a7-787f-47f5-b595-dd8dab10efd4",
									"name": "Created project",
									"originalRequest": {
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"value": "application/json"
											},
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\n  \"meta\": {\n    \"name\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"max_parallel_tasks\": \"<integer>\"\n  },\n  \"templates\": [\n    {\n      \"inventory\": \"<string>\",\n      \"repository\": \"<string>\",\n      \"environment\": \"<string>\",\n      \"view\": \"<string>\",\n      \"name\": \"<string>\",\n      \"playbook\": \"<string>\",\n      \"description\": \"<string>\",\n      \"allow_override_args_in_task\": \"<boolean>\",\n      \"suppress_success_alerts\": \"<boolean>\",\n      \"autorun\": \"<boolean>\",\n      \"type\": \"<string>\",\n      \"allow_override_branch_in_task\": \"<boolean>\"\n    },\n    {\n      \"inventory\": \"<string>\",\n      \"repository\": \"<string>\",\n      \"environment\": \"<string>\",\n      \"view\": \"<string>\",\n      \"name\": \"<string>\",\n      \"playbook\": \"<string>\",\n      \"description\": \"<string>\",\n      \"allow_override_args_in_task\": \"<boolean>\",\n      \"suppress_success_alerts\": \"<boolean>\",\n      \"autorun\": \"<boolean>\",\n      \"type\": \"<string>\",\n      \"allow_override_branch_in_task\": \"<boolean>\"\n    }\n  ],\n  \"repositories\": [\n    {\n      \"name\": \"<string>\",\n      \"git_url\": \"<string>\",\n      \"git_branch\": \"<string>\",\n      \"ssh_key\": \"<string>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"git_url\": \"<string>\",\n      \"git_branch\": \"<string>\",\n      \"ssh_key\": \"<string>\"\n    }\n  ],\n  \"keys\": [\n    {\n      \"name\": \"<string>\",\n      \"type\": \"login_password\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"type\": \"ssh\"\n    }\n  ],\n  \"views\": [\n    {\n      \"name\": \"<string>\",\n      \"position\": \"<integer>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"position\": \"<integer>\"\n    }\n  ],\n  \"inventories\": [\n    {\n      \"name\": \"<string>\",\n      \"inventory\": \"<string>\",\n      \"type\": \"static-yaml\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"inventory\": \"<string>\",\n      \"type\": \"static\"\n    }\n  ],\n  \"environments\": [\n    {\n      \"name\": \"<string>\",\n      \"json\": \"<string>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"json\": \"<string>\"\n    }\n  ]\n}",
											"options": {
												"raw": {
													"headerFamily": "json",
													"language": "json"
												}
											}
										},
										"url": {
											"raw": "{{baseUrl}}/projects/restore",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"projects",
												"restore"
											]
										}
									},
									"status": "OK",
									"code": 200,
									"_postman_previewlanguage": "json",
									"header": [
										{
											"key": "Content-Type",
											"value": "application/json"
										}
									],
									"cookie": [],
									"body": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"created\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"max_parallel_tasks\": \"<integer>\"\n}"
								}
							]
						}
					],
					"id": "75f5f172-970b-46f9-9749-ea60fe0de02f"
				},
				{
					"name": "Get projects",
					"id": "db08f6e5-34e8-4cce-b433-a8e001649532",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/projects",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"projects"
							]
						}
					},
					"response": [
						{
							"id": "4465385b-232d-49e1-b0ba-f076805edba2",
							"name": "List of projects",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/projects",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"projects"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "[\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"created\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"max_parallel_tasks\": \"<integer>\"\n  },\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"created\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"max_parallel_tasks\": \"<integer>\"\n  }\n]"
						}
					]
				},
				{
					"name": "Create a new project",
					"id": "d836bcbc-10a2-48fd-a189-f7e2d546f7a0",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "POST",
						"header": [
							{
								"key": "Content-Type",
								"value": "application/json"
							},
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"body": {
							"mode": "raw",
							"raw": "{\n  \"name\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"max_parallel_tasks\": \"<integer>\",\n  \"demo\": \"<boolean>\"\n}",
							"options": {
								"raw": {
									"headerFamily": "json",
									"language": "json"
								}
							}
						},
						"url": {
							"raw": "{{baseUrl}}/projects",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"projects"
							]
						}
					},
					"response": [
						{
							"id": "85c1a2ae-bfcb-410e-9ef1-10f33ce9a4a3",
							"name": "Created project",
							"originalRequest": {
								"method": "POST",
								"header": [
									{
										"key": "Content-Type",
										"value": "application/json"
									},
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"body": {
									"mode": "raw",
									"raw": "{\n  \"name\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"max_parallel_tasks\": \"<integer>\",\n  \"demo\": \"<boolean>\"\n}",
									"options": {
										"raw": {
											"headerFamily": "json",
											"language": "json"
										}
									}
								},
								"url": {
									"raw": "{{baseUrl}}/projects",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"projects"
									]
								}
							},
							"status": "Created",
							"code": 201,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"created\": \"<string>\",\n  \"alert\": \"<boolean>\",\n  \"max_parallel_tasks\": \"<integer>\"\n}"
						}
					]
				}
			],
			"id": "1ca11787-296e-4f18-8098-b3863a3697ae"
		},
		{
			"name": "events",
			"item": [
				{
					"name": "last",
					"item": [
						{
							"name": "Get last 200 Events related to Semaphore and projects you are part of",
							"id": "716eed97-b5c6-436b-9815-13ee33dfb791",
							"protocolProfileBehavior": {
								"disableBodyPruning": true
							},
							"request": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/events/last",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"events",
										"last"
									]
								}
							},
							"response": [
								{
									"id": "194afa5f-39ef-4da7-8f57-f3646379e74c",
									"name": "Array of events in chronological order",
									"originalRequest": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											},
											{
												"description": "Added as a part of security scheme: apikey",
												"key": "Authorization",
												"value": "<API Key>"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/events/last",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"events",
												"last"
											]
										}
									},
									"status": "OK",
									"code": 200,
									"_postman_previewlanguage": "json",
									"header": [
										{
											"key": "Content-Type",
											"value": "application/json"
										}
									],
									"cookie": [],
									"body": "[\n  {\n    \"project_id\": \"<integer>\",\n    \"user_id\": \"<integer>\",\n    \"description\": \"<string>\"\n  },\n  {\n    \"project_id\": \"<integer>\",\n    \"user_id\": \"<integer>\",\n    \"description\": \"<string>\"\n  }\n]"
								}
							]
						}
					],
					"id": "9aa87430-581f-4df2-b5b0-0e907eb51d8c"
				},
				{
					"name": "Get Events related to Semaphore and projects you are part of",
					"id": "8892a736-a9e9-4e04-9fbf-7318e18bcb69",
					"protocolProfileBehavior": {
						"disableBodyPruning": true
					},
					"request": {
						"method": "GET",
						"header": [
							{
								"key": "Accept",
								"value": "application/json"
							}
						],
						"url": {
							"raw": "{{baseUrl}}/events",
							"host": [
								"{{baseUrl}}"
							],
							"path": [
								"events"
							]
						}
					},
					"response": [
						{
							"id": "0df3b266-9969-4b81-9c49-5365b5718f7c",
							"name": "Array of events in chronological order",
							"originalRequest": {
								"method": "GET",
								"header": [
									{
										"key": "Accept",
										"value": "application/json"
									},
									{
										"description": "Added as a part of security scheme: apikey",
										"key": "Authorization",
										"value": "<API Key>"
									}
								],
								"url": {
									"raw": "{{baseUrl}}/events",
									"host": [
										"{{baseUrl}}"
									],
									"path": [
										"events"
									]
								}
							},
							"status": "OK",
							"code": 200,
							"_postman_previewlanguage": "json",
							"header": [
								{
									"key": "Content-Type",
									"value": "application/json"
								}
							],
							"cookie": [],
							"body": "[\n  {\n    \"project_id\": \"<integer>\",\n    \"user_id\": \"<integer>\",\n    \"description\": \"<string>\"\n  },\n  {\n    \"project_id\": \"<integer>\",\n    \"user_id\": \"<integer>\",\n    \"description\": \"<string>\"\n  }\n]"
						}
					]
				}
			],
			"id": "633c1663-c41d-4cbe-813e-c86e157d7b1f"
		},
		{
			"name": "project",
			"item": [
				{
					"name": "{project_id}",
					"item": [
						{
							"name": "backup",
							"item": [
								{
									"name": "Backup A Project",
									"id": "cf6cb225-f9c2-4834-9966-fba7247c941c",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/project/:project_id/backup",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"project",
												":project_id",
												"backup"
											],
											"variable": [
												{
													"key": "project_id",
													"value": "<integer>",
													"description": "(Required) Project ID"
												}
											]
										}
									},
									"response": [
										{
											"id": "9ed64511-9b95-4241-b139-521f01d7a9fe",
											"name": "Backup",
											"originalRequest": {
												"method": "GET",
												"header": [
													{
														"key": "Accept",
														"value": "application/json"
													},
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/backup",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"backup"
													],
													"variable": [
														{
															"key": "project_id"
														}
													]
												}
											},
											"status": "OK",
											"code": 200,
											"_postman_previewlanguage": "json",
											"header": [
												{
													"key": "Content-Type",
													"value": "application/json"
												}
											],
											"cookie": [],
											"body": "{\n  \"meta\": {\n    \"name\": \"<string>\",\n    \"alert\": \"<boolean>\",\n    \"max_parallel_tasks\": \"<integer>\"\n  },\n  \"templates\": [\n    {\n      \"inventory\": \"<string>\",\n      \"repository\": \"<string>\",\n      \"environment\": \"<string>\",\n      \"view\": \"<string>\",\n      \"name\": \"<string>\",\n      \"playbook\": \"<string>\",\n      \"description\": \"<string>\",\n      \"allow_override_args_in_task\": \"<boolean>\",\n      \"suppress_success_alerts\": \"<boolean>\",\n      \"autorun\": \"<boolean>\",\n      \"type\": \"<string>\",\n      \"allow_override_branch_in_task\": \"<boolean>\"\n    },\n    {\n      \"inventory\": \"<string>\",\n      \"repository\": \"<string>\",\n      \"environment\": \"<string>\",\n      \"view\": \"<string>\",\n      \"name\": \"<string>\",\n      \"playbook\": \"<string>\",\n      \"description\": \"<string>\",\n      \"allow_override_args_in_task\": \"<boolean>\",\n      \"suppress_success_alerts\": \"<boolean>\",\n      \"autorun\": \"<boolean>\",\n      \"type\": \"<string>\",\n      \"allow_override_branch_in_task\": \"<boolean>\"\n    }\n  ],\n  \"repositories\": [\n    {\n      \"name\": \"<string>\",\n      \"git_url\": \"<string>\",\n      \"git_branch\": \"<string>\",\n      \"ssh_key\": \"<string>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"git_url\": \"<string>\",\n      \"git_branch\": \"<string>\",\n      \"ssh_key\": \"<string>\"\n    }\n  ],\n  \"keys\": [\n    {\n      \"name\": \"<string>\",\n      \"type\": \"login_password\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"type\": \"ssh\"\n    }\n  ],\n  \"views\": [\n    {\n      \"name\": \"<string>\",\n      \"position\": \"<integer>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"position\": \"<integer>\"\n    }\n  ],\n  \"inventories\": [\n    {\n      \"name\": \"<string>\",\n      \"inventory\": \"<string>\",\n      \"type\": \"static-yaml\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"inventory\": \"<string>\",\n      \"type\": \"static\"\n    }\n  ],\n  \"environments\": [\n    {\n      \"name\": \"<string>\",\n      \"json\": \"<string>\"\n    },\n    {\n      \"name\": \"<string>\",\n      \"json\": \"<string>\"\n    }\n  ]\n}"
										}
									]
								}
							],
							"id": "5d358a00-f511-471c-abfe-4fa03d4aae12"
						},
						{
							"name": "role",
							"item": [
								{
									"name": "Fetch permissions of the current user for project",
									"id": "acf0720e-0c03-4c38-b272-c9465782f650",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/project/:project_id/role",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"project",
												":project_id",
												"role"
											],
											"variable": [
												{
													"key": "project_id",
													"value": "<integer>",
													"description": "(Required) Project ID"
												}
											]
										}
									},
									"response": [
										{
											"id": "6ebbb1a2-26f5-49bd-95c1-eb91f9ce555c",
											"name": "Permissions",
											"originalRequest": {
												"method": "GET",
												"header": [
													{
														"key": "Accept",
														"value": "application/json"
													},
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/role",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"role"
													],
													"variable": [
														{
															"key": "project_id"
														}
													]
												}
											},
											"status": "OK",
											"code": 200,
											"_postman_previewlanguage": "json",
											"header": [
												{
													"key": "Content-Type",
													"value": "application/json"
												}
											],
											"cookie": [],
											"body": "{\n  \"role\": \"<string>\",\n  \"permissions\": \"<number>\"\n}"
										}
									]
								}
							],
							"id": "f38f0344-5967-413a-afc9-3b23f8f29ff9"
						},
						{
							"name": "events",
							"item": [
								{
									"name": "Get Events related to this project",
									"id": "b0e3b287-b69c-4164-9e5f-99285e393c7f",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/project/:project_id/events",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"project",
												":project_id",
												"events"
											],
											"variable": [
												{
													"key": "project_id",
													"value": "<integer>",
													"description": "(Required) Project ID"
												}
											]
										}
									},
									"response": [
										{
											"id": "bb0b55e4-3368-4841-beb9-fdcf9194bc6c",
											"name": "Array of events in chronological order",
											"originalRequest": {
												"method": "GET",
												"header": [
													{
														"key": "Accept",
														"value": "application/json"
													},
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/events",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"events"
													],
													"variable": [
														{
															"key": "project_id"
														}
													]
												}
											},
											"status": "OK",
											"code": 200,
											"_postman_previewlanguage": "json",
											"header": [
												{
													"key": "Content-Type",
													"value": "application/json"
												}
											],
											"cookie": [],
											"body": "[\n  {\n    \"project_id\": \"<integer>\",\n    \"user_id\": \"<integer>\",\n    \"description\": \"<string>\"\n  },\n  {\n    \"project_id\": \"<integer>\",\n    \"user_id\": \"<integer>\",\n    \"description\": \"<string>\"\n  }\n]"
										}
									]
								}
							],
							"id": "59ab5972-7a4b-4796-b0b9-c3b3409533d8"
						},
						{
							"name": "users",
							"item": [
								{
									"name": "{user_id}",
									"item": [
										{
											"name": "Update user role",
											"id": "ed021401-fce4-4cd5-8bbd-3ac2bcd23f8f",
											"protocolProfileBehavior": {
												"disableBodyPruning": true
											},
											"request": {
												"method": "PUT",
												"header": [
													{
														"key": "Content-Type",
														"value": "application/json"
													}
												],
												"body": {
													"mode": "raw",
													"raw": "{\n  \"role\": \"manager\"\n}",
													"options": {
														"raw": {
															"headerFamily": "json",
															"language": "json"
														}
													}
												},
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/users/:user_id",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"users",
														":user_id"
													],
													"variable": [
														{
															"key": "project_id",
															"value": "<integer>",
															"description": "(Required) Project ID"
														},
														{
															"key": "user_id",
															"value": "<integer>",
															"description": "(Required) User ID"
														}
													]
												}
											},
											"response": [
												{
													"id": "8159e830-af1a-4567-9427-59a8c19b1022",
													"name": "User updated",
													"originalRequest": {
														"method": "PUT",
														"header": [
															{
																"key": "Content-Type",
																"value": "application/json"
															},
															{
																"description": "Added as a part of security scheme: apikey",
																"key": "Authorization",
																"value": "<API Key>"
															}
														],
														"body": {
															"mode": "raw",
															"raw": "{\n  \"role\": \"manager\"\n}",
															"options": {
																"raw": {
																	"headerFamily": "json",
																	"language": "json"
																}
															}
														},
														"url": {
															"raw": "{{baseUrl}}/project/:project_id/users/:user_id",
															"host": [
																"{{baseUrl}}"
															],
															"path": [
																"project",
																":project_id",
																"users",
																":user_id"
															],
															"variable": [
																{
																	"key": "project_id"
																},
																{
																	"key": "user_id"
																}
															]
														}
													},
													"status": "No Content",
													"code": 204,
													"_postman_previewlanguage": "text",
													"header": [],
													"cookie": []
												}
											]
										},
										{
											"name": "Removes user from project",
											"id": "12114ff7-c872-4699-ae98-535db41cbab0",
											"protocolProfileBehavior": {
												"disableBodyPruning": true
											},
											"request": {
												"method": "DELETE",
												"header": [],
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/users/:user_id",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"users",
														":user_id"
													],
													"variable": [
														{
															"key": "project_id",
															"value": "<integer>",
															"description": "(Required) Project ID"
														},
														{
															"key": "user_id",
															"value": "<integer>",
															"description": "(Required) User ID"
														}
													]
												}
											},
											"response": [
												{
													"id": "65245997-98d2-4ca9-b5f7-bbe8a54c5f07",
													"name": "User removed",
													"originalRequest": {
														"method": "DELETE",
														"header": [
															{
																"description": "Added as a part of security scheme: apikey",
																"key": "Authorization",
																"value": "<API Key>"
															}
														],
														"url": {
															"raw": "{{baseUrl}}/project/:project_id/users/:user_id",
															"host": [
																"{{baseUrl}}"
															],
															"path": [
																"project",
																":project_id",
																"users",
																":user_id"
															],
															"variable": [
																{
																	"key": "project_id"
																},
																{
																	"key": "user_id"
																}
															]
														}
													},
													"status": "No Content",
													"code": 204,
													"_postman_previewlanguage": "text",
													"header": [],
													"cookie": []
												}
											]
										}
									],
									"id": "93b0c15b-1858-42e0-9a4b-d5714fde836b"
								},
								{
									"name": "Get users linked to project",
									"id": "0fbedd92-e7f1-4207-9952-1fa11841630d",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "GET",
										"header": [
											{
												"key": "Accept",
												"value": "application/json"
											}
										],
										"url": {
											"raw": "{{baseUrl}}/project/:project_id/users?sort=email&order=asc",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"project",
												":project_id",
												"users"
											],
											"query": [
												{
													"key": "sort",
													"value": "email",
													"description": "(Required) sorting name"
												},
												{
													"key": "order",
													"value": "asc",
													"description": "(Required) ordering manner"
												}
											],
											"variable": [
												{
													"key": "project_id",
													"value": "<integer>",
													"description": "(Required) Project ID"
												}
											]
										}
									},
									"response": [
										{
											"id": "ee4a34bb-2053-461c-bdef-479d47ca6586",
											"name": "Users",
											"originalRequest": {
												"method": "GET",
												"header": [
													{
														"key": "Accept",
														"value": "application/json"
													},
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/users?sort=email&order=asc",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"users"
													],
													"query": [
														{
															"description": "(Required) sorting name",
															"key": "sort",
															"value": "email"
														},
														{
															"description": "(Required) ordering manner",
															"key": "order",
															"value": "asc"
														}
													],
													"variable": [
														{
															"key": "project_id"
														}
													]
												}
											},
											"status": "OK",
											"code": 200,
											"_postman_previewlanguage": "json",
											"header": [
												{
													"key": "Content-Type",
													"value": "application/json"
												}
											],
											"cookie": [],
											"body": "[\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"username\": \"<string>\",\n    \"role\": \"task_runner\"\n  },\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"username\": \"<string>\",\n    \"role\": \"guest\"\n  }\n]"
										}
									]
								},
								{
									"name": "Link user to project",
									"id": "97f0f4f1-d226-43d8-8c77-ffd4ac2baa2d",
									"protocolProfileBehavior": {
										"disableBodyPruning": true
									},
									"request": {
										"method": "POST",
										"header": [
											{
												"key": "Content-Type",
												"value": "application/json"
											}
										],
										"body": {
											"mode": "raw",
											"raw": "{\n  \"user_id\": \"<integer>\",\n  \"role\": \"guest\"\n}",
											"options": {
												"raw": {
													"headerFamily": "json",
													"language": "json"
												}
											}
										},
										"url": {
											"raw": "{{baseUrl}}/project/:project_id/users",
											"host": [
												"{{baseUrl}}"
											],
											"path": [
												"project",
												":project_id",
												"users"
											],
											"variable": [
												{
													"key": "project_id",
													"value": "<integer>",
													"description": "(Required) Project ID"
												}
											]
										}
									},
									"response": [
										{
											"id": "53628ba9-1548-4f99-8d47-3de43502cba4",
											"name": "User added",
											"originalRequest": {
												"method": "POST",
												"header": [
													{
														"key": "Content-Type",
														"value": "application/json"
													},
													{
														"description": "Added as a part of security scheme: apikey",
														"key": "Authorization",
														"value": "<API Key>"
													}
												],
												"body": {
													"mode": "raw",
													"raw": "{\n  \"user_id\": \"<integer>\",\n  \"role\": \"guest\"\n}",
													"options": {
														"raw": {
															"headerFamily": "json",
															"language": "json"
														}
													}
												},
												"url": {
													"raw": "{{baseUrl}}/project/:project_id/users",
													"host": [
														"{{baseUrl}}"
													],
													"path": [
														"project",
														":project_id",
														"users"
													],
													"variable": [
														{
															"key": "project_id"
														}
													]
												}
											},
											"status": "No Content",
											"code": 204,
											"_postman_previewlanguage": "text",
											"header": [],
											"cookie": []
										}
									]
								}
							],
							"id": "b25959e0-7fde-4233-a588-4685ccef8d96"
						},
						{
							"name": "integrations",
							"item": [
								{
									"name": "{integration_id}",
									"item": [
										{
											"name": "values",
											"item": [
												{
													"name": "{extractvalue_id}",
													"item": [
														{
															"name": "Updates Integration ExtractValue",
															"id": "7bc07454-80f6-4b60-ba54-2d2a7f1a41c4",
															"protocolProfileBehavior": {
																"disableBodyPruning": true
															},
															"request": {
																"method": "PUT",
																"header": [
																	{
																		"key": "Content-Type",
																		"value": "application/json"
																	}
																],
																"body": {
																	"mode": "raw",
																	"raw": "{\n  \"name\": \"<string>\",\n  \"value_source\": \"body\",\n  \"body_data_type\": \"xml\",\n  \"key\": \"<string>\",\n  \"variable\": \"<string>\"\n}",
																	"options": {
																		"raw": {
																			"headerFamily": "json",
																			"language": "json"
																		}
																	}
																},
																"url": {
																	"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values/:extractvalue_id",
																	"host": [
																		"{{baseUrl}}"
																	],
																	"path": [
																		"project",
																		":project_id",
																		"integrations",
																		":integration_id",
																		"values",
																		":extractvalue_id"
																	],
																	"variable": [
																		{
																			"key": "project_id",
																			"value": "<integer>",
																			"description": "(Required) Project ID"
																		},
																		{
																			"key": "integration_id",
																			"value": "<integer>",
																			"description": "(Required) integration ID"
																		},
																		{
																			"key": "extractvalue_id",
																			"value": "<integer>",
																			"description": "(Required) extractValue ID"
																		}
																	]
																}
															},
															"response": [
																{
																	"id": "bf03df0a-7546-4864-97f9-2ccf4a741e0e",
																	"name": "Integration Extract Value updated",
																	"originalRequest": {
																		"method": "PUT",
																		"header": [
																			{
																				"key": "Content-Type",
																				"value": "application/json"
																			},
																			{
																				"description": "Added as a part of security scheme: apikey",
																				"key": "Authorization",
																				"value": "<API Key>"
																			}
																		],
																		"body": {
																			"mode": "raw",
																			"raw": "{\n  \"name\": \"<string>\",\n  \"value_source\": \"body\",\n  \"body_data_type\": \"xml\",\n  \"key\": \"<string>\",\n  \"variable\": \"<string>\"\n}",
																			"options": {
																				"raw": {
																					"headerFamily": "json",
																					"language": "json"
																				}
																			}
																		},
																		"url": {
																			"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values/:extractvalue_id",
																			"host": [
																				"{{baseUrl}}"
																			],
																			"path": [
																				"project",
																				":project_id",
																				"integrations",
																				":integration_id",
																				"values",
																				":extractvalue_id"
																			],
																			"variable": [
																				{
																					"key": "project_id"
																				},
																				{
																					"key": "integration_id"
																				},
																				{
																					"key": "extractvalue_id"
																				}
																			]
																		}
																	},
																	"status": "No Content",
																	"code": 204,
																	"_postman_previewlanguage": "text",
																	"header": [],
																	"cookie": []
																},
																{
																	"id": "aea21b21-fbef-4bdd-8101-c9caeeaf438c",
																	"name": "Bad integration extract value parameter",
																	"originalRequest": {
																		"method": "PUT",
																		"header": [
																			{
																				"key": "Content-Type",
																				"value": "application/json"
																			},
																			{
																				"description": "Added as a part of security scheme: apikey",
																				"key": "Authorization",
																				"value": "<API Key>"
																			}
																		],
																		"body": {
																			"mode": "raw",
																			"raw": "{\n  \"name\": \"<string>\",\n  \"value_source\": \"body\",\n  \"body_data_type\": \"xml\",\n  \"key\": \"<string>\",\n  \"variable\": \"<string>\"\n}",
																			"options": {
																				"raw": {
																					"headerFamily": "json",
																					"language": "json"
																				}
																			}
																		},
																		"url": {
																			"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values/:extractvalue_id",
																			"host": [
																				"{{baseUrl}}"
																			],
																			"path": [
																				"project",
																				":project_id",
																				"integrations",
																				":integration_id",
																				"values",
																				":extractvalue_id"
																			],
																			"variable": [
																				{
																					"key": "project_id"
																				},
																				{
																					"key": "integration_id"
																				},
																				{
																					"key": "extractvalue_id"
																				}
																			]
																		}
																	},
																	"status": "Bad Request",
																	"code": 400,
																	"_postman_previewlanguage": "text",
																	"header": [],
																	"cookie": []
																}
															]
														},
														{
															"name": "Removes integration extract value",
															"id": "2ca39f14-a5e8-49ff-b133-c6c1bca56451",
															"protocolProfileBehavior": {
																"disableBodyPruning": true
															},
															"request": {
																"method": "DELETE",
																"header": [],
																"url": {
																	"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values/:extractvalue_id",
																	"host": [
																		"{{baseUrl}}"
																	],
																	"path": [
																		"project",
																		":project_id",
																		"integrations",
																		":integration_id",
																		"values",
																		":extractvalue_id"
																	],
																	"variable": [
																		{
																			"key": "project_id",
																			"value": "<integer>",
																			"description": "(Required) Project ID"
																		},
																		{
																			"key": "integration_id",
																			"value": "<integer>",
																			"description": "(Required) integration ID"
																		},
																		{
																			"key": "extractvalue_id",
																			"value": "<integer>",
																			"description": "(Required) extractValue ID"
																		}
																	]
																}
															},
															"response": [
																{
																	"id": "c94d1edb-7b83-4549-b097-3c9c0bac7976",
																	"name": "integration extract value removed",
																	"originalRequest": {
																		"method": "DELETE",
																		"header": [
																			{
																				"description": "Added as a part of security scheme: apikey",
																				"key": "Authorization",
																				"value": "<API Key>"
																			}
																		],
																		"url": {
																			"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values/:extractvalue_id",
																			"host": [
																				"{{baseUrl}}"
																			],
																			"path": [
																				"project",
																				":project_id",
																				"integrations",
																				":integration_id",
																				"values",
																				":extractvalue_id"
																			],
																			"variable": [
																				{
																					"key": "project_id"
																				},
																				{
																					"key": "integration_id"
																				},
																				{
																					"key": "extractvalue_id"
																				}
																			]
																		}
																	},
																	"status": "No Content",
																	"code": 204,
																	"_postman_previewlanguage": "text",
																	"header": [],
																	"cookie": []
																}
															]
														}
													],
													"id": "aa589140-c673-4193-8546-efcc1b05f69f"
												},
												{
													"name": "Get Integration Extracted Values linked to integration extractor",
													"id": "5cf57ab1-acbb-46cd-a6b2-d8e6bc40daf2",
													"protocolProfileBehavior": {
														"disableBodyPruning": true
													},
													"request": {
														"method": "GET",
														"header": [
															{
																"key": "Accept",
																"value": "application/json"
															}
														],
														"url": {
															"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values",
															"host": [
																"{{baseUrl}}"
															],
															"path": [
																"project",
																":project_id",
																"integrations",
																":integration_id",
																"values"
															],
															"variable": [
																{
																	"key": "project_id",
																	"value": "<integer>",
																	"description": "(Required) Project ID"
																},
																{
																	"key": "integration_id",
																	"value": "<integer>",
																	"description": "(Required) integration ID"
																}
															]
														}
													},
													"response": [
														{
															"id": "bd8a3fa9-b988-4e23-8ed2-6b7367bc8e1d",
															"name": "Integration Extracted Value",
															"originalRequest": {
																"method": "GET",
																"header": [
																	{
																		"key": "Accept",
																		"value": "application/json"
																	},
																	{
																		"description": "Added as a part of security scheme: apikey",
																		"key": "Authorization",
																		"value": "<API Key>"
																	}
																],
																"url": {
																	"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values",
																	"host": [
																		"{{baseUrl}}"
																	],
																	"path": [
																		"project",
																		":project_id",
																		"integrations",
																		":integration_id",
																		"values"
																	],
																	"variable": [
																		{
																			"key": "project_id"
																		},
																		{
																			"key": "integration_id"
																		}
																	]
																}
															},
															"status": "OK",
															"code": 200,
															"_postman_previewlanguage": "json",
															"header": [
																{
																	"key": "Content-Type",
																	"value": "application/json"
																}
															],
															"cookie": [],
															"body": "[\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"value_source\": \"header\",\n    \"body_data_type\": \"xml\",\n    \"key\": \"<string>\",\n    \"variable\": \"<string>\",\n    \"integration_id\": \"<integer>\"\n  },\n  {\n    \"id\": \"<integer>\",\n    \"name\": \"<string>\",\n    \"value_source\": \"body\",\n    \"body_data_type\": \"json\",\n    \"key\": \"<string>\",\n    \"variable\": \"<string>\",\n    \"integration_id\": \"<integer>\"\n  }\n]"
														}
													]
												},
												{
													"name": "Add Integration Extracted Value",
													"id": "6bdc4a7f-e460-469c-a469-0341b8370ac7",
													"protocolProfileBehavior": {
														"disableBodyPruning": true
													},
													"request": {
														"method": "POST",
														"header": [
															{
																"key": "Content-Type",
																"value": "application/json"
															}
														],
														"body": {
															"mode": "raw",
															"raw": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"value_source\": \"body\",\n  \"body_data_type\": \"json\",\n  \"key\": \"<string>\",\n  \"variable\": \"<string>\",\n  \"integration_id\": \"<integer>\"\n}",
															"options": {
																"raw": {
																	"headerFamily": "json",
																	"language": "json"
																}
															}
														},
														"url": {
															"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values",
															"host": [
																"{{baseUrl}}"
															],
															"path": [
																"project",
																":project_id",
																"integrations",
																":integration_id",
																"values"
															],
															"variable": [
																{
																	"key": "project_id",
																	"value": "<integer>",
																	"description": "(Required) Project ID"
																},
																{
																	"key": "integration_id",
																	"value": "<integer>",
																	"description": "(Required) integration ID"
																}
															]
														}
													},
													"response": [
														{
															"id": "1f5d1e06-c87a-4ca8-989d-739850fca285",
															"name": "Integration Extract Value Created",
															"originalRequest": {
																"method": "POST",
																"header": [
																	{
																		"key": "Content-Type",
																		"value": "application/json"
																	},
																	{
																		"description": "Added as a part of security scheme: apikey",
																		"key": "Authorization",
																		"value": "<API Key>"
																	}
																],
																"body": {
																	"mode": "raw",
																	"raw": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"value_source\": \"body\",\n  \"body_data_type\": \"json\",\n  \"key\": \"<string>\",\n  \"variable\": \"<string>\",\n  \"integration_id\": \"<integer>\"\n}",
																	"options": {
																		"raw": {
																			"headerFamily": "json",
																			"language": "json"
																		}
																	}
																},
																"url": {
																	"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values",
																	"host": [
																		"{{baseUrl}}"
																	],
																	"path": [
																		"project",
																		":project_id",
																		"integrations",
																		":integration_id",
																		"values"
																	],
																	"variable": [
																		{
																			"key": "project_id"
																		},
																		{
																			"key": "integration_id"
																		}
																	]
																}
															},
															"status": "Created",
															"code": 201,
															"_postman_previewlanguage": "text",
															"header": [],
															"cookie": []
														},
														{
															"id": "c6e6f7ce-d622-4b6e-953e-7a1583b9c1e8",
															"name": "Bad Integration Extract Value params",
															"originalRequest": {
																"method": "POST",
																"header": [
																	{
																		"key": "Content-Type",
																		"value": "application/json"
																	},
																	{
																		"description": "Added as a part of security scheme: apikey",
																		"key": "Authorization",
																		"value": "<API Key>"
																	}
																],
																"body": {
																	"mode": "raw",
																	"raw": "{\n  \"id\": \"<integer>\",\n  \"name\": \"<string>\",\n  \"value_source\": \"body\",\n  \"body_data_type\": \"json\",\n  \"key\": \"<string>\",\n  \"variable\": \"<string>\",\n  \"integration_id\": \"<integer>\"\n}",
																	"options": {
																		"raw": {
																			"headerFamily": "json",
																			"language": "json"
																		}
																	}
																},
																"url": {
																	"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/values",
																	"host": [
																		"{{baseUrl}}"
																	],
																	"path": [
																		"project",
																		":project_id",
																		"integrations",
																		":integration_id",
																		"values"
																	],
																	"variable": [
																		{
																			"key": "project_id"
																		},
																		{
																			"key": "integration_id"
																		}
																	]
																}
															},
															"status": "Bad Request",
															"code": 400,
															"_postman_previewlanguage": "text",
															"header": [],
															"cookie": []
														}
													]
												}
											],
											"id": "f13b63ad-1ac9-421b-af74-d434f6ec2229"
										},
										{
											"name": "matchers",
											"item": [
												{
													"name": "{matcher_id}",
													"item": [
														{
															"name": "Updates Integration Matcher",
															"id": "5a5a6603-e57d-4069-b8dd-92a81587a48b",
															"protocolProfileBehavior": {
																"disableBodyPruning": true
															},
															"request": {
																"method": "PUT",
																"header": [
																	{
																		"key": "Content-Type",
																		"value": "application/json"
																	}
																],
																"body": {
																	"mode": "raw",
																	"raw": "{\n  \"name\": \"<string>\",\n  \"match_type\": \"header\",\n  \"method\": \"unequals\",\n  \"body_data_type\": \"string\",\n  \"key\": \"<string>\",\n  \"value\": \"<string>\"\n}",
																	"options": {
																		"raw": {
																			"headerFamily": "json",
																			"language": "json"
																		}
																	}
																},
																"url": {
																	"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/matchers/:matcher_id",
																	"host": [
																		"{{baseUrl}}"
																	],
																	"path": [
																		"project",
																		":project_id",
																		"integrations",
																		":integration_id",
																		"matchers",
																		":matcher_id"
																	],
																	"variable": [
																		{
																			"key": "project_id",
																			"value": "<integer>",
																			"description": "(Required) Project ID"
																		},
																		{
																			"key": "integration_id",
																			"value": "<integer>",
																			"description": "(Required) integration ID"
																		},
																		{
																			"key": "matcher_id",
																			"value": "<integer>",
																			"description": "(Required) matcher ID"
																		}
																	]
																}
															},
															"response": [
																{
																	"id": "1de952e3-9106-49aa-9d98-24726337831c",
																	"name": "Integration Matcher updated",
																	"originalRequest": {
																		"method": "PUT",
																		"header": [
																			{
																				"key": "Content-Type",
																				"value": "application/json"
																			},
																			{
																				"description": "Added as a part of security scheme: apikey",
																				"key": "Authorization",
																				"value": "<API Key>"
																			}
																		],
																		"body": {
																			"mode": "raw",
																			"raw": "{\n  \"name\": \"<string>\",\n  \"match_type\": \"header\",\n  \"method\": \"unequals\",\n  \"body_data_type\": \"string\",\n  \"key\": \"<string>\",\n  \"value\": \"<string>\"\n}",
																			"options": {
																				"raw": {
																					"headerFamily": "json",
																					"language": "json"
																				}
																			}
																		},
																		"url": {
																			"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/matchers/:matcher_id",
																			"host": [
																				"{{baseUrl}}"
																			],
																			"path": [
																				"project",
																				":project_id",
																				"integrations",
																				":integration_id",
																				"matchers",
																				":matcher_id"
																			],
																			"variable": [
																				{
																					"key": "project_id"
																				},
																				{
																					"key": "integration_id"
																				},
																				{
																					"key": "matcher_id"
																				}
																			]
																		}
																	},
																	"status": "No Content",
																	"code": 204,
																	"_postman_previewlanguage": "text",
																	"header": [],
																	"cookie": []
																},
																{
																	"id": "8bd5c3dd-b348-4907-bf8b-05b45ff4be64",
																	"name": "Bad integration matcher parameter",
																	"originalRequest": {
																		"method": "PUT",
																		"header": [
																			{
																				"key": "Content-Type",
																				"value": "application/json"
																			},
																			{
																				"description": "Added as a part of security scheme: apikey",
																				"key": "Authorization",
																				"value": "<API Key>"
																			}
																		],
																		"body": {
																			"mode": "raw",
																			"raw": "{\n  \"name\": \"<string>\",\n  \"match_type\": \"header\",\n  \"method\": \"unequals\",\n  \"body_data_type\": \"string\",\n  \"key\": \"<string>\",\n  \"value\": \"<string>\"\n}",
																			"options": {
																				"raw": {
																					"headerFamily": "json",
																					"language": "json"
																				}
																			}
																		},
																		"url": {
																			"raw": "{{baseUrl}}/project/:project_id/integrations/:integration_id/matchers/:matcher_id",
																			"host": [
																				"{{baseUrl}}"
																			],
																			"path": [
																				"project",
																				":project_id",
																				"integrations",
																				":integration_id",
																				"matchers",
																				":matcher_id"
																			],
																			"variable": [
																				{
																					"key": "project_id"
																				},
																				{
																					"key": "integration_id"
																				},
																				{
																					"key": "matcher_id"
																				}
																			]
																		}
																	},
																	"status": "Bad Request",
																	"code": 400,
																	"_postman_previewlanguage": "text",
																	"header": [],
													
Download .txt
gitextract_0gdlbcvx/

├── .codacy.yml
├── .cursorignore
├── .devcontainer/
│   ├── config-runner.json
│   ├── config.json
│   ├── devcontainer.json
│   └── postCreateCommand.sh
├── .dockerignore
├── .dredd/
│   ├── dredd.docker.yml
│   ├── dredd.local.yml
│   ├── dredd.testing.yml
│   ├── dredd.windows.yml
│   ├── hooks/
│   │   ├── capabilities.go
│   │   ├── helpers.go
│   │   └── main.go
│   └── server-wrapper.sh
├── .github/
│   ├── FUNDING.yml
│   ├── ISSUE_TEMPLATE/
│   │   ├── documentation.yml
│   │   ├── feature_request.yml
│   │   ├── problem.yml
│   │   └── question.yml
│   ├── copilot-instructions.md
│   └── workflows/
│       ├── community_beta.yml
│       ├── community_release.yml
│       ├── dev.yml
│       ├── pro_selfhosted_beta.yml
│       └── pro_selfhosted_release.yml
├── .gitignore
├── .golangci.yml
├── .goreleaser.yml
├── .postman/
│   ├── api
│   ├── api_4023cf7c-aabb-4d5a-a742-72dadbd4924a
│   ├── api_5306c424-9fc0-4923-be37-fbda305ca8de
│   ├── api_9a8524cc-4892-4b54-a6b3-1ef18d907626
│   └── postman/
│       └── collections/
│           └── Semaphore API.json
├── .vscode/
│   └── launch.json
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── LICENSE
├── README.md
├── SECURITY.md
├── TERRAFORM_ARGS_IMPROVEMENT.md
├── Taskfile.yml
├── api/
│   ├── api_test.go
│   ├── apps.go
│   ├── apps_test.go
│   ├── auth.go
│   ├── cache.go
│   ├── debug/
│   │   ├── gc.go
│   │   └── pprof.go
│   ├── events.go
│   ├── helpers/
│   │   ├── context.go
│   │   ├── event_log.go
│   │   ├── helpers.go
│   │   ├── helpers_test.go
│   │   ├── query_params.go
│   │   ├── route_params.go
│   │   └── write_response.go
│   ├── integration.go
│   ├── integration_test.go
│   ├── login.go
│   ├── login_test.go
│   ├── options.go
│   ├── projects/
│   │   ├── backup_restore.go
│   │   ├── environment.go
│   │   ├── integration.go
│   │   ├── integration_alias.go
│   │   ├── integration_extract_value.go
│   │   ├── integration_matcher.go
│   │   ├── inventory.go
│   │   ├── inventory_test.go
│   │   ├── keys.go
│   │   ├── project.go
│   │   ├── projects.go
│   │   ├── repository.go
│   │   ├── schedules.go
│   │   ├── secret_storages.go
│   │   ├── tasks.go
│   │   ├── templates.go
│   │   ├── users.go
│   │   └── views.go
│   ├── router.go
│   ├── runners/
│   │   └── runners.go
│   ├── runners.go
│   ├── sockets/
│   │   ├── handler.go
│   │   └── pool.go
│   ├── system_info.go
│   ├── tasks/
│   │   └── tasks.go
│   ├── user.go
│   └── users.go
├── api-docs.yml
├── cli/
│   ├── cmd/
│   │   ├── migrate.go
│   │   ├── project.go
│   │   ├── project_export.go
│   │   ├── project_import.go
│   │   ├── root.go
│   │   ├── runner.go
│   │   ├── runner_register.go
│   │   ├── runner_setup.go
│   │   ├── runner_start.go
│   │   ├── runner_unregister.go
│   │   ├── server.go
│   │   ├── setup.go
│   │   ├── syslog.go
│   │   ├── syslog_windows.go
│   │   ├── token.go
│   │   ├── user.go
│   │   ├── user_add.go
│   │   ├── user_change.go
│   │   ├── user_delete.go
│   │   ├── user_get.go
│   │   ├── user_list.go
│   │   ├── user_totp.go
│   │   ├── vault.go
│   │   ├── vault_rekey.go
│   │   └── version.go
│   ├── main.go
│   └── setup/
│       └── setup.go
├── db/
│   ├── APIToken.go
│   ├── AccessKey.go
│   ├── Alias.go
│   ├── BackupEntity.go
│   ├── Environment.go
│   ├── Environment_test.go
│   ├── Event.go
│   ├── ExportEntityType.go
│   ├── Integration.go
│   ├── Inventory.go
│   ├── Migration.go
│   ├── Option.go
│   ├── Project.go
│   ├── ProjectInvite.go
│   ├── ProjectInvite_test.go
│   ├── ProjectStats.go
│   ├── ProjectUser.go
│   ├── ProjectUser_test.go
│   ├── Repository.go
│   ├── Repository_test.go
│   ├── Role.go
│   ├── Runner.go
│   ├── Schedule.go
│   ├── SecretStorage.go
│   ├── Session.go
│   ├── Store.go
│   ├── Store_test.go
│   ├── Task.go
│   ├── TaskParams.go
│   ├── Template.go
│   ├── TemplateVault.go
│   ├── Template_alias.go
│   ├── TerraformInventoryAlias.go
│   ├── TerraformInventoryState_pro.go
│   ├── TerraformInventoryStore_pro.go
│   ├── User.go
│   ├── View.go
│   ├── ansible.go
│   ├── bolt/
│   │   ├── BoltDb.go
│   │   ├── BoltDb_test.go
│   │   ├── Task_test.go
│   │   ├── access_key.go
│   │   ├── environment.go
│   │   ├── event.go
│   │   ├── global_runner.go
│   │   ├── global_runner_test.go
│   │   ├── integrations.go
│   │   ├── integrations_alias.go
│   │   ├── inventory.go
│   │   ├── migration.go
│   │   ├── migration_2_10_12.go
│   │   ├── migration_2_10_12_test.go
│   │   ├── migration_2_10_16.go
│   │   ├── migration_2_10_16_test.go
│   │   ├── migration_2_10_24.go
│   │   ├── migration_2_10_24_test.go
│   │   ├── migration_2_10_33.go
│   │   ├── migration_2_10_33_test.go
│   │   ├── migration_2_14_7.go
│   │   ├── migration_2_14_7_test.go
│   │   ├── migration_2_17_0.go
│   │   ├── migration_2_17_0_test.go
│   │   ├── migration_2_17_2.go
│   │   ├── migration_2_8_28.go
│   │   ├── migration_2_8_28_test.go
│   │   ├── migration_2_8_40.go
│   │   ├── migration_2_8_40_test.go
│   │   ├── migration_2_8_91.go
│   │   ├── migration_2_8_91_test.go
│   │   ├── option.go
│   │   ├── option_test.go
│   │   ├── project.go
│   │   ├── project_invite.go
│   │   ├── project_test.go
│   │   ├── public_alias.go
│   │   ├── repository.go
│   │   ├── role.go
│   │   ├── runner_pro.go
│   │   ├── runner_pro_test.go
│   │   ├── schedule.go
│   │   ├── secret_storage.go
│   │   ├── session.go
│   │   ├── task.go
│   │   ├── template.go
│   │   ├── template_test.go
│   │   ├── template_vault.go
│   │   ├── template_vault_test.go
│   │   ├── user.go
│   │   ├── user_test.go
│   │   ├── view.go
│   │   └── view_test.go
│   ├── config.go
│   ├── config_test.go
│   ├── factory/
│   │   └── store.go
│   ├── migration/
│   │   └── migration.go
│   └── sql/
│       ├── SqlDb.go
│       ├── SqlDb_test.go
│       ├── access_key.go
│       ├── environment.go
│       ├── event.go
│       ├── global_runner.go
│       ├── integration.go
│       ├── integration_alias.go
│       ├── inventory.go
│       ├── migration.go
│       ├── migration_2_10_24.go
│       ├── migration_2_8_28.go
│       ├── migration_2_8_42.go
│       ├── migrations/
│       │   ├── v0.0.0.sql
│       │   ├── v1.0.0.sql
│       │   ├── v1.2.0.sql
│       │   ├── v1.3.0.sql
│       │   ├── v1.4.0.sql
│       │   ├── v1.5.0.sql
│       │   ├── v1.6.0.sql
│       │   ├── v1.7.0.sql
│       │   ├── v1.8.0.sql
│       │   ├── v1.9.0.sql
│       │   ├── v2.10.12.sql
│       │   ├── v2.10.15.sql
│       │   ├── v2.10.16.sql
│       │   ├── v2.10.24.sql
│       │   ├── v2.10.26.sql
│       │   ├── v2.10.28.sql
│       │   ├── v2.10.33.sql
│       │   ├── v2.10.46.sql
│       │   ├── v2.11.5.sql
│       │   ├── v2.12.0.sql
│       │   ├── v2.12.15.sql
│       │   ├── v2.12.3.sql
│       │   ├── v2.12.4.sql
│       │   ├── v2.12.5.sql
│       │   ├── v2.13.0.sql
│       │   ├── v2.14.0.err.sql
│       │   ├── v2.14.0.sql
│       │   ├── v2.14.1.err.sql
│       │   ├── v2.14.1.sql
│       │   ├── v2.14.12.err.sql
│       │   ├── v2.14.12.sql
│       │   ├── v2.14.5.sql
│       │   ├── v2.14.7.sql
│       │   ├── v2.15.0.err.sql
│       │   ├── v2.15.0.sql
│       │   ├── v2.15.1.err.sql
│       │   ├── v2.15.1.sql
│       │   ├── v2.15.1.sqlite.sql
│       │   ├── v2.15.2.err.sql
│       │   ├── v2.15.2.sql
│       │   ├── v2.15.3.err.sql
│       │   ├── v2.15.3.sql
│       │   ├── v2.15.4.err.sql
│       │   ├── v2.15.4.sql
│       │   ├── v2.16.0.err.sql
│       │   ├── v2.16.0.sql
│       │   ├── v2.16.1.err.sql
│       │   ├── v2.16.1.sql
│       │   ├── v2.16.2.err.sql
│       │   ├── v2.16.2.sql
│       │   ├── v2.16.3.err.sql
│       │   ├── v2.16.3.sql
│       │   ├── v2.16.50.err.sql
│       │   ├── v2.16.50.sql
│       │   ├── v2.16.8.err.sql
│       │   ├── v2.16.8.sql
│       │   ├── v2.17.0.err.sql
│       │   ├── v2.17.0.sql
│       │   ├── v2.17.1.err.sql
│       │   ├── v2.17.1.sql
│       │   ├── v2.17.15.err.sql
│       │   ├── v2.17.15.sql
│       │   ├── v2.17.2.err.sql
│       │   ├── v2.17.2.sql
│       │   ├── v2.2.1.sql
│       │   ├── v2.3.0.sql
│       │   ├── v2.3.1.sql
│       │   ├── v2.3.2.sql
│       │   ├── v2.4.0.sql
│       │   ├── v2.5.0.sql
│       │   ├── v2.5.2.sql
│       │   ├── v2.7.1.sql
│       │   ├── v2.7.10.sql
│       │   ├── v2.7.12.sql
│       │   ├── v2.7.13.sql
│       │   ├── v2.7.4.sql
│       │   ├── v2.7.6.sql
│       │   ├── v2.7.8.sql
│       │   ├── v2.7.9.sql
│       │   ├── v2.8.0.sql
│       │   ├── v2.8.1.sql
│       │   ├── v2.8.20.sql
│       │   ├── v2.8.25.sql
│       │   ├── v2.8.26.sql
│       │   ├── v2.8.36.sql
│       │   ├── v2.8.38.sql
│       │   ├── v2.8.39.sql
│       │   ├── v2.8.40.sql
│       │   ├── v2.8.42.sql
│       │   ├── v2.8.51.sql
│       │   ├── v2.8.57.sql
│       │   ├── v2.8.58.sql
│       │   ├── v2.8.7.sql
│       │   ├── v2.8.8.sql
│       │   ├── v2.8.91.sql
│       │   ├── v2.9.100.sql
│       │   ├── v2.9.46.sql
│       │   ├── v2.9.6.sql
│       │   ├── v2.9.60.sql
│       │   ├── v2.9.61.sql
│       │   ├── v2.9.62.sql
│       │   ├── v2.9.70.sql
│       │   └── v2.9.97.sql
│       ├── option.go
│       ├── project.go
│       ├── project_invite.go
│       ├── repository.go
│       ├── role.go
│       ├── runner.go
│       ├── schedule.go
│       ├── secret_storage.go
│       ├── session.go
│       ├── task.go
│       ├── template.go
│       ├── template_vault.go
│       ├── user.go
│       └── view.go
├── db_lib/
│   ├── AccessKeyInstaller.go
│   ├── AnsibleApp.go
│   ├── AnsiblePlaybook.go
│   ├── AppFactory.go
│   ├── CmdGitClient.go
│   ├── GitClientFactory.go
│   ├── GitRepository.go
│   ├── GoGitClient.go
│   ├── LocalApp.go
│   ├── LocalApp_test.go
│   ├── ShellApp.go
│   └── TerraformApp.go
├── deployment/
│   ├── compose/
│   │   ├── README.md
│   │   ├── dredd/
│   │   │   ├── base.yml
│   │   │   ├── boltdb.yml
│   │   │   ├── mariadb.yml
│   │   │   ├── mysql.yml
│   │   │   ├── postgres.yml
│   │   │   └── sqlite.yml
│   │   ├── runner/
│   │   │   ├── base.yml
│   │   │   ├── build.yml
│   │   │   └── config.yml
│   │   ├── server/
│   │   │   ├── base.yml
│   │   │   ├── build.yml
│   │   │   └── config.yml
│   │   └── store/
│   │       ├── boltdb.yml
│   │       ├── local.yml
│   │       ├── mariadb.yml
│   │       ├── mysql.yml
│   │       ├── postgres.yml
│   │       └── sqlite.yml
│   ├── docker/
│   │   ├── README.md
│   │   ├── dredd/
│   │   │   ├── Dockerfile
│   │   │   └── entrypoint
│   │   ├── runner/
│   │   │   ├── Dockerfile
│   │   │   ├── ansible.cfg
│   │   │   ├── goss.yaml
│   │   │   └── runner-wrapper
│   │   └── server/
│   │       ├── Dockerfile
│   │       ├── ansible.cfg
│   │       ├── goss.yaml
│   │       ├── powershell/
│   │       │   └── Dockerfile
│   │       └── server-wrapper
│   ├── packaging/
│   │   └── semaphore.spec
│   └── systemd/
│       ├── README.md
│       ├── env
│       ├── runner.service
│       ├── semaphore.service
│       └── util/
│           ├── install.sh
│           └── uninstall.sh
├── examples/
│   ├── authentik_ldap/
│   │   ├── .gitignore
│   │   ├── README.md
│   │   └── docker-compose.yml
│   ├── openldap/
│   │   ├── README.md
│   │   └── docker-compose.yml
│   └── terraform_args_example.json
├── go.mod
├── go.sum
├── hook_helpers/
│   └── hooks_helpers.go
├── pkg/
│   ├── common_errors/
│   │   └── common_errors.go
│   ├── conv/
│   │   └── conv.go
│   ├── random/
│   │   └── string.go
│   ├── ssh/
│   │   ├── agent.go
│   │   └── agent_test.go
│   ├── task_logger/
│   │   └── task_logger.go
│   └── tz/
│       └── time.go
├── pro/
│   ├── api/
│   │   ├── auth_verify.go
│   │   ├── projects/
│   │   │   ├── runners.go
│   │   │   └── terraform_inventory.go
│   │   ├── roles.go
│   │   ├── subscriptions.go
│   │   └── terraform.go
│   ├── db/
│   │   ├── factory/
│   │   │   └── factory.go
│   │   └── sql/
│   │       ├── ansible_task.go
│   │       └── terraform_inventory.go
│   ├── go.mod
│   ├── go.sum
│   ├── pkg/
│   │   ├── features/
│   │   │   └── features.go
│   │   └── stage_parsers/
│   │       └── next_step.go
│   └── services/
│       ├── ha/
│       │   └── ha.go
│       ├── server/
│       │   ├── access_key_serializer_dvls.go
│       │   ├── access_key_serializer_vault.go
│       │   ├── log_write_svc.go
│       │   ├── secret_storage_svc.go
│       │   └── subscription_svc.go
│       └── tasks/
│           └── task_state_store_factory.go
├── pro_interfaces/
│   ├── log_write_svc.go
│   ├── project_runner_ctl.go
│   ├── subscription_ctl.go
│   ├── subscription_svc.go
│   └── terraform_inventory_ctl.go
├── qodana.yaml
├── renovate.json
├── services/
│   ├── export/
│   │   ├── AccessKey.go
│   │   ├── Environment.go
│   │   ├── Event.go
│   │   ├── Exporter.go
│   │   ├── Integration.go
│   │   ├── IntegrationAliases.go
│   │   ├── IntegrationExtractValue.go
│   │   ├── IntegrationMatcher.go
│   │   ├── Inventory.go
│   │   ├── Option.go
│   │   ├── Project.go
│   │   ├── ProjectUser.go
│   │   ├── Repository.go
│   │   ├── Role.go
│   │   ├── Runner.go
│   │   ├── Schedule.go
│   │   ├── SecretStorage.go
│   │   ├── Task.go
│   │   ├── TaskOutput.go
│   │   ├── TaskStage.go
│   │   ├── TaskStageResult.go
│   │   ├── Template.go
│   │   ├── TemplateRoles.go
│   │   ├── TemplateVault.go
│   │   ├── User.go
│   │   └── View.go
│   ├── project/
│   │   ├── backup.go
│   │   ├── backup_marshal.go
│   │   ├── backup_marshal_test.go
│   │   ├── backup_test.go
│   │   ├── restore.go
│   │   └── types.go
│   ├── runners/
│   │   ├── job_pool.go
│   │   ├── running_job.go
│   │   └── types.go
│   ├── schedules/
│   │   ├── SchedulePool.go
│   │   └── SchedulePool_test.go
│   ├── server/
│   │   ├── AccessKey_test.go
│   │   ├── access_key_encryption_svc.go
│   │   ├── access_key_installation_svc.go
│   │   ├── access_key_serializer.go
│   │   ├── access_key_serializer_local.go
│   │   ├── access_key_svc.go
│   │   ├── environment_svc.go
│   │   ├── intergration_svc.go
│   │   ├── inventory_svc.go
│   │   ├── project_svc.go
│   │   ├── project_svc_test.go
│   │   └── secret_storage_svc.go
│   ├── session_svc.go
│   └── tasks/
│       ├── LocalJob.go
│       ├── LocalJob_inventory.go
│       ├── RemoteJob.go
│       ├── TaskPool.go
│       ├── TaskPool_test.go
│       ├── TaskRunner.go
│       ├── TaskRunner_logging.go
│       ├── TaskRunner_test.go
│       ├── alert.go
│       ├── alert_test_sender.go
│       ├── hooks/
│       │   ├── ansible.go
│       │   ├── common.go
│       │   └── factory.go
│       ├── http_test.go
│       ├── task_state_store.go
│       └── templates/
│           ├── dingtalk.tmpl
│           ├── email.tmpl
│           ├── gotify.tmpl
│           ├── microsoft-teams.tmpl
│           ├── rocketchat.tmpl
│           ├── slack.tmpl
│           └── telegram.tmpl
├── test/
│   ├── e2e/
│   │   ├── .gitignore
│   │   ├── package.json
│   │   ├── playwright.config.ts
│   │   └── tests/
│   │       ├── fixtures.ts
│   │       ├── task.spec.ts
│   │       └── variable-group.spec.ts
│   └── mcp/
│       ├── api/
│       │   ├── AGENT.md
│       │   ├── data/
│       │   │   └── case4/
│       │   │       └── test.sh
│       │   ├── run.sh
│       │   └── test_plan.md
│       └── e2e/
│           ├── .gitignore
│           ├── AGENT.md
│           ├── package.json
│           ├── playwright.config.ts
│           ├── run.sh
│           └── test_plan.md
├── util/
│   ├── App.go
│   ├── OdbcProvider.go
│   ├── ansi.go
│   ├── config.go
│   ├── config_assign_test.go
│   ├── config_auth.go
│   ├── config_sysproc.go
│   ├── config_sysproc_windows.go
│   ├── config_test.go
│   ├── debug.go
│   ├── encryption.go
│   ├── errorLogging.go
│   ├── mailer/
│   │   ├── auth.go
│   │   └── mailer.go
│   ├── shell.go
│   ├── test_helpers.go
│   └── version.go
└── web/
    ├── .browserslistrc
    ├── .editorconfig
    ├── .eslintrc.js
    ├── README.md
    ├── babel.config.js
    ├── gulp-gpt-translate.js
    ├── gulpfile.js
    ├── package.json
    ├── public/
    │   ├── index.html
    │   ├── swagger/
    │   │   ├── api-docs.yml
    │   │   ├── index.css
    │   │   ├── index.html
    │   │   ├── oauth2-redirect.html
    │   │   ├── swagger-initializer.js
    │   │   ├── swagger-ui-bundle.js
    │   │   ├── swagger-ui-es-bundle-core.js
    │   │   ├── swagger-ui-es-bundle.js
    │   │   ├── swagger-ui-standalone-preset.js
    │   │   ├── swagger-ui.css
    │   │   └── swagger-ui.js
    │   └── test.txt
    ├── src/
    │   ├── App.vue
    │   ├── assets/
    │   │   ├── fonts/
    │   │   │   └── LICENSE.txt
    │   │   └── scss/
    │   │       ├── components.scss
    │   │       └── main.scss
    │   ├── components/
    │   │   ├── AboutDialog.vue
    │   │   ├── AnsibleStageView.vue
    │   │   ├── AppFieldsMixin.js
    │   │   ├── AppForm.vue
    │   │   ├── AppsMixin.js
    │   │   ├── ArgsPicker.vue
    │   │   ├── ChangePasswordForm.vue
    │   │   ├── CopyClipboardButton.vue
    │   │   ├── CronInput.vue
    │   │   ├── DashboardMenu.vue
    │   │   ├── DvlsIcon.vue
    │   │   ├── EditDialog.vue
    │   │   ├── EditRoleForm.vue
    │   │   ├── EditTeamMemberDialog.vue
    │   │   ├── EditTemplateDialog.vue
    │   │   ├── EditTemplatePermissionDialog.vue
    │   │   ├── EditTemplatePermissionForm.vue
    │   │   ├── EditViewsForm.vue
    │   │   ├── EnvironmentForm.vue
    │   │   ├── HashicorpVaultIcon.vue
    │   │   ├── IndeterminateProgressCircular.vue
    │   │   ├── IntegrationExtractValueForm.vue
    │   │   ├── IntegrationExtractorChildValueFormBase.js
    │   │   ├── IntegrationExtractorForm.vue
    │   │   ├── IntegrationExtractorFormBase.js
    │   │   ├── IntegrationExtractorRefsView.vue
    │   │   ├── IntegrationExtractorsBase.js
    │   │   ├── IntegrationForm.vue
    │   │   ├── IntegrationMatcherForm.vue
    │   │   ├── IntegrationRefsView.vue
    │   │   ├── InventoryForm.vue
    │   │   ├── InventorySelectForm.vue
    │   │   ├── ItemFormBase.js
    │   │   ├── ItemListPageBase.js
    │   │   ├── KeyForm.vue
    │   │   ├── KeyStoreMenu.vue
    │   │   ├── LineChart.vue
    │   │   ├── NewTaskDialog.vue
    │   │   ├── ObjectRefsDialog.vue
    │   │   ├── ObjectRefsView.vue
    │   │   ├── OpenTofuIcon.vue
    │   │   ├── PageBottomSheet.vue
    │   │   ├── PageMixin.js
    │   │   ├── PermissionsCheck.js
    │   │   ├── ProjectForm.vue
    │   │   ├── ProjectMixin.js
    │   │   ├── PulumiIcon.vue
    │   │   ├── RepositoryForm.vue
    │   │   ├── RestoreProjectForm.vue
    │   │   ├── RichEditor.vue
    │   │   ├── RunnerForm.vue
    │   │   ├── ScheduleForm.vue
    │   │   ├── SecretStorageForm.vue
    │   │   ├── SecretStorageSyncOptionsForm.vue
    │   │   ├── SingleLineEditable.vue
    │   │   ├── SubscriptionForm.vue
    │   │   ├── SubscriptionLabel.vue
    │   │   ├── SurveyVars.vue
    │   │   ├── SystemInfoDialog.vue
    │   │   ├── SystemSettingsDialog.vue
    │   │   ├── TableSettingsSheet.vue
    │   │   ├── TaskDetails.vue
    │   │   ├── TaskForm.vue
    │   │   ├── TaskLink.vue
    │   │   ├── TaskList.vue
    │   │   ├── TaskLogDialog.vue
    │   │   ├── TaskLogView.vue
    │   │   ├── TaskLogViewRecord.vue
    │   │   ├── TaskParamsAnsibleForm.vue
    │   │   ├── TaskParamsForm.vue
    │   │   ├── TaskParamsTerraformForm.vue
    │   │   ├── TaskStats.vue
    │   │   ├── TaskStatus.vue
    │   │   ├── TeamMemberForm.vue
    │   │   ├── TeamMenu.vue
    │   │   ├── TemplateForm.vue
    │   │   ├── TemplatePermissionsChips.vue
    │   │   ├── TemplateSelectForm.vue
    │   │   ├── TemplateVaults.vue
    │   │   ├── TerraformAliasForm.vue
    │   │   ├── TerraformInventoryForm.vue
    │   │   ├── TerraformStateView.vue
    │   │   ├── TerragruntIcon.vue
    │   │   ├── UserForm.vue
    │   │   ├── YesNoDialog.vue
    │   │   └── chartjs-adapter-day.js
    │   ├── event-bus.js
    │   ├── lang/
    │   │   ├── de.js
    │   │   ├── en.js
    │   │   ├── es.js
    │   │   ├── fr.js
    │   │   ├── index.js
    │   │   ├── it.js
    │   │   ├── ja.js
    │   │   ├── ko.js
    │   │   ├── nl.js
    │   │   ├── pl.js
    │   │   ├── pt.js
    │   │   ├── pt_br.js
    │   │   ├── ru.js
    │   │   ├── uk.js
    │   │   ├── zh_cn.js
    │   │   └── zh_tw.js
    │   ├── lib/
    │   │   ├── FakeWebSocket.js
    │   │   ├── Listenable.js
    │   │   ├── PubSub.js
    │   │   ├── Socket.js
    │   │   ├── api.js
    │   │   ├── constants.js
    │   │   ├── copyToClipboard.js
    │   │   ├── delay.js
    │   │   └── error.js
    │   ├── main.js
    │   ├── plugins/
    │   │   ├── i18.js
    │   │   └── vuetify.js
    │   ├── router/
    │   │   └── index.js
    │   ├── scss/
    │   │   └── variables.scss
    │   ├── socket.js
    │   └── views/
    │       ├── AcceptInvite.vue
    │       ├── Apps.vue
    │       ├── Auth.vue
    │       ├── Options.vue
    │       ├── Roles.vue
    │       ├── Runners.vue
    │       ├── Tasks.vue
    │       ├── Tokens.vue
    │       ├── Users.vue
    │       └── project/
    │           ├── Activity.vue
    │           ├── Environment.vue
    │           ├── History.vue
    │           ├── IntegrationExtractValue.vue
    │           ├── IntegrationExtractor.vue
    │           ├── IntegrationExtractorCrumb.vue
    │           ├── IntegrationMatcher.vue
    │           ├── Integrations.vue
    │           ├── IntegrationsBase.js
    │           ├── Inventory.vue
    │           ├── Invites.vue
    │           ├── Keys.vue
    │           ├── New.vue
    │           ├── Repositories.vue
    │           ├── RestoreProject.vue
    │           ├── Schedule.vue
    │           ├── SecretStorages.vue
    │           ├── Settings.vue
    │           ├── Stats.vue
    │           ├── Team.vue
    │           ├── TemplateView.vue
    │           ├── Templates.vue
    │           └── template/
    │               ├── TemplateDetails.vue
    │               ├── TemplatePerms.vue
    │               └── TemplateTerraformState.vue
    ├── tests/
    │   └── unit/
    │       ├── example.spec.js
    │       └── lib/
    │           ├── Listenable.spec.js
    │           ├── Socket.spec.js
    │           └── error.spec.js
    └── vue.config.js
Download .txt
Showing preview only (1,081K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (10498 symbols across 379 files)

FILE: .dredd/hooks/capabilities.go
  function capabilityWrapper (line 52) | func capabilityWrapper(cap string) func(t *trans.Transaction) {
  function addCapabilities (line 58) | func addCapabilities(caps []string) {
  function resolveCapability (line 66) | func resolveCapability(caps []string, resolved []string, uid string) {
  function alterRequestPath (line 210) | func alterRequestPath(t *trans.Transaction) {
  function alterRequestBody (line 226) | func alterRequestBody(t *trans.Transaction) {
  function bodyFieldProcessor (line 287) | func bodyFieldProcessor(id string, sub interface{}, request *map[string]...

FILE: .dredd/hooks/helpers.go
  function addTestRunnerUser (line 21) | func addTestRunnerUser() {
  function truncateAll (line 47) | func truncateAll() {
  function removeTestRunnerUser (line 98) | func removeTestRunnerUser(transactions []*transaction.Transaction) {
  function setupObjectsAndPaths (line 106) | func setupObjectsAndPaths(t *transaction.Transaction) {
  function addUserProjectRelation (line 112) | func addUserProjectRelation(pid int, user int) {
  function deleteUserProjectRelation (line 123) | func deleteUserProjectRelation(pid int, user int) {
  function addAccessKey (line 130) | func addAccessKey(pid *int) *db.AccessKey {
  function addProject (line 147) | func addProject() *db.Project {
  function addUser (line 168) | func addUser() *db.User {
  function addView (line 185) | func addView() *db.View {
  function addInvite (line 199) | func addInvite() *db.ProjectInvite {
  function addSchedule (line 228) | func addSchedule() *db.Schedule {
  function addTask (line 242) | func addTask() *db.Task {
  function addIntegration (line 265) | func addIntegration() *db.Integration {
  function addIntegrationExtractValue (line 278) | func addIntegrationExtractValue() *db.IntegrationExtractValue {
  function addIntegrationMatcher (line 296) | func addIntegrationMatcher() *db.IntegrationMatcher {
  function addToken (line 315) | func addToken(tok string, user int) {
  function getUUID (line 330) | func getUUID() string {
  function loadConfig (line 337) | func loadConfig() {
  function dbConnect (line 348) | func dbConnect() {
  function stringInSlice (line 354) | func stringInSlice(a string, list []string) (int, bool) {
  function printError (line 363) | func printError(err error) {

FILE: .dredd/hooks/main.go
  constant adminToken (line 12) | adminToken   = "h4a_i4qslpnxyyref71rk5nqbwxccrs7enwvggx0vfs="
  constant expiredToken (line 13) | expiredToken = "kwofd61g93-yuqvex8efmhjkgnbxlo8mp1tin6spyhu="
  function main (line 34) | func main() {

FILE: api/api_test.go
  function TestApiPing (line 10) | func TestApiPing(t *testing.T) {

FILE: api/apps.go
  function validateAppID (line 16) | func validateAppID(str string) error {
  function appMiddleware (line 20) | func appMiddleware(next http.Handler) http.Handler {
  function getApps (line 38) | func getApps(w http.ResponseWriter, r *http.Request) {
  function getApp (line 62) | func getApp(w http.ResponseWriter, r *http.Request) {
  function deleteApp (line 74) | func deleteApp(w http.ResponseWriter, r *http.Request) {
  function setAppOption (line 90) | func setAppOption(store db.Store, appID string, field string, val any) e...
  function setApp (line 113) | func setApp(w http.ResponseWriter, r *http.Request) {
  function setAppActive (line 158) | func setAppActive(w http.ResponseWriter, r *http.Request) {

FILE: api/apps_test.go
  function TestStructToMap (line 9) | func TestStructToMap(t *testing.T) {

FILE: api/auth.go
  function getSession (line 19) | func getSession(r *http.Request) (*db.Session, bool) {
  type totpRequestBody (line 65) | type totpRequestBody struct
  type totpRecoveryRequestBody (line 69) | type totpRecoveryRequestBody struct
  function recoverySession (line 95) | func recoverySession(w http.ResponseWriter, r *http.Request) {
  function verifySession (line 155) | func verifySession(w http.ResponseWriter, r *http.Request) {
  function authenticationHandler (line 211) | func authenticationHandler(w http.ResponseWriter, r *http.Request) (ok b...
  function authentication (line 276) | func authentication(next http.Handler) http.Handler {
  function authenticationWithStore (line 286) | func authenticationWithStore(next http.Handler) http.Handler {
  function adminMiddleware (line 302) | func adminMiddleware(next http.Handler) http.Handler {

FILE: api/cache.go
  function clearCache (line 11) | func clearCache(w http.ResponseWriter, r *http.Request) {

FILE: api/debug/gc.go
  function GC (line 8) | func GC(w http.ResponseWriter, r *http.Request) {

FILE: api/debug/pprof.go
  function Dump (line 15) | func Dump(w http.ResponseWriter, r *http.Request) {

FILE: api/events.go
  function getEvents (line 10) | func getEvents(w http.ResponseWriter, r *http.Request, limit int) {
  function getLastEvents (line 42) | func getLastEvents(w http.ResponseWriter, r *http.Request) {
  function getAllEvents (line 46) | func getAllEvents(w http.ResponseWriter, r *http.Request) {

FILE: api/helpers/context.go
  function GetFromContext (line 10) | func GetFromContext(r *http.Request, key string) any {
  function GetOkFromContext (line 14) | func GetOkFromContext(r *http.Request, key string) (res any, ok bool) {
  function SetContextValue (line 19) | func SetContextValue(r *http.Request, key string, value any) *http.Reque...
  function UserFromContext (line 25) | func UserFromContext(r *http.Request) *db.User {
  function GetGlobalRole (line 29) | func GetGlobalRole(r *http.Request) db.Role {

FILE: api/helpers/event_log.go
  type EventLogItem (line 10) | type EventLogItem struct
  type EventLogType (line 20) | type EventLogType
  constant EventLogCreate (line 23) | EventLogCreate EventLogType = "create"
  constant EventLogUpdate (line 24) | EventLogUpdate EventLogType = "update"
  constant EventLogDelete (line 25) | EventLogDelete EventLogType = "delete"
  function EventLog (line 28) | func EventLog(r *http.Request, action EventLogType, item EventLogItem) {

FILE: api/helpers/helpers.go
  function Store (line 11) | func Store(r *http.Request) db.Store {
  function isXHR (line 15) | func isXHR(w http.ResponseWriter, r *http.Request) bool {
  type H (line 21) | type H
  function Bind (line 24) | func Bind(w http.ResponseWriter, r *http.Request, out any) bool {

FILE: api/helpers/helpers_test.go
  function SetTestDelay (line 14) | func SetTestDelay(delay time.Duration) func() {
  function TestGetIntParam (line 26) | func TestGetIntParam(t *testing.T) {
  function mockParam (line 39) | func mockParam(w http.ResponseWriter, r *http.Request) {

FILE: api/helpers/query_params.go
  function QueryParamsForProps (line 10) | func QueryParamsForProps(url *url.URL, props db.ObjectProps) (params db....
  function QueryParams (line 28) | func QueryParams(url *url.URL) db.RetrieveQueryParams {
  function QueryParamsWithOwner (line 35) | func QueryParamsWithOwner(url *url.URL, props db.ObjectProps) db.Retriev...

FILE: api/helpers/route_params.go
  function GetStrParam (line 13) | func GetStrParam(name string, w http.ResponseWriter, r *http.Request) (s...
  function HasParam (line 29) | func HasParam(name string, r *http.Request) bool {
  function GetIntParam (line 36) | func GetIntParam(name string, w http.ResponseWriter, r *http.Request) (i...

FILE: api/helpers/write_response.go
  function WriteJSON (line 15) | func WriteJSON(w http.ResponseWriter, code int, out any) {
  function WriteErrorStatus (line 29) | func WriteErrorStatus(w http.ResponseWriter, err string, code int) {
  function WriteError (line 35) | func WriteError(w http.ResponseWriter, err error) {

FILE: api/integration.go
  function isValidHmacPayload (line 25) | func isValidHmacPayload(secret, headerHash string, payload []byte, prefi...
  function hmacHashPayload (line 43) | func hmacHashPayload(secret string, payloadBody []byte) string {
  type IntegrationController (line 50) | type IntegrationController struct
    method ReceiveIntegration (line 60) | func (c *IntegrationController) ReceiveIntegration(w http.ResponseWrit...
  function NewIntegrationController (line 54) | func NewIntegrationController(integrationService server.IntegrationServi...
  function Match (line 232) | func Match(matcher db.IntegrationMatcher, header http.Header, bodyBytes ...
  function MatchCompare (line 252) | func MatchCompare(value any, method db.IntegrationMatchMethodType, expec...
  function GetTaskDefinition (line 272) | func GetTaskDefinition(
  function RunIntegration (line 341) | func RunIntegration(integration db.Integration, project db.Project, r *h...
  function Extract (line 377) | func Extract(extractValues []db.IntegrationExtractValue, h http.Header, ...

FILE: api/integration_test.go
  function TestExtract_HeaderAndCaseInsensitive (line 16) | func TestExtract_HeaderAndCaseInsensitive(t *testing.T) {
  function TestExtract_JSONBody_VariousTypesAndMissing (line 35) | func TestExtract_JSONBody_VariousTypesAndMissing(t *testing.T) {
  function TestExtract_BodyString_ReturnsFullPayload (line 128) | func TestExtract_BodyString_ReturnsFullPayload(t *testing.T) {
  function TestExtract_MalformedJSON_SkipsSetting (line 144) | func TestExtract_MalformedJSON_SkipsSetting(t *testing.T) {
  function TestIntegrationMatch (line 160) | func TestIntegrationMatch(t *testing.T) {
  function TestGetTaskDefinitionSuccess (line 177) | func TestGetTaskDefinitionSuccess(t *testing.T) {
  function TestGetTaskDefinitionExtractorError (line 251) | func TestGetTaskDefinitionExtractorError(t *testing.T) {
  function TestGetTaskDefinitionInvalidEnvironmentJSON (line 275) | func TestGetTaskDefinitionInvalidEnvironmentJSON(t *testing.T) {
  function TestGetTaskDefinitionIntegrationWithoutTaskParams (line 297) | func TestGetTaskDefinitionIntegrationWithoutTaskParams(t *testing.T) {
  function TestGetTaskDefinitionWithExtractedEnvValues (line 339) | func TestGetTaskDefinitionWithExtractedEnvValues(t *testing.T) {
  function TestExtractBodyAndHeaderValues (line 523) | func TestExtractBodyAndHeaderValues(t *testing.T) {

FILE: api/login.go
  function convertEntryToMap (line 34) | func convertEntryToMap(entity *ldap.Entry) map[string]any {
  function tryFindLDAPUser (line 46) | func tryFindLDAPUser(username, password string) (*db.User, error) {
  function createSession (line 153) | func createSession(w http.ResponseWriter, r *http.Request, user db.User,...
  function loginByPassword (line 207) | func loginByPassword(store db.Store, login string, password string) (use...
  function loginByLDAP (line 227) | func loginByLDAP(store db.Store, ldapUser db.User) (user db.User, err er...
  type loginMetadataOidcProvider (line 246) | type loginMetadataOidcProvider struct
  type LoginTotpAuthMethod (line 253) | type LoginTotpAuthMethod struct
  type LoginEmailAuthMethod (line 257) | type LoginEmailAuthMethod struct
  type LoginAuthMethods (line 260) | type LoginAuthMethods struct
  type loginMetadata (line 265) | type loginMetadata struct
  function login (line 272) | func login(w http.ResponseWriter, r *http.Request) {
  function logout (line 381) | func logout(w http.ResponseWriter, r *http.Request) {
  function getOidcProvider (line 402) | func getOidcProvider(id string, ctx context.Context, redirectPath string...
  function oidcLogin (line 481) | func oidcLogin(w http.ResponseWriter, r *http.Request) {
  type oAuthState (line 516) | type oAuthState struct
  function generateStateOauthCookie (line 521) | func generateStateOauthCookie(w http.ResponseWriter, returnPath string) ...
  type claimResult (line 554) | type claimResult struct
  function parseClaim (line 560) | func parseClaim(str string, claims map[string]any) (string, bool) {
  function prepareClaims (line 594) | func prepareClaims(claims map[string]any) {
  function parseClaims (line 613) | func parseClaims(claims map[string]any, provider util.ClaimsProvider) (r...
  function claimOidcUserInfo (line 635) | func claimOidcUserInfo(userInfo *oidc.UserInfo, provider util.OidcProvid...
  function claimOidcToken (line 646) | func claimOidcToken(idToken *oidc.IDToken, provider util.OidcProvider) (...
  function getRandomUsername (line 657) | func getRandomUsername() string {
  function getRandomProfileName (line 661) | func getRandomProfileName() string {
  function getSecretFromFile (line 665) | func getSecretFromFile(source string) (string, error) {
  function oidcRedirect (line 674) | func oidcRedirect(w http.ResponseWriter, r *http.Request) {

FILE: api/login_test.go
  function TestParseClaim (line 14) | func TestParseClaim(t *testing.T) {
  function TestParseClaim2 (line 27) | func TestParseClaim2(t *testing.T) {
  function TestParseClaim3 (line 40) | func TestParseClaim3(t *testing.T) {
  function TestParseClaim4 (line 52) | func TestParseClaim4(t *testing.T) {
  function TestParseClaim5 (line 64) | func TestParseClaim5(t *testing.T) {
  function TestGenerateStateOauthCookie (line 79) | func TestGenerateStateOauthCookie(t *testing.T) {
  function TestGenerateStateOauthCookieEmptyReturnPath (line 133) | func TestGenerateStateOauthCookieEmptyReturnPath(t *testing.T) {
  function TestGenerateStateOauthCookieUniqueness (line 151) | func TestGenerateStateOauthCookieUniqueness(t *testing.T) {

FILE: api/options.go
  function setOption (line 9) | func setOption(w http.ResponseWriter, r *http.Request) {
  function getOptions (line 35) | func getOptions(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/backup_restore.go
  function GetBackup (line 14) | func GetBackup(w http.ResponseWriter, r *http.Request) {
  function Restore (line 37) | func Restore(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/environment.go
  type EnvironmentController (line 14) | type EnvironmentController struct
    method updateEnvironmentSecrets (line 35) | func (c *EnvironmentController) updateEnvironmentSecrets(env db.Enviro...
    method EnvironmentMiddleware (line 130) | func (c *EnvironmentController) EnvironmentMiddleware(next http.Handle...
    method UpdateEnvironment (line 189) | func (c *EnvironmentController) UpdateEnvironment(w http.ResponseWrite...
    method AddEnvironment (line 232) | func (c *EnvironmentController) AddEnvironment(w http.ResponseWriter, ...
    method RemoveEnvironment (line 278) | func (c *EnvironmentController) RemoveEnvironment(w http.ResponseWrite...
  function NewEnvironmentController (line 21) | func NewEnvironmentController(
  function GetEnvironmentRefs (line 156) | func GetEnvironmentRefs(w http.ResponseWriter, r *http.Request) {
  function GetEnvironment (line 168) | func GetEnvironment(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/integration.go
  function IntegrationMiddleware (line 13) | func IntegrationMiddleware(next http.Handler) http.Handler {
  function GetIntegration (line 37) | func GetIntegration(w http.ResponseWriter, r *http.Request) {
  function GetIntegrations (line 42) | func GetIntegrations(w http.ResponseWriter, r *http.Request) {
  function GetIntegrationRefs (line 54) | func GetIntegrationRefs(w http.ResponseWriter, r *http.Request) {
  function AddIntegration (line 80) | func AddIntegration(w http.ResponseWriter, r *http.Request) {
  function UpdateIntegration (line 122) | func UpdateIntegration(w http.ResponseWriter, r *http.Request) {
  function DeleteIntegration (line 154) | func DeleteIntegration(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/integration_alias.go
  type publicAlias (line 11) | type publicAlias struct
  function getPublicAlias (line 16) | func getPublicAlias(alias db.IntegrationAlias) publicAlias {
  function getPublicAliases (line 24) | func getPublicAliases(aliases []db.IntegrationAlias) (res []publicAlias) {
  function GetIntegrationAlias (line 34) | func GetIntegrationAlias(w http.ResponseWriter, r *http.Request) {
  function AddIntegrationAlias (line 53) | func AddIntegrationAlias(w http.ResponseWriter, r *http.Request) {
  function RemoveIntegrationAlias (line 76) | func RemoveIntegrationAlias(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/integration_extract_value.go
  function GetIntegrationExtractValue (line 12) | func GetIntegrationExtractValue(w http.ResponseWriter, r *http.Request) {
  function GetIntegrationExtractValues (line 37) | func GetIntegrationExtractValues(w http.ResponseWriter, r *http.Request) {
  function AddIntegrationExtractValue (line 50) | func AddIntegrationExtractValue(w http.ResponseWriter, r *http.Request) {
  function UpdateIntegrationExtractValue (line 84) | func UpdateIntegrationExtractValue(w http.ResponseWriter, r *http.Reques...
  function GetIntegrationExtractValueRefs (line 123) | func GetIntegrationExtractValueRefs(w http.ResponseWriter, r *http.Reque...
  function DeleteIntegrationExtractValue (line 150) | func DeleteIntegrationExtractValue(w http.ResponseWriter, r *http.Reques...

FILE: api/projects/integration_matcher.go
  function GetIntegrationMatcher (line 13) | func GetIntegrationMatcher(w http.ResponseWriter, r *http.Request) {
  function GetIntegrationMatcherRefs (line 35) | func GetIntegrationMatcherRefs(w http.ResponseWriter, r *http.Request) {
  function GetIntegrationMatchers (line 62) | func GetIntegrationMatchers(w http.ResponseWriter, r *http.Request) {
  function AddIntegrationMatcher (line 76) | func AddIntegrationMatcher(w http.ResponseWriter, r *http.Request) {
  function UpdateIntegrationMatcher (line 111) | func UpdateIntegrationMatcher(w http.ResponseWriter, r *http.Request) {
  function DeleteIntegrationMatcher (line 142) | func DeleteIntegrationMatcher(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/inventory.go
  function InventoryMiddleware (line 17) | func InventoryMiddleware(next http.Handler) http.Handler {
  function GetInventoryRefs (line 37) | func GetInventoryRefs(w http.ResponseWriter, r *http.Request) {
  function GetInventory (line 49) | func GetInventory(w http.ResponseWriter, r *http.Request) {
  function AddInventory (line 78) | func AddInventory(w http.ResponseWriter, r *http.Request) {
  function IsValidInventoryPath (line 133) | func IsValidInventoryPath(path string) bool {
  function UpdateInventory (line 154) | func UpdateInventory(w http.ResponseWriter, r *http.Request) {
  function RemoveInventory (line 214) | func RemoveInventory(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/inventory_test.go
  function TestIsValidInventoryPath (line 8) | func TestIsValidInventoryPath(t *testing.T) {

FILE: api/projects/keys.go
  type KeyController (line 14) | type KeyController struct
    method AddKey (line 80) | func (c *KeyController) AddKey(w http.ResponseWriter, r *http.Request) {
    method UpdateKey (line 133) | func (c *KeyController) UpdateKey(w http.ResponseWriter, r *http.Reque...
    method RemoveKey (line 180) | func (c *KeyController) RemoveKey(w http.ResponseWriter, r *http.Reque...
  function NewKeyController (line 18) | func NewKeyController(
  function KeyMiddleware (line 27) | func KeyMiddleware(next http.Handler) http.Handler {
  function GetKeyRefs (line 47) | func GetKeyRefs(w http.ResponseWriter, r *http.Request) {
  function GetKeys (line 59) | func GetKeys(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/project.go
  function ProjectMiddleware (line 17) | func ProjectMiddleware(next http.Handler) http.Handler {
  function GetMustCanMiddleware (line 84) | func GetMustCanMiddleware(permissions db.ProjectUserPermission) mux.Midd...
  type ProjectController (line 103) | type ProjectController struct
    method SendTestNotification (line 108) | func (c *ProjectController) SendTestNotification(w http.ResponseWriter...
    method UpdateProject (line 126) | func (c *ProjectController) UpdateProject(w http.ResponseWriter, r *ht...
    method DeleteProject (line 152) | func (c *ProjectController) DeleteProject(w http.ResponseWriter, r *ht...
  function GetProject (line 171) | func GetProject(w http.ResponseWriter, r *http.Request) {
  function GetUserRole (line 175) | func GetUserRole(w http.ResponseWriter, r *http.Request) {
  function ClearCache (line 185) | func ClearCache(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/projects.go
  type ProjectsController (line 14) | type ProjectsController struct
    method createDemoProject (line 46) | func (c *ProjectsController) createDemoProject(projectID int, noneKeyI...
    method AddProject (line 312) | func (c *ProjectsController) AddProject(w http.ResponseWriter, r *http...
  function NewProjectsController (line 18) | func NewProjectsController(
  function GetProjects (line 27) | func GetProjects(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/repository.go
  function RepositoryMiddleware (line 14) | func RepositoryMiddleware(next http.Handler) http.Handler {
  function GetRepositoryRefs (line 34) | func GetRepositoryRefs(w http.ResponseWriter, r *http.Request) {
  type RepositoryController (line 45) | type RepositoryController struct
    method GetRepositoryBranches (line 55) | func (c *RepositoryController) GetRepositoryBranches(w http.ResponseWr...
  function NewRepositoryController (line 49) | func NewRepositoryController(keyInstaller db_lib.AccessKeyInstaller) *Re...
  function GetRepositories (line 79) | func GetRepositories(w http.ResponseWriter, r *http.Request) {
  function AddRepository (line 100) | func AddRepository(w http.ResponseWriter, r *http.Request) {
  function UpdateRepository (line 139) | func UpdateRepository(w http.ResponseWriter, r *http.Request) {
  function RemoveRepository (line 187) | func RemoveRepository(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/schedules.go
  function SchedulesMiddleware (line 14) | func SchedulesMiddleware(next http.Handler) http.Handler {
  function refreshSchedulePool (line 34) | func refreshSchedulePool(r *http.Request) {
  function GetSchedule (line 40) | func GetSchedule(w http.ResponseWriter, r *http.Request) {
  function GetProjectSchedules (line 45) | func GetProjectSchedules(w http.ResponseWriter, r *http.Request) {
  function GetTemplateSchedules (line 56) | func GetTemplateSchedules(w http.ResponseWriter, r *http.Request) {
  function validateCronFormat (line 75) | func validateCronFormat(cronFormat string, w http.ResponseWriter) bool {
  function validateSchedulePayload (line 86) | func validateSchedulePayload(schedule *db.Schedule, w http.ResponseWrite...
  function ValidateScheduleCronFormat (line 120) | func ValidateScheduleCronFormat(w http.ResponseWriter, r *http.Request) {
  function AddSchedule (line 130) | func AddSchedule(w http.ResponseWriter, r *http.Request) {
  function UpdateSchedule (line 163) | func UpdateSchedule(w http.ResponseWriter, r *http.Request) {
  function SetScheduleActive (line 210) | func SetScheduleActive(w http.ResponseWriter, r *http.Request) {
  function RemoveSchedule (line 241) | func RemoveSchedule(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/secret_storages.go
  type SecretStorageController (line 12) | type SecretStorageController struct
    method GetRefs (line 69) | func (c *SecretStorageController) GetRefs(w http.ResponseWriter, r *ht...
    method GetSecretStorages (line 80) | func (c *SecretStorageController) GetSecretStorages(w http.ResponseWri...
    method GetSecretStorage (line 90) | func (c *SecretStorageController) GetSecretStorage(w http.ResponseWrit...
    method Update (line 96) | func (c *SecretStorageController) Update(w http.ResponseWriter, r *htt...
    method Add (line 135) | func (c *SecretStorageController) Add(w http.ResponseWriter, r *http.R...
    method Remove (line 168) | func (c *SecretStorageController) Remove(w http.ResponseWriter, r *htt...
    method SyncSecrets (line 185) | func (c *SecretStorageController) SyncSecrets(w http.ResponseWriter, r...
  function SecretStorageMiddleware (line 17) | func SecretStorageMiddleware(next http.Handler) http.Handler {
  function NewSecretStorageController (line 58) | func NewSecretStorageController(

FILE: api/projects/tasks.go
  type TaskController (line 19) | type TaskController struct
    method GetAnsibleTaskHosts (line 179) | func (c *TaskController) GetAnsibleTaskHosts(w http.ResponseWriter, r ...
    method GetAnsibleTaskErrors (line 191) | func (c *TaskController) GetAnsibleTaskErrors(w http.ResponseWriter, r...
    method StopAllTasks (line 441) | func (c *TaskController) StopAllTasks(w http.ResponseWriter, r *http.R...
  function NewTaskController (line 23) | func NewTaskController(ansibleTaskRepo db.AnsibleTaskRepository) *TaskCo...
  function taskPool (line 29) | func taskPool(r *http.Request) *tasks.TaskPool {
  function AddTask (line 34) | func AddTask(w http.ResponseWriter, r *http.Request) {
  function GetTasksList (line 73) | func GetTasksList(w http.ResponseWriter, r *http.Request, limit int) {
  function GetAllTasks (line 100) | func GetAllTasks(w http.ResponseWriter, r *http.Request) {
  function GetLastTasks (line 105) | func GetLastTasks(w http.ResponseWriter, r *http.Request) {
  function GetTask (line 115) | func GetTask(w http.ResponseWriter, r *http.Request) {
  function GetTaskPermissionsMiddleware (line 120) | func GetTaskPermissionsMiddleware(next http.Handler) http.Handler {
  function GetTaskMiddleware (line 141) | func GetTaskMiddleware(next http.Handler) http.Handler {
  function NewTaskMiddleware (line 165) | func NewTaskMiddleware(next http.Handler) http.Handler {
  function GetTaskStages (line 204) | func GetTaskStages(w http.ResponseWriter, r *http.Request) {
  function GetTaskOutput (line 232) | func GetTaskOutput(w http.ResponseWriter, r *http.Request) {
  function outputToBytes (line 248) | func outputToBytes(lines []db.TaskOutput) []byte {
  function GetTaskRawOutput (line 258) | func GetTaskRawOutput(w http.ResponseWriter, r *http.Request) {
  function ConfirmTask (line 300) | func ConfirmTask(w http.ResponseWriter, r *http.Request) {
  function RejectTask (line 318) | func RejectTask(w http.ResponseWriter, r *http.Request) {
  function StopTask (line 336) | func StopTask(w http.ResponseWriter, r *http.Request) {
  function RemoveTask (line 363) | func RemoveTask(w http.ResponseWriter, r *http.Request) {
  function GetTaskStats (line 393) | func GetTaskStats(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/templates.go
  function TemplatesMiddleware (line 14) | func TemplatesMiddleware(next http.Handler) http.Handler {
  type TemplateController (line 34) | type TemplateController struct
    method GetTemplatePerms (line 347) | func (c *TemplateController) GetTemplatePerms(w http.ResponseWriter, r...
    method AddTemplatePerm (line 360) | func (c *TemplateController) AddTemplatePerm(w http.ResponseWriter, r ...
    method UpdateTemplatePerm (line 380) | func (c *TemplateController) UpdateTemplatePerm(w http.ResponseWriter,...
    method DeleteTemplatePerm (line 405) | func (c *TemplateController) DeleteTemplatePerm(w http.ResponseWriter,...
    method GetTemplatePerm (line 421) | func (c *TemplateController) GetTemplatePerm(w http.ResponseWriter, r ...
  function NewTemplateController (line 39) | func NewTemplateController(
  function GetTemplate (line 50) | func GetTemplate(w http.ResponseWriter, r *http.Request) {
  function GetTemplateRefs (line 60) | func GetTemplateRefs(w http.ResponseWriter, r *http.Request) {
  function GetTemplates (line 72) | func GetTemplates(w http.ResponseWriter, r *http.Request) {
  function AddTemplate (line 91) | func AddTemplate(w http.ResponseWriter, r *http.Request) {
  function UpdateTemplateDescription (line 172) | func UpdateTemplateDescription(w http.ResponseWriter, r *http.Request) {
  function UpdateTemplate (line 201) | func UpdateTemplate(w http.ResponseWriter, r *http.Request) {
  function RemoveTemplate (line 260) | func RemoveTemplate(w http.ResponseWriter, r *http.Request) {
  function SetTemplateInventory (line 280) | func SetTemplateInventory(w http.ResponseWriter, r *http.Request) {
  function AttachInventory (line 304) | func AttachInventory(w http.ResponseWriter, r *http.Request) {
  function DetachInventory (line 328) | func DetachInventory(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/users.go
  function UserMiddleware (line 12) | func UserMiddleware(next http.Handler) http.Handler {
  type projUser (line 39) | type projUser struct
  function GetUsers (line 47) | func GetUsers(w http.ResponseWriter, r *http.Request) {
  function AddUser (line 78) | func AddUser(w http.ResponseWriter, r *http.Request) {
  function removeUser (line 120) | func removeUser(targetUser db.User, w http.ResponseWriter, r *http.Reque...
  function LeftProject (line 149) | func LeftProject(w http.ResponseWriter, r *http.Request) {
  function RemoveUser (line 155) | func RemoveUser(w http.ResponseWriter, r *http.Request) {
  function UpdateUser (line 160) | func UpdateUser(w http.ResponseWriter, r *http.Request) {

FILE: api/projects/views.go
  function ViewMiddleware (line 12) | func ViewMiddleware(next http.Handler) http.Handler {
  function GetViewTemplates (line 32) | func GetViewTemplates(w http.ResponseWriter, r *http.Request) {
  function GetViews (line 48) | func GetViews(w http.ResponseWriter, r *http.Request) {
  function AddView (line 69) | func AddView(w http.ResponseWriter, r *http.Request) {
  function SetViewPositions (line 109) | func SetViewPositions(w http.ResponseWriter, r *http.Request) {
  function UpdateView (line 130) | func UpdateView(w http.ResponseWriter, r *http.Request) {
  function RemoveView (line 169) | func RemoveView(w http.ResponseWriter, r *http.Request) {

FILE: api/router.go
  function StoreMiddleware (line 41) | func StoreMiddleware(next http.Handler) http.Handler {
  function JSONMiddleware (line 53) | func JSONMiddleware(next http.Handler) http.Handler {
  function plainTextMiddleware (line 61) | func plainTextMiddleware(next http.Handler) http.Handler {
  function pongHandler (line 68) | func pongHandler(w http.ResponseWriter, r *http.Request) {
  function DelayMiddleware (line 74) | func DelayMiddleware(delay time.Duration) func(http.Handler) http.Handler {
  function Route (line 84) | func Route(
  function debugPrintRoutes (line 525) | func debugPrintRoutes(r *mux.Router) {
  function servePublic (line 556) | func servePublic(w http.ResponseWriter, r *http.Request) {
  function serveFile (line 595) | func serveFile(w http.ResponseWriter, r *http.Request, name string) {

FILE: api/runners.go
  function getAllRunners (line 13) | func getAllRunners(w http.ResponseWriter, r *http.Request) {
  type runnerWithToken (line 27) | type runnerWithToken struct
  function addGlobalRunner (line 33) | func addGlobalRunner(w http.ResponseWriter, r *http.Request) {
  function globalRunnerMiddleware (line 79) | func globalRunnerMiddleware(next http.Handler) http.Handler {
  function getGlobalRunner (line 106) | func getGlobalRunner(w http.ResponseWriter, r *http.Request) {
  function updateGlobalRunner (line 112) | func updateGlobalRunner(w http.ResponseWriter, r *http.Request) {
  function clearGlobalRunnerCache (line 135) | func clearGlobalRunnerCache(w http.ResponseWriter, r *http.Request) {
  function deleteGlobalRunner (line 150) | func deleteGlobalRunner(w http.ResponseWriter, r *http.Request) {
  function setGlobalRunnerActive (line 165) | func setGlobalRunnerActive(w http.ResponseWriter, r *http.Request) {

FILE: api/runners/runners.go
  function RunnerMiddleware (line 23) | func RunnerMiddleware(next http.Handler) http.Handler {
  function loadPublicKey (line 58) | func loadPublicKey(keyData []byte) (*rsa.PublicKey, error) {
  function chunkRSAEncrypt (line 70) | func chunkRSAEncrypt(pub *rsa.PublicKey, plaintext []byte) ([]byte, erro...
  type RunnerController (line 97) | type RunnerController struct
    method GetRunner (line 111) | func (c *RunnerController) GetRunner(w http.ResponseWriter, r *http.Re...
    method UpdateRunner (line 240) | func (c *RunnerController) UpdateRunner(w http.ResponseWriter, r *http...
  function NewRunnerController (line 103) | func NewRunnerController(runnerRepo db.RunnerManager, taskPool *tasks.Ta...
  function RegisterRunner (line 291) | func RegisterRunner(w http.ResponseWriter, r *http.Request) {
  function UnregisterRunner (line 335) | func UnregisterRunner(w http.ResponseWriter, r *http.Request) {

FILE: api/sockets/handler.go
  constant writeWait (line 25) | writeWait = 2 * 10 * time.Second
  constant pongWait (line 28) | pongWait = 2 * 60 * time.Second
  constant pingPeriod (line 31) | pingPeriod = (pongWait * 9) / 10
  constant maxMessageSize (line 34) | maxMessageSize = 512
  constant connectionChannelSize (line 38) | connectionChannelSize = 256
  type connection (line 41) | type connection struct
    method log (line 47) | func (c *connection) log(level log.Level, err error, msg string) {
    method logError (line 54) | func (c *connection) logError(err error, msg string) {
    method logWarn (line 58) | func (c *connection) logWarn(err error, msg string) {
    method logDebug (line 62) | func (c *connection) logDebug(err error, msg string) {
    method readPump (line 67) | func (c *connection) readPump() {
    method write (line 103) | func (c *connection) write(mt int, payload []byte) error {
    method writePump (line 115) | func (c *connection) writePump() {
  function Handler (line 150) | func Handler(w http.ResponseWriter, r *http.Request) {
  function Message (line 183) | func Message(userID int, message []byte) {

FILE: api/sockets/pool.go
  type Broadcaster (line 8) | type Broadcaster interface
  function SetBroadcaster (line 23) | func SetBroadcaster(b Broadcaster) {
  type hub (line 29) | type hub struct
    method run (line 55) | func (h *hub) run() {
  type sendRequest (line 43) | type sendRequest struct
  function StartWS (line 90) | func StartWS() {
  function LocalBroadcast (line 97) | func LocalBroadcast(userID int, message []byte) {

FILE: api/system_info.go
  type SystemInfoController (line 15) | type SystemInfoController struct
    method GetSystemInfo (line 25) | func (c *SystemInfoController) GetSystemInfo(w http.ResponseWriter, r ...
  function NewSystemInfoController (line 19) | func NewSystemInfoController(subscriptionService pro_interfaces.Subscrip...

FILE: api/tasks/tasks.go
  function TaskMiddleware (line 13) | func TaskMiddleware(next http.Handler) http.Handler {
  type taskLocation (line 25) | type taskLocation
  constant taskQueue (line 28) | taskQueue   taskLocation = "queue"
  constant taskRunning (line 29) | taskRunning taskLocation = "running"
  type taskRes (line 32) | type taskRes struct
  function GetTasks (line 43) | func GetTasks(w http.ResponseWriter, r *http.Request) {
  function DeleteTask (line 73) | func DeleteTask(w http.ResponseWriter, r *http.Request) {

FILE: api/user.go
  type UserController (line 17) | type UserController struct
    method GetUser (line 27) | func (c *UserController) GetUser(w http.ResponseWriter, r *http.Reques...
  function NewUserController (line 21) | func NewUserController(subscriptionService pro_interfaces.SubscriptionSe...
  function getAPITokens (line 48) | func getAPITokens(w http.ResponseWriter, r *http.Request) {
  function createAPIToken (line 67) | func createAPIToken(w http.ResponseWriter, r *http.Request) {
  function deleteAPIToken (line 86) | func deleteAPIToken(w http.ResponseWriter, r *http.Request) {

FILE: api/users.go
  type UsersController (line 18) | type UsersController struct
    method GetUsers (line 34) | func (c *UsersController) GetUsers(w http.ResponseWriter, r *http.Requ...
    method AddUser (line 61) | func (c *UsersController) AddUser(w http.ResponseWriter, r *http.Reque...
    method UpdateUser (line 164) | func (c *UsersController) UpdateUser(w http.ResponseWriter, r *http.Re...
  function NewUsersController (line 22) | func NewUsersController(subscriptionService pro_interfaces.SubscriptionS...
  type minimalUser (line 28) | type minimalUser struct
  function readonlyUserMiddleware (line 106) | func readonlyUserMiddleware(next http.Handler) http.Handler {
  function getUserMiddleware (line 136) | func getUserMiddleware(next http.Handler) http.Handler {
  function updateUserPassword (line 222) | func updateUserPassword(w http.ResponseWriter, r *http.Request) {
  function deleteUser (line 255) | func deleteUser(w http.ResponseWriter, r *http.Request) {
  function totpQr (line 272) | func totpQr(w http.ResponseWriter, r *http.Request) {
  function enableTotp (line 304) | func enableTotp(w http.ResponseWriter, r *http.Request) {
  function disableTotp (line 348) | func disableTotp(w http.ResponseWriter, r *http.Request) {

FILE: cli/cmd/migrate.go
  function init (line 24) | func init() {
  function migrateBoltDb (line 65) | func migrateBoltDb(boltDbPath string) {

FILE: cli/cmd/project.go
  function init (line 9) | func init() {

FILE: cli/cmd/project_export.go
  type projectExportArgs (line 12) | type projectExportArgs struct
  function init (line 20) | func init() {

FILE: cli/cmd/project_import.go
  type projectImportArgs (line 18) | type projectImportArgs struct
  function init (line 26) | func init() {
  function resolveImportUser (line 120) | func resolveImportUser(store db.Store) (res db.User, err error) {
  function importProjectFromFile (line 144) | func importProjectFromFile(path string, projectName string, user db.User...

FILE: cli/cmd/root.go
  function Execute (line 64) | func Execute() {
  function runService (line 74) | func runService() {
  function createStoreWithMigrationVersion (line 264) | func createStoreWithMigrationVersion(token string, undoTo *string, apply...
  function createStore (line 293) | func createStore(token string) db.Store {

FILE: cli/cmd/runner.go
  function createRunnerJobPool (line 10) | func createRunnerJobPool() *runners.JobPool {
  function init (line 14) | func init() {

FILE: cli/cmd/runner_register.go
  function init (line 16) | func init() {
  function initRunnerRegistrationToken (line 21) | func initRunnerRegistrationToken() {
  function registerRunner (line 38) | func registerRunner() {

FILE: cli/cmd/runner_setup.go
  function init (line 10) | func init() {
  function doRunnerSetup (line 23) | func doRunnerSetup() int {

FILE: cli/cmd/runner_start.go
  function init (line 14) | func init() {
  function runRunner (line 19) | func runRunner() {

FILE: cli/cmd/runner_unregister.go
  function init (line 8) | func init() {
  function unregisterRunner (line 12) | func unregisterRunner() {

FILE: cli/cmd/server.go
  function init (line 9) | func init() {
  function cropTrailingSlashMiddleware (line 22) | func cropTrailingSlashMiddleware(next http.Handler) http.Handler {

FILE: cli/cmd/setup.go
  function init (line 16) | func init() {
  function doSetup (line 29) | func doSetup() int {
  function readNewline (line 85) | func readNewline(pre string, stdin *bufio.Reader) string {

FILE: cli/cmd/syslog.go
  function initSyslog (line 22) | func initSyslog(conf *util.SyslogConfig) {
  type rfc5424Hook (line 47) | type rfc5424Hook struct
    method Levels (line 91) | func (h *rfc5424Hook) Levels() []log.Level {
    method Fire (line 95) | func (h *rfc5424Hook) Fire(entry *log.Entry) error {
  function newRFC5424Hook (line 54) | func newRFC5424Hook(network, address, tag string) (*rfc5424Hook, error) {
  function escapeSDValue (line 128) | func escapeSDValue(v string) string {

FILE: cli/cmd/syslog_windows.go
  function initSyslog (line 12) | func initSyslog(conf *util.SyslogConfig) {

FILE: cli/cmd/user.go
  type userArgs (line 9) | type userArgs struct
  function init (line 21) | func init() {

FILE: cli/cmd/user_add.go
  function init (line 10) | func init() {

FILE: cli/cmd/user_change.go
  function init (line 10) | func init() {
  function applyChangeUserArgsForUser (line 21) | func applyChangeUserArgsForUser(user db.User, store db.Store) {

FILE: cli/cmd/user_delete.go
  function init (line 9) | func init() {

FILE: cli/cmd/user_get.go
  function init (line 11) | func init() {

FILE: cli/cmd/user_list.go
  function init (line 9) | func init() {

FILE: cli/cmd/user_totp.go
  function init (line 12) | func init() {

FILE: cli/cmd/vault.go
  type vaultArgs (line 9) | type vaultArgs struct
  function init (line 15) | func init() {

FILE: cli/cmd/vault_rekey.go
  function init (line 7) | func init() {

FILE: cli/cmd/version.go
  function init (line 10) | func init() {

FILE: cli/main.go
  function main (line 7) | func main() {

FILE: cli/setup/setup.go
  constant interactiveSetupBlurb (line 14) | interactiveSetupBlurb = `
  function InteractiveRunnerSetup (line 24) | func InteractiveRunnerSetup(conf *util.ConfigType) {
  function InteractiveSetup (line 111) | func InteractiveSetup(conf *util.ConfigType) {
  function scanBoltDb (line 189) | func scanBoltDb(conf *util.ConfigType) {
  function scanSQLite (line 193) | func scanSQLite(conf *util.ConfigType) {
  function scanMySQL (line 197) | func scanMySQL(conf *util.ConfigType) {
  function scanPostgres (line 205) | func scanPostgres(conf *util.ConfigType) {
  function scanFileDB (line 219) | func scanFileDB(defaultDbFile string) *util.DbConfig {
  function scanErrorChecker (line 230) | func scanErrorChecker(n int, err error) {
  type IConfig (line 236) | type IConfig interface
  function SaveConfig (line 240) | func SaveConfig(config IConfig, defaultFilename string, requiredConfigPa...
  function askValue (line 289) | func askValue(prompt string, defaultValue string, item any) {
  function askConfirmation (line 306) | func askConfirmation(prompt string, defaultValue bool, item *bool) {

FILE: db/APIToken.go
  type APIToken (line 6) | type APIToken struct

FILE: db/AccessKey.go
  type AccessKeyType (line 7) | type AccessKeyType
  type AccessKeyOwner (line 8) | type AccessKeyOwner
  type AccessKeySourceStorageType (line 10) | type AccessKeySourceStorageType
  constant AccessKeySSH (line 13) | AccessKeySSH           AccessKeyType = "ssh"
  constant AccessKeyNone (line 14) | AccessKeyNone          AccessKeyType = "none"
  constant AccessKeyLoginPassword (line 15) | AccessKeyLoginPassword AccessKeyType = "login_password"
  constant AccessKeyString (line 16) | AccessKeyString        AccessKeyType = "string"
  constant AccessKeyEnvironment (line 19) | AccessKeyEnvironment   AccessKeyOwner = "environment"
  constant AccessKeyVariable (line 20) | AccessKeyVariable      AccessKeyOwner = "variable"
  constant AccessKeySecretStorage (line 21) | AccessKeySecretStorage AccessKeyOwner = "vault"
  constant AccessKeyShared (line 22) | AccessKeyShared        AccessKeyOwner = ""
  constant AccessKeySourceStorageVault (line 25) | AccessKeySourceStorageVault AccessKeySourceStorageType = "vault"
  constant AccessKeySourceStorageEnv (line 26) | AccessKeySourceStorageEnv   AccessKeySourceStorageType = "env"
  constant AccessKeySourceStorageFile (line 27) | AccessKeySourceStorageFile  AccessKeySourceStorageType = "file"
  type AccessKey (line 31) | type AccessKey struct
    method IsNativelyReadOnly (line 72) | func (key *AccessKey) IsNativelyReadOnly() bool {
    method IsEmpty (line 80) | func (key *AccessKey) IsEmpty() bool {
    method Validate (line 136) | func (key *AccessKey) Validate(validateSecretFields bool) error {
    method IsEnvironmentVariable (line 159) | func (key *AccessKey) IsEnvironmentVariable() bool {
  type LoginPassword (line 116) | type LoginPassword struct
  type SshKey (line 121) | type SshKey struct
  type AccessKeyRole (line 127) | type AccessKeyRole
  constant AccessKeyRoleAnsibleUser (line 130) | AccessKeyRoleAnsibleUser = iota
  constant AccessKeyRoleAnsibleBecomeUser (line 131) | AccessKeyRoleAnsibleBecomeUser
  constant AccessKeyRoleAnsiblePasswordVault (line 132) | AccessKeyRoleAnsiblePasswordVault
  constant AccessKeyRoleGit (line 133) | AccessKeyRoleGit

FILE: db/Alias.go
  type Alias (line 3) | type Alias struct
  type Aliasable (line 9) | type Aliasable interface

FILE: db/BackupEntity.go
  type BackupEntity (line 3) | type BackupEntity interface
  type BackupSluggedEntity (line 8) | type BackupSluggedEntity interface
  method GetID (line 13) | func (e View) GetID() int {
  method GetName (line 17) | func (e View) GetName() string {
  method GetName (line 21) | func (e Schedule) GetName() string {
  method GetID (line 25) | func (e Template) GetID() int {
  method GetName (line 29) | func (e Template) GetName() string {
  method GetID (line 33) | func (e Inventory) GetID() int {
  method GetName (line 37) | func (e Inventory) GetName() string {
  method GetID (line 41) | func (key AccessKey) GetID() int {
  method GetName (line 45) | func (key AccessKey) GetName() string {
  method GetID (line 49) | func (e Repository) GetID() int {
  method GetName (line 53) | func (e Repository) GetName() string {
  method GetID (line 57) | func (e Environment) GetID() int {
  method GetName (line 61) | func (e Environment) GetName() string {
  method GetID (line 65) | func (e SecretStorage) GetID() int {
  method GetName (line 69) | func (e SecretStorage) GetName() string {
  method GetID (line 73) | func (e Role) GetID() int {
  method GetSlug (line 77) | func (e Role) GetSlug() string {
  method GetName (line 81) | func (e Role) GetName() string {
  method GetID (line 88) | func (e TemplateVault) GetID() int {
  method GetID (line 92) | func (e Task) GetID() int {
  method GetID (line 96) | func (e Integration) GetID() int {
  method GetID (line 100) | func (e Project) GetID() int {
  method GetID (line 103) | func (e User) GetID() int {

FILE: db/Environment.go
  type EnvironmentSecretOperation (line 8) | type EnvironmentSecretOperation
  constant EnvironmentSecretCreate (line 11) | EnvironmentSecretCreate EnvironmentSecretOperation = "create"
  constant EnvironmentSecretUpdate (line 12) | EnvironmentSecretUpdate EnvironmentSecretOperation = "update"
  constant EnvironmentSecretDelete (line 13) | EnvironmentSecretDelete EnvironmentSecretOperation = "delete"
  type EnvironmentSecretType (line 16) | type EnvironmentSecretType
    method GetAccessKeyOwner (line 23) | func (t EnvironmentSecretType) GetAccessKeyOwner() AccessKeyOwner {
  constant EnvironmentSecretVar (line 19) | EnvironmentSecretVar EnvironmentSecretType = "var"
  constant EnvironmentSecretEnv (line 20) | EnvironmentSecretEnv EnvironmentSecretType = "env"
  type EnvironmentSecret (line 34) | type EnvironmentSecret struct
    method Validate (line 58) | func (s *EnvironmentSecret) Validate() error {
  type Environment (line 43) | type Environment struct
    method Validate (line 98) | func (env *Environment) Validate() (err error) {
  function validateJSON (line 71) | func validateJSON(s string, mustValuesBeScalar bool) error {

FILE: db/Environment_test.go
  function Test_EnvironmentValidate_EmptyName_ReturnsError (line 8) | func Test_EnvironmentValidate_EmptyName_ReturnsError(t *testing.T) {
  function Test_EnvironmentValidate_InvalidJSON_ReturnsError (line 19) | func Test_EnvironmentValidate_InvalidJSON_ReturnsError(t *testing.T) {
  function Test_EnvironmentValidate_ValidJSON_ReturnsNoError (line 30) | func Test_EnvironmentValidate_ValidJSON_ReturnsNoError(t *testing.T) {
  function Test_EnvironmentValidate_InvalidEnvJSON_ReturnsError (line 40) | func Test_EnvironmentValidate_InvalidEnvJSON_ReturnsError(t *testing.T) {
  function Test_EnvironmentValidate_EmptyJsonName_ReturnsError (line 52) | func Test_EnvironmentValidate_EmptyJsonName_ReturnsError(t *testing.T) {
  function Test_EnvironmentValidate_NonScalarEnvValues_ReturnsError (line 63) | func Test_EnvironmentValidate_NonScalarEnvValues_ReturnsError(t *testing...
  function Test_EnvironmentValidate_ValidEnvJSON_ReturnsNoError (line 75) | func Test_EnvironmentValidate_ValidEnvJSON_ReturnsNoError(t *testing.T) {

FILE: db/Event.go
  type Event (line 9) | type Event struct
    method ToFields (line 25) | func (event Event) ToFields() (logFields log.Fields) {
  type EventObjectType (line 52) | type EventObjectType
  constant EventTask (line 55) | EventTask                    EventObjectType = "task"
  constant EventEnvironment (line 56) | EventEnvironment             EventObjectType = "environment"
  constant EventInventory (line 57) | EventInventory               EventObjectType = "inventory"
  constant EventKey (line 58) | EventKey                     EventObjectType = "key"
  constant EventProject (line 59) | EventProject                 EventObjectType = "project"
  constant EventRepository (line 60) | EventRepository              EventObjectType = "repository"
  constant EventSchedule (line 61) | EventSchedule                EventObjectType = "schedule"
  constant EventTemplate (line 62) | EventTemplate                EventObjectType = "template"
  constant EventUser (line 63) | EventUser                    EventObjectType = "user"
  constant EventView (line 64) | EventView                    EventObjectType = "view"
  constant EventIntegration (line 65) | EventIntegration             EventObjectType = "integration"
  constant EventIntegrationExtractValue (line 66) | EventIntegrationExtractValue EventObjectType = "integrationextractvalue"
  constant EventIntegrationMatcher (line 67) | EventIntegrationMatcher      EventObjectType = "integrationmatcher"
  constant EventTerraformInventoryAlias (line 69) | EventTerraformInventoryAlias EventObjectType = "terraform_inventory_alias"
  function FillEvents (line 72) | func FillEvents(d Store, events []Event) (err error) {
  function getEventObjectName (line 115) | func getEventObjectName(d Store, evt Event) (string, error) {
  function getEventUsername (line 132) | func getEventUsername(d Store, evt Event) (username string, err error) {

FILE: db/ExportEntityType.go
  function NewKeyFromInt (line 7) | func NewKeyFromInt(key int) string {
  method GetDbKey (line 11) | func (e TemplateVault) GetDbKey() string {
  method GetDbKey (line 15) | func (e Task) GetDbKey() string {
  method GetDbKey (line 19) | func (e Integration) GetDbKey() string {
  method GetDbKey (line 23) | func (e Project) GetDbKey() string {
  method GetDbKey (line 26) | func (e User) GetDbKey() string {
  method GetDbKey (line 29) | func (e Template) GetDbKey() string {
  method GetDbKey (line 33) | func (e Environment) GetDbKey() string {
  method GetDbKey (line 37) | func (e Repository) GetDbKey() string {
  method GetDbKey (line 41) | func (e SecretStorage) GetDbKey() string {
  method GetDbKey (line 45) | func (key AccessKey) GetDbKey() string {
  method GetDbKey (line 49) | func (e Inventory) GetDbKey() string {
  method GetDbKey (line 53) | func (e Role) GetDbKey() string {
  method GetDbKey (line 57) | func (e View) GetDbKey() string {
  method GetDbKey (line 61) | func (e IntegrationAlias) GetDbKey() string {
  method GetDbKey (line 65) | func (e IntegrationExtractValue) GetDbKey() string {
  method GetDbKey (line 69) | func (e IntegrationMatcher) GetDbKey() string {
  method GetDbKey (line 73) | func (e Schedule) GetDbKey() string {
  method GetDbKey (line 77) | func (e TaskStage) GetDbKey() string {
  method GetDbKey (line 81) | func (e TemplateRolePerm) GetDbKey() string {
  method GetDbKey (line 85) | func (e TaskParams) GetDbKey() string {
  method GetDbKey (line 89) | func (e ProjectUser) GetDbKey() string {
  method GetDbKey (line 93) | func (e TaskOutput) GetDbKey() string {
  method GetDbKey (line 97) | func (e TaskStageResult) GetDbKey() string {
  method GetDbKey (line 101) | func (e Option) GetDbKey() string {
  method GetDbKey (line 105) | func (e Event) GetDbKey() string {
  method GetDbKey (line 109) | func (e Runner) GetDbKey() string {

FILE: db/Integration.go
  type IntegrationAuthMethod (line 8) | type IntegrationAuthMethod
  constant IntegrationAuthNone (line 11) | IntegrationAuthNone      = ""
  constant IntegrationAuthGitHub (line 12) | IntegrationAuthGitHub    = "github"
  constant IntegrationAuthToken (line 13) | IntegrationAuthToken     = "token"
  constant IntegrationAuthHmac (line 14) | IntegrationAuthHmac      = "hmac"
  constant IntegrationAuthBitbucket (line 15) | IntegrationAuthBitbucket = "bitbucket"
  constant IntegrationAuthBasic (line 16) | IntegrationAuthBasic     = "basic"
  type IntegrationMatchType (line 19) | type IntegrationMatchType
  constant IntegrationMatchHeader (line 22) | IntegrationMatchHeader IntegrationMatchType = "header"
  constant IntegrationMatchBody (line 23) | IntegrationMatchBody   IntegrationMatchType = "body"
  type IntegrationMatchMethodType (line 26) | type IntegrationMatchMethodType
  constant IntegrationMatchMethodEquals (line 29) | IntegrationMatchMethodEquals   IntegrationMatchMethodType = "equals"
  constant IntegrationMatchMethodUnEquals (line 30) | IntegrationMatchMethodUnEquals IntegrationMatchMethodType = "unequals"
  constant IntegrationMatchMethodContains (line 31) | IntegrationMatchMethodContains IntegrationMatchMethodType = "contains"
  type IntegrationBodyDataType (line 34) | type IntegrationBodyDataType
  constant IntegrationBodyDataJSON (line 37) | IntegrationBodyDataJSON   IntegrationBodyDataType = "json"
  constant IntegrationBodyDataString (line 38) | IntegrationBodyDataString IntegrationBodyDataType = "string"
  type IntegrationVariableType (line 41) | type IntegrationVariableType
  constant IntegrationVariableEnvironment (line 44) | IntegrationVariableEnvironment IntegrationVariableType = "environment"
  constant IntegrationVariableTaskParam (line 45) | IntegrationVariableTaskParam   IntegrationVariableType = "task"
  type IntegrationMatcher (line 48) | type IntegrationMatcher struct
    method Validate (line 122) | func (env *IntegrationMatcher) Validate() error {
    method String (line 172) | func (matcher *IntegrationMatcher) String() string {
  type IntegrationExtractValueSource (line 59) | type IntegrationExtractValueSource
  constant IntegrationExtractBodyValue (line 62) | IntegrationExtractBodyValue   IntegrationExtractValueSource = "body"
  constant IntegrationExtractHeaderValue (line 63) | IntegrationExtractHeaderValue IntegrationExtractValueSource = "header"
  type IntegrationExtractValue (line 66) | type IntegrationExtractValue struct
    method Validate (line 142) | func (env *IntegrationExtractValue) Validate() error {
    method String (line 199) | func (value *IntegrationExtractValue) String() string {
  type IntegrationAlias (line 77) | type IntegrationAlias struct
    method ToAlias (line 107) | func (alias IntegrationAlias) ToAlias() Alias {
  type IntegrationAliasLevel (line 84) | type IntegrationAliasLevel
  constant IntegrationAliasProject (line 87) | IntegrationAliasProject = iota
  constant IntegrationAliasSingle (line 88) | IntegrationAliasSingle
  type Integration (line 91) | type Integration struct
    method Validate (line 115) | func (env *Integration) Validate() error {

FILE: db/Inventory.go
  type InventoryType (line 3) | type InventoryType
    method IsStatic (line 15) | func (i InventoryType) IsStatic() bool {
  constant InventoryStatic (line 6) | InventoryStatic     InventoryType = "static"
  constant InventoryStaticYaml (line 7) | InventoryStaticYaml InventoryType = "static-yaml"
  constant InventoryFile (line 9) | InventoryFile                InventoryType = "file"
  constant InventoryTerraformWorkspace (line 10) | InventoryTerraformWorkspace  InventoryType = "terraform-workspace"
  constant InventoryTofuWorkspace (line 11) | InventoryTofuWorkspace       InventoryType = "tofu-workspace"
  constant InventoryTerragruntWorkspace (line 12) | InventoryTerragruntWorkspace InventoryType = "terragrunt-workspace"
  type Inventory (line 20) | type Inventory struct
    method GetFilename (line 51) | func (e Inventory) GetFilename() string {
    method Validate (line 61) | func (e Inventory) Validate() error {

FILE: db/Migration.go
  type Migration (line 16) | type Migration struct
    method HumanoidVersion (line 23) | func (m Migration) HumanoidVersion() string {
    method Validate (line 128) | func (m Migration) Validate() error {
    method ParseVersion (line 142) | func (m Migration) ParseVersion() (res MigrationVersion, err error) {
    method Compare (line 199) | func (m Migration) Compare(o Migration) int {
  function GetMigrations (line 27) | func GetMigrations(dialect string) []Migration {
  type MigrationVersion (line 136) | type MigrationVersion struct
    method Compare (line 177) | func (v MigrationVersion) Compare(o MigrationVersion) int {
  function Rollback (line 214) | func Rollback(d Store, targetVersion string) error {
  function Migrate (line 248) | func Migrate(d Store, targetVersion *string) error {

FILE: db/Option.go
  type Option (line 8) | type Option struct
  function ValidateOptionKey (line 13) | func ValidateOptionKey(key string) error {

FILE: db/Project.go
  type Project (line 8) | type Project struct

FILE: db/ProjectInvite.go
  type ProjectInviteStatus (line 7) | type ProjectInviteStatus
    method IsValid (line 16) | func (s ProjectInviteStatus) IsValid() bool {
  constant ProjectInvitePending (line 10) | ProjectInvitePending  ProjectInviteStatus = "pending"
  constant ProjectInviteAccepted (line 11) | ProjectInviteAccepted ProjectInviteStatus = "accepted"
  constant ProjectInviteDeclined (line 12) | ProjectInviteDeclined ProjectInviteStatus = "declined"
  constant ProjectInviteExpired (line 13) | ProjectInviteExpired  ProjectInviteStatus = "expired"
  type ProjectInvite (line 25) | type ProjectInvite struct
  type ProjectInviteWithUser (line 39) | type ProjectInviteWithUser struct

FILE: db/ProjectInvite_test.go
  function TestProjectInviteStatus_IsValid (line 8) | func TestProjectInviteStatus_IsValid(t *testing.T) {
  function TestProjectInvite_EmailBasedInvite (line 28) | func TestProjectInvite_EmailBasedInvite(t *testing.T) {
  function TestProjectInvite_UserBasedInvite (line 54) | func TestProjectInvite_UserBasedInvite(t *testing.T) {
  function TestProjectInvite_WithExpiration (line 80) | func TestProjectInvite_WithExpiration(t *testing.T) {
  function TestProjectInvite_AcceptedInvite (line 105) | func TestProjectInvite_AcceptedInvite(t *testing.T) {
  function TestProjectInviteWithUser_Structure (line 130) | func TestProjectInviteWithUser_Structure(t *testing.T) {

FILE: db/ProjectStats.go
  type ProjectStats (line 3) | type ProjectStats struct

FILE: db/ProjectUser.go
  type ProjectUserRole (line 3) | type ProjectUserRole
    method IsValid (line 29) | func (r ProjectUserRole) IsValid() bool {
    method Can (line 41) | func (r ProjectUserRole) Can(permissions ProjectUserPermission) bool {
    method GetPermissions (line 45) | func (r ProjectUserRole) GetPermissions() ProjectUserPermission {
  constant ProjectOwner (line 6) | ProjectOwner      ProjectUserRole = "owner"
  constant ProjectManager (line 7) | ProjectManager    ProjectUserRole = "manager"
  constant ProjectTaskRunner (line 8) | ProjectTaskRunner ProjectUserRole = "task_runner"
  constant ProjectGuest (line 9) | ProjectGuest      ProjectUserRole = "guest"
  constant ProjectNone (line 10) | ProjectNone       ProjectUserRole = ""
  type ProjectUserPermission (line 13) | type ProjectUserPermission
  constant CanRunProjectTasks (line 16) | CanRunProjectTasks ProjectUserPermission = 1 << iota
  constant CanUpdateProject (line 17) | CanUpdateProject
  constant CanManageProjectResources (line 18) | CanManageProjectResources
  constant CanManageProjectUsers (line 19) | CanManageProjectUsers
  type ProjectUser (line 34) | type ProjectUser struct

FILE: db/ProjectUser_test.go
  function TestProjectUsers_RoleCan (line 9) | func TestProjectUsers_RoleCan(t *testing.T) {

FILE: db/Repository.go
  type RepositoryType (line 13) | type RepositoryType
  constant RepositoryGit (line 16) | RepositoryGit   RepositoryType = "git"
  constant RepositorySSH (line 17) | RepositorySSH   RepositoryType = "ssh"
  constant RepositoryHTTP (line 18) | RepositoryHTTP  RepositoryType = "https"
  constant RepositoryFile (line 19) | RepositoryFile  RepositoryType = "file"
  constant RepositoryLocal (line 20) | RepositoryLocal RepositoryType = "local"
  type Repository (line 24) | type Repository struct
    method ClearCache (line 35) | func (r Repository) ClearCache() error {
    method getDirNamePrefix (line 39) | func (r Repository) getDirNamePrefix() string {
    method GetDirName (line 43) | func (r Repository) GetDirName(templateID int) string {
    method GetHomePath (line 52) | func (r Repository) GetHomePath(templateID int) string {
    method GetFullPath (line 59) | func (r Repository) GetFullPath(templateID int) string {
    method GetGitURL (line 66) | func (r Repository) GetGitURL(secure bool) string {
    method GetType (line 103) | func (r Repository) GetType() RepositoryType {
    method Validate (line 124) | func (r Repository) Validate() error {

FILE: db/Repository_test.go
  function TestRepository_GetSchema (line 14) | func TestRepository_GetSchema(t *testing.T) {
  function TestRepository_ClearCache (line 20) | func TestRepository_ClearCache(t *testing.T) {
  function TestRepository_GetGitURL (line 37) | func TestRepository_GetGitURL(t *testing.T) {

FILE: db/Role.go
  type Role (line 3) | type Role struct
  function ValidateRole (line 10) | func ValidateRole(role Role) error {
  type TemplateRolePerm (line 17) | type TemplateRolePerm struct

FILE: db/Runner.go
  type RunnerState (line 5) | type RunnerState
  type Runner (line 7) | type Runner struct
  type RunnerTag (line 22) | type RunnerTag struct

FILE: db/Schedule.go
  constant ScheduleTypeCron (line 6) | ScheduleTypeCron  = ""
  constant ScheduleTypeRunAt (line 7) | ScheduleTypeRunAt = "run_at"
  type Schedule (line 10) | type Schedule struct
  type ScheduleWithTpl (line 28) | type ScheduleWithTpl struct

FILE: db/SecretStorage.go
  type SecretStorageType (line 3) | type SecretStorageType
  constant SecretStorageTypeLocal (line 6) | SecretStorageTypeLocal SecretStorageType = "local"
  constant SecretStorageTypeVault (line 7) | SecretStorageTypeVault SecretStorageType = "vault"
  constant SecretStorageTypeDvls (line 8) | SecretStorageTypeDvls  SecretStorageType = "dvls"
  type SecretStorage (line 11) | type SecretStorage struct

FILE: db/Session.go
  type SessionVerificationMethod (line 5) | type SessionVerificationMethod
  constant SessionVerificationNone (line 8) | SessionVerificationNone SessionVerificationMethod = iota
  constant SessionVerificationTotp (line 9) | SessionVerificationTotp
  constant SessionVerificationEmail (line 10) | SessionVerificationEmail
  type Session (line 14) | type Session struct
    method IsVerified (line 27) | func (s *Session) IsVerified() bool {

FILE: db/Store.go
  constant databaseTimeFormat (line 16) | databaseTimeFormat = "2006-01-02T15:04:05:99Z"
  function GetParsedTime (line 20) | func GetParsedTime(t time.Time) time.Time {
  function ObjectToJSON (line 28) | func ObjectToJSON(obj any) *string {
  type OwnershipFilter (line 42) | type OwnershipFilter struct
    method GetOwnerID (line 118) | func (f *OwnershipFilter) GetOwnerID(ownership ObjectProps) *int {
    method SetOwnerID (line 129) | func (f *OwnershipFilter) SetOwnerID(ownership ObjectProps, ownerID in...
  type RetrieveQueryParams (line 48) | type RetrieveQueryParams struct
    method Validate (line 90) | func (p *RetrieveQueryParams) Validate(props ObjectProps) (res Retriev...
  type ObjectReferrer (line 58) | type ObjectReferrer struct
  type ObjectReferrers (line 63) | type ObjectReferrers struct
  type IntegrationReferrers (line 72) | type IntegrationReferrers struct
  type IntegrationExtractorChildReferrers (line 77) | type IntegrationExtractorChildReferrers struct
  function containsStr (line 81) | func containsStr(arr []string, str string) bool {
  type ObjectProps (line 141) | type ObjectProps struct
    method GetReferringFieldsFrom (line 724) | func (p ObjectProps) GetReferringFieldsFrom(t reflect.Type) (fields []...
  type ValidationError (line 157) | type ValidationError struct
    method Error (line 165) | func (e *ValidationError) Error() string {
  function NewValidationError (line 161) | func NewValidationError(message string) *ValidationError {
  type TaskStatUnit (line 169) | type TaskStatUnit
  constant TaskStatUnitDay (line 171) | TaskStatUnitDay TaskStatUnit = "day"
  constant TaskStatUnitWeek (line 172) | TaskStatUnitWeek TaskStatUnit = "week"
  constant TaskStatUnitMonth (line 173) | TaskStatUnitMonth TaskStatUnit = "month"
  type TaskFilter (line 175) | type TaskFilter struct
  type TaskStat (line 182) | type TaskStat struct
  type ConnectionManager (line 189) | type ConnectionManager interface
  type MigrationManager (line 203) | type MigrationManager interface
  type OptionsManager (line 219) | type OptionsManager interface
  type UserManager (line 228) | type UserManager interface
  type ProjectStore (line 251) | type ProjectStore interface
  type ProjectInviteRepository (line 265) | type ProjectInviteRepository interface
  type TemplateManager (line 276) | type TemplateManager interface
  type InventoryManager (line 298) | type InventoryManager interface
  type RepositoryManager (line 308) | type RepositoryManager interface
  type EnvironmentManager (line 318) | type EnvironmentManager interface
  type GetAccessKeyOptions (line 328) | type GetAccessKeyOptions struct
  type AccessKeyManager (line 337) | type AccessKeyManager interface
  type IntegrationManager (line 348) | type IntegrationManager interface
  type SessionManager (line 377) | type SessionManager interface
  type TokenManager (line 387) | type TokenManager interface
  type TaskManager (line 396) | type TaskManager interface
  type AnsibleTaskRepository (line 415) | type AnsibleTaskRepository interface
  type ScheduleManager (line 423) | type ScheduleManager interface
  type ViewManager (line 436) | type ViewManager interface
  type RunnerManager (line 446) | type RunnerManager interface
  type EventManager (line 463) | type EventManager interface
  type SecretStorageRepository (line 470) | type SecretStorageRepository interface
  type RoleRepository (line 479) | type RoleRepository interface
  type Store (line 491) | type Store interface
  function StoreSession (line 753) | func StoreSession(store Store, token string, callback func()) {
  function ValidateRepository (line 765) | func ValidateRepository(store Store, repo *Repository) (err error) {
  function ValidateInventory (line 771) | func ValidateInventory(store Store, inventory *Inventory) (err error) {
  type StringArrayField (line 795) | type StringArrayField
    method Scan (line 797) | func (m *StringArrayField) Scan(value any) error {
    method Value (line 814) | func (m *StringArrayField) Value() (driver.Value, error) {
  type MapStringAnyField (line 821) | type MapStringAnyField
    method Scan (line 823) | func (m *MapStringAnyField) Scan(value any) error {
    method Value (line 841) | func (m MapStringAnyField) Value() (driver.Value, error) {

FILE: db/Store_test.go
  function TestObjectToJSON (line 9) | func TestObjectToJSON(t *testing.T) {
  function TestObjectToJSON2 (line 19) | func TestObjectToJSON2(t *testing.T) {
  function TestObjectToJSON3 (line 25) | func TestObjectToJSON3(t *testing.T) {

FILE: db/Task.go
  type DefaultTaskParams (line 18) | type DefaultTaskParams struct
  type TerraformTaskParams (line 21) | type TerraformTaskParams struct
  type AnsibleTaskParams (line 29) | type AnsibleTaskParams struct
  type Task (line 40) | type Task struct
    method ExtractParams (line 83) | func (task *Task) ExtractParams(target any) (err error) {
    method PreInsert (line 94) | func (task *Task) PreInsert(gorp.SqlExecutor) error {
    method PreUpdate (line 116) | func (task *Task) PreUpdate(gorp.SqlExecutor) error {
    method GetIncomingVersion (line 129) | func (task *Task) GetIncomingVersion(d Store) *string {
    method GetUrl (line 152) | func (task *Task) GetUrl() *string {
    method ValidateNewTask (line 161) | func (task *Task) ValidateNewTask(template Template) error {
  type TaskWithTpl (line 191) | type TaskWithTpl struct
    method Fill (line 176) | func (task *TaskWithTpl) Fill(d Store) error {
  type TaskOutput (line 202) | type TaskOutput struct
  type TaskStageType (line 210) | type TaskStageType
  constant TaskStageInit (line 213) | TaskStageInit          TaskStageType = "init"
  constant TaskStageTerraformPlan (line 214) | TaskStageTerraformPlan TaskStageType = "terraform_plan"
  constant TaskStageRunning (line 215) | TaskStageRunning       TaskStageType = "running"
  constant TaskStagePrintResult (line 216) | TaskStagePrintResult   TaskStageType = "print_result"
  type TaskStage (line 219) | type TaskStage struct
  type TaskStageWithResult (line 227) | type TaskStageWithResult struct
  type TaskStageResult (line 239) | type TaskStageResult struct

FILE: db/TaskParams.go
  type TaskParams (line 3) | type TaskParams struct
    method CreateTask (line 23) | func (p TaskParams) CreateTask(templateID int) (task Task) {

FILE: db/Template.go
  type TemplateType (line 10) | type TemplateType
  constant TemplateTask (line 13) | TemplateTask   TemplateType = ""
  constant TemplateBuild (line 14) | TemplateBuild  TemplateType = "build"
  constant TemplateDeploy (line 15) | TemplateDeploy TemplateType = "deploy"
  type TemplateApp (line 18) | type TemplateApp
    method InventoryTypes (line 31) | func (t TemplateApp) InventoryTypes() []InventoryType {
    method HasInventoryType (line 46) | func (t TemplateApp) HasInventoryType(inventoryType InventoryType) bool {
    method IsTerraform (line 58) | func (t TemplateApp) IsTerraform() bool {
  constant AppAnsible (line 21) | AppAnsible    TemplateApp = "ansible"
  constant AppTerraform (line 22) | AppTerraform  TemplateApp = "terraform"
  constant AppTofu (line 23) | AppTofu       TemplateApp = "tofu"
  constant AppTerragrunt (line 24) | AppTerragrunt TemplateApp = "terragrunt"
  constant AppBash (line 25) | AppBash       TemplateApp = "bash"
  constant AppPowerShell (line 26) | AppPowerShell TemplateApp = "powershell"
  constant AppPython (line 27) | AppPython     TemplateApp = "python"
  constant AppPulumi (line 28) | AppPulumi     TemplateApp = "pulumi"
  type SurveyVarType (line 62) | type SurveyVarType
  constant SurveyVarStr (line 65) | SurveyVarStr  TemplateType = ""
  constant SurveyVarInt (line 66) | SurveyVarInt  TemplateType = "int"
  constant SurveyVarEnum (line 67) | SurveyVarEnum TemplateType = "enum"
  type AnsibleTemplateParams (line 70) | type AnsibleTemplateParams struct
  type TerraformTemplateParams (line 81) | type TerraformTemplateParams struct
  type SurveyVarEnumValue (line 89) | type SurveyVarEnumValue struct
  type SurveyVar (line 94) | type SurveyVar struct
  type TemplateFilter (line 104) | type TemplateFilter struct
  type Template (line 112) | type Template struct
    method FillParams (line 171) | func (tpl *Template) FillParams(target any) error {
    method CanOverrideInventory (line 180) | func (tpl *Template) CanOverrideInventory() (ok bool, err error) {
    method Validate (line 194) | func (tpl *Template) Validate() error {
  type TemplateWithPerms (line 166) | type TemplateWithPerms struct
  function FillTemplate (line 222) | func FillTemplate(d Store, template *Template) (err error) {

FILE: db/TemplateVault.go
  type TemplateVaultType (line 3) | type TemplateVaultType
  constant TemplateVaultPassword (line 6) | TemplateVaultPassword TemplateVaultType = "password"
  constant TemplateVaultScript (line 7) | TemplateVaultScript   TemplateVaultType = "script"
  type TemplateVault (line 10) | type TemplateVault struct
  function FillTemplateVault (line 22) | func FillTemplateVault(d Store, projectID int, templateVault *TemplateVa...

FILE: db/Template_alias.go
  method NeedTaskAlias (line 3) | func (t TemplateApp) NeedTaskAlias() bool {

FILE: db/TerraformInventoryAlias.go
  type TerraformInventoryAlias (line 5) | type TerraformInventoryAlias struct
    method ToAlias (line 19) | func (alias TerraformInventoryAlias) ToAlias() Alias {

FILE: db/TerraformInventoryState_pro.go
  type TerraformInventoryState (line 8) | type TerraformInventoryState struct

FILE: db/TerraformInventoryStore_pro.go
  type TerraformStore (line 3) | type TerraformStore interface

FILE: db/User.go
  type User (line 10) | type User struct
  type UserTotp (line 26) | type UserTotp struct
  type UserEmailOtp (line 35) | type UserEmailOtp struct
    method IsExpired (line 66) | func (o *UserEmailOtp) IsExpired() bool {
  type UserWithProjectRole (line 42) | type UserWithProjectRole struct
  type UserWithPwd (line 48) | type UserWithPwd struct
  function ValidateUser (line 53) | func ValidateUser(user User) error {

FILE: db/View.go
  type ViewType (line 3) | type ViewType
  constant ViewTypeAll (line 6) | ViewTypeAll    ViewType = "all"
  constant ViewTypeCustom (line 7) | ViewTypeCustom ViewType = ""
  type View (line 10) | type View struct
    method Validate (line 22) | func (view *View) Validate() error {

FILE: db/ansible.go
  type AnsibleTaskHost (line 5) | type AnsibleTaskHost struct
  type AnsibleTaskError (line 20) | type AnsibleTaskError struct

FILE: db/bolt/BoltDb.go
  constant MaxID (line 21) | MaxID = 2147483647
  type enumerable (line 23) | type enumerable interface
  type emptyEnumerable (line 28) | type emptyEnumerable struct
    method First (line 30) | func (d emptyEnumerable) First() (key []byte, value []byte) {
    method Next (line 34) | func (d emptyEnumerable) Next() (key []byte, value []byte) {
  type BoltDb (line 38) | type BoltDb struct
    method GetDialect (line 48) | func (d *BoltDb) GetDialect() string {
    method openDbFile (line 102) | func (d *BoltDb) openDbFile() {
    method openSession (line 124) | func (d *BoltDb) openSession(token string) {
    method Connect (line 147) | func (d *BoltDb) Connect(token string) {
    method closeSession (line 155) | func (d *BoltDb) closeSession(token string) {
    method Close (line 180) | func (d *BoltDb) Close(token string) {
    method PermanentConnection (line 190) | func (d *BoltDb) PermanentConnection() bool {
    method IsInitialized (line 205) | func (d *BoltDb) IsInitialized() (initialized bool, err error) {
    method getObjectTx (line 214) | func (d *BoltDb) getObjectTx(tx *bbolt.Tx, bucketID int, props db.Obje...
    method getObject (line 228) | func (d *BoltDb) getObject(bucketID int, props db.ObjectProps, objectI...
    method count (line 458) | func (d *BoltDb) count(bucketID int, props db.ObjectProps, params db.R...
    method getObjectsTx (line 511) | func (d *BoltDb) getObjectsTx(tx *bbolt.Tx, bucketID int, props db.Obj...
    method getObjects (line 522) | func (d *BoltDb) getObjects(bucketID int, props db.ObjectProps, params...
    method apply (line 528) | func (d *BoltDb) apply(bucketID int, props db.ObjectProps, params db.R...
    method deleteObject (line 542) | func (d *BoltDb) deleteObject(bucketID int, props db.ObjectProps, obje...
    method updateObjectTx (line 568) | func (d *BoltDb) updateObjectTx(tx *bbolt.Tx, bucketID int, props db.O...
    method updateObject (line 617) | func (d *BoltDb) updateObject(bucketID int, props db.ObjectProps, obje...
    method createObjectTx (line 623) | func (d *BoltDb) createObjectTx(tx *bbolt.Tx, bucketID int, props db.O...
    method createObject (line 707) | func (d *BoltDb) createObject(bucketID int, props db.ObjectProps, obje...
    method getIntegrationRefs (line 717) | func (d *BoltDb) getIntegrationRefs(projectID int, objectProps db.Obje...
    method getIntegrationExtractorChildrenRefs (line 723) | func (d *BoltDb) getIntegrationExtractorChildrenRefs(integrationID int...
    method getReferringObjectByParentID (line 732) | func (d *BoltDb) getReferringObjectByParentID(parentID int, objProps d...
    method getObjectRefs (line 754) | func (d *BoltDb) getObjectRefs(projectID int, objectProps db.ObjectPro...
    method getObjectRefsFrom (line 783) | func (d *BoltDb) getObjectRefsFrom(projectID int, objProps db.ObjectPr...
    method isObjectInUse (line 907) | func (d *BoltDb) isObjectInUse(bucketID int, objProps db.ObjectProps, ...
    method GetTaskStats (line 925) | func (d *BoltDb) GetTaskStats(projectID int, templateID *int, unit db....
  function CreateBoltDB (line 58) | func CreateBoltDB() *BoltDb {
  type objectID (line 73) | type objectID interface
  type intObjectID (line 77) | type intObjectID
    method ToBytes (line 80) | func (d intObjectID) ToBytes() []byte {
  type strObjectID (line 78) | type strObjectID
    method ToBytes (line 84) | func (d strObjectID) ToBytes() []byte {
  function makeBucketId (line 88) | func makeBucketId(props db.ObjectProps, ids ...int) []byte {
  function getFieldNameByTagSuffix (line 238) | func getFieldNameByTagSuffix(t reflect.Type, tagName string, tagValueSuf...
  function sortObjects (line 257) | func sortObjects(objects any, sortBy string, sortInverted bool) error {
  function createObjectType (line 301) | func createObjectType(t reflect.Type) reflect.Type {
  function unmarshalObject (line 326) | func unmarshalObject(data []byte, obj any, fields []string) error {
  function copyObject (line 364) | func copyObject(obj any, newType reflect.Type) any {
  function marshalObject (line 383) | func marshalObject(obj any) ([]byte, error) {
  function apply (line 388) | func apply(
  function unmarshalObjects (line 478) | func unmarshalObjects(rawData enumerable, props db.ObjectProps, params d...
  function getReferredValue (line 834) | func getReferredValue(props db.ObjectProps, referringObj any) (f reflect...
  function isObjectReferredBy (line 852) | func isObjectReferredBy(props db.ObjectProps, objID objectID, referringO...
  function CreateTestStore (line 1005) | func CreateTestStore() *BoltDb {

FILE: db/bolt/BoltDb_test.go
  type test1 (line 13) | type test1 struct
  function TestMarshalObject_UserWithPwd (line 26) | func TestMarshalObject_UserWithPwd(t *testing.T) {
  function TestMarshalObject (line 45) | func TestMarshalObject(t *testing.T) {
  function TestUnmarshalObject (line 64) | func TestUnmarshalObject(t *testing.T) {
  function TestSortObjects (line 81) | func TestSortObjects(t *testing.T) {
  function TestGetFieldNameByTag (line 99) | func TestGetFieldNameByTag(t *testing.T) {
  function TestGetFieldNameByTag2 (line 105) | func TestGetFieldNameByTag2(t *testing.T) {
  function TestIsObjectInUse (line 111) | func TestIsObjectInUse(t *testing.T) {
  function TestIsObjectInUse_Environment (line 131) | func TestIsObjectInUse_Environment(t *testing.T) {
  function TestIsObjectInUse_EnvironmentNil (line 151) | func TestIsObjectInUse_EnvironmentNil(t *testing.T) {
  function TestBoltDb_CreateAPIToken (line 171) | func TestBoltDb_CreateAPIToken(t *testing.T) {
  function TestBoltDb_GetRepositoryRefs (line 214) | func TestBoltDb_GetRepositoryRefs(t *testing.T) {

FILE: db/bolt/Task_test.go
  function TestTask_GetVersion (line 8) | func TestTask_GetVersion(t *testing.T) {

FILE: db/bolt/access_key.go
  method GetAccessKey (line 7) | func (d *BoltDb) GetAccessKey(projectID int, accessKeyID int) (key db.Ac...
  method GetAccessKeyRefs (line 16) | func (d *BoltDb) GetAccessKeyRefs(projectID int, accessKeyID int) (db.Ob...
  method GetAccessKeys (line 20) | func (d *BoltDb) GetAccessKeys(projectID int, options db.GetAccessKeyOpt...
  method UpdateAccessKey (line 29) | func (d *BoltDb) UpdateAccessKey(key db.AccessKey) error {
  method CreateAccessKey (line 53) | func (d *BoltDb) CreateAccessKey(key db.AccessKey) (db.AccessKey, error) {
  method DeleteAccessKey (line 58) | func (d *BoltDb) DeleteAccessKey(projectID int, accessKeyID int) error {
  method RekeyAccessKeys (line 62) | func (d *BoltDb) RekeyAccessKeys(oldKey string) error {

FILE: db/bolt/environment.go
  method GetEnvironment (line 5) | func (d *BoltDb) GetEnvironment(projectID int, environmentID int) (envir...
  method GetEnvironmentRefs (line 10) | func (d *BoltDb) GetEnvironmentRefs(projectID int, environmentID int) (d...
  method GetEnvironments (line 14) | func (d *BoltDb) GetEnvironments(projectID int, params db.RetrieveQueryP...
  method UpdateEnvironment (line 19) | func (d *BoltDb) UpdateEnvironment(env db.Environment) error {
  method CreateEnvironment (line 29) | func (d *BoltDb) CreateEnvironment(env db.Environment) (db.Environment, ...
  method DeleteEnvironment (line 40) | func (d *BoltDb) DeleteEnvironment(projectID int, environmentID int) err...
  method GetEnvironmentSecrets (line 44) | func (d *BoltDb) GetEnvironmentSecrets(projectID int, environmentID int)...

FILE: db/bolt/event.go
  method getEvents (line 28) | func (d *BoltDb) getEvents(c enumerable, params db.RetrieveQueryParams, ...
  method CreateEvent (line 75) | func (d *BoltDb) CreateEvent(evt db.Event) (newEvent db.Event, err error) {
  method GetUserEvents (line 103) | func (d *BoltDb) GetUserEvents(userID int, params db.RetrieveQueryParams...
  method GetEvents (line 125) | func (d *BoltDb) GetEvents(projectID int, params db.RetrieveQueryParams)...
  method GetAllEvents (line 146) | func (d *BoltDb) GetAllEvents(params db.RetrieveQueryParams) (events []d...

FILE: db/bolt/global_runner.go
  method GetRunnerByToken (line 11) | func (d *BoltDb) GetRunnerByToken(token string) (runner db.Runner, err e...
  method GetGlobalRunner (line 33) | func (d *BoltDb) GetGlobalRunner(runnerID int) (runner db.Runner, err er...
  method GetAllRunners (line 46) | func (d *BoltDb) GetAllRunners(activeOnly bool, globalOnly bool) (runner...
  method DeleteGlobalRunner (line 63) | func (d *BoltDb) DeleteGlobalRunner(runnerID int) error {
  method updateRunner (line 81) | func (d *BoltDb) updateRunner(runner db.Runner, updater func(targetRunne...
  method ClearRunnerCache (line 107) | func (d *BoltDb) ClearRunnerCache(runner db.Runner) (err error) {
  method TouchRunner (line 114) | func (d *BoltDb) TouchRunner(runner db.Runner) (err error) {
  method UpdateRunner (line 121) | func (d *BoltDb) UpdateRunner(runner db.Runner) (err error) {
  method CreateRunner (line 128) | func (d *BoltDb) CreateRunner(runner db.Runner) (newRunner db.Runner, er...

FILE: db/bolt/global_runner_test.go
  function Test_GetRunnerByToken_ReturnsGlobalRunnerWhenTokenExists (line 9) | func Test_GetRunnerByToken_ReturnsGlobalRunnerWhenTokenExists(t *testing...
  function Test_GetRunnerByToken_ReturnsRunnerWhenTokenExists (line 19) | func Test_GetRunnerByToken_ReturnsRunnerWhenTokenExists(t *testing.T) {
  function Test_GetGlobalRunner_ReturnsErrorWhenTryingGetProjectRunner (line 32) | func Test_GetGlobalRunner_ReturnsErrorWhenTryingGetProjectRunner(t *test...

FILE: db/bolt/integrations.go
  method CreateIntegration (line 11) | func (d *BoltDb) CreateIntegration(integration db.Integration) (db.Integ...
  method GetIntegrations (line 22) | func (d *BoltDb) GetIntegrations(projectID int, params db.RetrieveQueryP...
  method GetIntegration (line 27) | func (d *BoltDb) GetIntegration(projectID int, integrationID int) (integ...
  method UpdateIntegration (line 36) | func (d *BoltDb) UpdateIntegration(integration db.Integration) error {
  method GetIntegrationRefs (line 47) | func (d *BoltDb) GetIntegrationRefs(projectID int, integrationID int) (d...
  method DeleteIntegrationExtractValue (line 52) | func (d *BoltDb) DeleteIntegrationExtractValue(projectID int, valueID in...
  method CreateIntegrationExtractValue (line 56) | func (d *BoltDb) CreateIntegrationExtractValue(projectId int, value db.I...
  method GetIntegrationExtractValues (line 68) | func (d *BoltDb) GetIntegrationExtractValues(projectID int, params db.Re...
  method GetIntegrationExtractValue (line 79) | func (d *BoltDb) GetIntegrationExtractValue(projectID int, valueID int, ...
  method UpdateIntegrationExtractValue (line 84) | func (d *BoltDb) UpdateIntegrationExtractValue(projectID int, integratio...
  method GetIntegrationExtractValueRefs (line 94) | func (d *BoltDb) GetIntegrationExtractValueRefs(projectID int, valueID i...
  method CreateIntegrationMatcher (line 101) | func (d *BoltDb) CreateIntegrationMatcher(projectID int, matcher db.Inte...
  method GetIntegrationMatchers (line 111) | func (d *BoltDb) GetIntegrationMatchers(projectID int, params db.Retriev...
  method GetIntegrationMatcher (line 122) | func (d *BoltDb) GetIntegrationMatcher(projectID int, matcherID int, int...
  method UpdateIntegrationMatcher (line 135) | func (d *BoltDb) UpdateIntegrationMatcher(projectID int, integrationMatc...
  method deleteIntegrationMatcher (line 145) | func (d *BoltDb) deleteIntegrationMatcher(projectID int, matcherID int, ...
  method DeleteIntegrationMatcher (line 149) | func (d *BoltDb) DeleteIntegrationMatcher(projectID int, matcherID int, ...
  method DeleteIntegration (line 153) | func (d *BoltDb) DeleteIntegration(projectID int, integrationID int) err...
  method deleteIntegration (line 157) | func (d *BoltDb) deleteIntegration(projectID int, integrationID int, tx ...
  method GetIntegrationMatcherRefs (line 171) | func (d *BoltDb) GetIntegrationMatcherRefs(projectID int, matcherID int,...

FILE: db/bolt/integrations_alias.go
  method GetIntegrationAliases (line 14) | func (d *BoltDb) GetIntegrationAliases(projectID int, integrationID *int...
  method GetIntegrationsByAlias (line 29) | func (d *BoltDb) GetIntegrationsByAlias(alias string) (res []db.Integrat...
  method CreateIntegrationAlias (line 68) | func (d *BoltDb) CreateIntegrationAlias(alias db.IntegrationAlias) (res ...
  method DeleteIntegrationAlias (line 81) | func (d *BoltDb) DeleteIntegrationAlias(projectID int, aliasID int) (err...

FILE: db/bolt/inventory.go
  method GetInventory (line 7) | func (d *BoltDb) GetInventory(projectID int, inventoryID int) (inventory...
  method GetInventories (line 13) | func (d *BoltDb) GetInventories(projectID int, params db.RetrieveQueryPa...
  method GetInventoryRefs (line 31) | func (d *BoltDb) GetInventoryRefs(projectID int, inventoryID int) (db.Ob...
  method DeleteInventory (line 35) | func (d *BoltDb) DeleteInventory(projectID int, inventoryID int) error {
  method UpdateInventory (line 39) | func (d *BoltDb) UpdateInventory(inventory db.Inventory) error {
  method CreateInventory (line 43) | func (d *BoltDb) CreateInventory(inventory db.Inventory) (db.Inventory, ...

FILE: db/bolt/migration.go
  method IsMigrationApplied (line 11) | func (d *BoltDb) IsMigrationApplied(migration db.Migration) (bool, error) {
  method ApplyMigration (line 38) | func (d *BoltDb) ApplyMigration(m db.Migration) (err error) {
  method TryRollbackMigration (line 83) | func (d *BoltDb) TryRollbackMigration(m db.Migration) {
  type migration (line 89) | type migration struct
    method createObjectTx (line 93) | func (d migration) createObjectTx(tx *bbolt.Tx, projectID string, obje...
    method createObject (line 126) | func (d migration) createObject(projectID string, objectPrefix string,...
    method getProjectIDs (line 136) | func (d migration) getProjectIDs() (projectIDs []string, err error) {
    method getObjects (line 151) | func (d migration) getObjects(projectID string, objectPrefix string) (...
    method getObject (line 169) | func (d migration) getObject(projectID string, objectPrefix string, ob...
    method setObject (line 188) | func (d migration) setObject(projectID string, objectPrefix string, ob...
    method deleteObject (line 202) | func (d migration) deleteObject(projectID string, objectPrefix string,...

FILE: db/bolt/migration_2_10_12.go
  type migration_2_10_12 (line 3) | type migration_2_10_12 struct
    method Apply (line 7) | func (d migration_2_10_12) Apply() error {

FILE: db/bolt/migration_2_10_12_test.go
  function TestMigration_2_10_12_Apply (line 9) | func TestMigration_2_10_12_Apply(t *testing.T) {

FILE: db/bolt/migration_2_10_16.go
  type migration_2_10_16 (line 3) | type migration_2_10_16 struct
    method Apply (line 7) | func (d migration_2_10_16) Apply() (err error) {

FILE: db/bolt/migration_2_10_16_test.go
  function TestMigration_2_10_16_Apply (line 9) | func TestMigration_2_10_16_Apply(t *testing.T) {
  function TestMigration_2_10_16_Apply2 (line 66) | func TestMigration_2_10_16_Apply2(t *testing.T) {

FILE: db/bolt/migration_2_10_24.go
  type migration_2_10_24 (line 5) | type migration_2_10_24 struct
    method Apply (line 9) | func (d migration_2_10_24) Apply() (err error) {

FILE: db/bolt/migration_2_10_24_test.go
  function TestMigration_2_10_24_Apply (line 9) | func TestMigration_2_10_24_Apply(t *testing.T) {
  function TestMigration_2_10_24_Apply2 (line 72) | func TestMigration_2_10_24_Apply2(t *testing.T) {

FILE: db/bolt/migration_2_10_33.go
  type migration_2_10_33 (line 3) | type migration_2_10_33 struct
    method Apply (line 7) | func (d migration_2_10_33) Apply() (err error) {

FILE: db/bolt/migration_2_10_33_test.go
  function TestMigration_2_10_33_Apply (line 9) | func TestMigration_2_10_33_Apply(t *testing.T) {
  function TestMigration_2_10_33_Apply2 (line 62) | func TestMigration_2_10_33_Apply2(t *testing.T) {

FILE: db/bolt/migration_2_14_7.go
  type migration_2_14_7 (line 8) | type migration_2_14_7 struct
    method Apply (line 12) | func (d migration_2_14_7) Apply() (err error) {

FILE: db/bolt/migration_2_14_7_test.go
  function TestMigration_2_14_7_Apply (line 8) | func TestMigration_2_14_7_Apply(t *testing.T) {

FILE: db/bolt/migration_2_17_0.go
  type migration_2_17_0 (line 5) | type migration_2_17_0 struct
    method Apply (line 9) | func (d migration_2_17_0) Apply() (err error) {

FILE: db/bolt/migration_2_17_0_test.go
  function TestMigration_2_17_0_Apply (line 11) | func TestMigration_2_17_0_Apply(t *testing.T) {

FILE: db/bolt/migration_2_17_2.go
  type migration_2_17_2 (line 3) | type migration_2_17_2 struct
    method Apply (line 7) | func (d migration_2_17_2) Apply() error {

FILE: db/bolt/migration_2_8_28.go
  type migration_2_8_28 (line 7) | type migration_2_8_28 struct
    method Apply (line 11) | func (d migration_2_8_28) Apply() (err error) {

FILE: db/bolt/migration_2_8_28_test.go
  function TestMigration_2_8_28_Apply (line 11) | func TestMigration_2_8_28_Apply(t *testing.T) {
  function TestMigration_2_8_28_Apply2 (line 53) | func TestMigration_2_8_28_Apply2(t *testing.T) {

FILE: db/bolt/migration_2_8_40.go
  type migration_2_8_40 (line 3) | type migration_2_8_40 struct
    method Apply (line 7) | func (d migration_2_8_40) Apply() (err error) {

FILE: db/bolt/migration_2_8_40_test.go
  function TestMigration_2_8_40_Apply (line 9) | func TestMigration_2_8_40_Apply(t *testing.T) {
  function TestMigration_2_8_40_Apply2 (line 62) | func TestMigration_2_8_40_Apply2(t *testing.T) {

FILE: db/bolt/migration_2_8_91.go
  type migration_2_8_91 (line 3) | type migration_2_8_91 struct
    method Apply (line 7) | func (d migration_2_8_91) Apply() (err error) {

FILE: db/bolt/migration_2_8_91_test.go
  function TestMigration_2_8_91_Apply (line 9) | func TestMigration_2_8_91_Apply(t *testing.T) {
  function TestMigration_2_8_91_Apply2 (line 63) | func TestMigration_2_8_91_Apply2(t *testing.T) {

FILE: db/bolt/option.go
  method GetOptions (line 10) | func (d *BoltDb) GetOptions(params db.RetrieveQueryParams) (res map[stri...
  method SetOption (line 29) | func (d *BoltDb) SetOption(key string, value string) error {
  method getOption (line 48) | func (d *BoltDb) getOption(key string) (value string, err error) {
  method GetOption (line 55) | func (d *BoltDb) GetOption(key string) (value string, err error) {
  method DeleteOption (line 67) | func (d *BoltDb) DeleteOption(key string) (err error) {
  method DeleteOptions (line 78) | func (d *BoltDb) DeleteOptions(filter string) (err error) {

FILE: db/bolt/option_test.go
  function TestGetOption (line 7) | func TestGetOption(t *testing.T) {
  function TestGetSetOption (line 17) | func TestGetSetOption(t *testing.T) {

FILE: db/bolt/project.go
  method CreateProject (line 8) | func (d *BoltDb) CreateProject(project db.Project) (db.Project, error) {
  method GetAllProjects (line 20) | func (d *BoltDb) GetAllProjects() (projects []db.Project, err error) {
  method GetProjects (line 26) | func (d *BoltDb) GetProjects(userID int) (projects []db.Project, err err...
  method GetProject (line 50) | func (d *BoltDb) GetProject(projectID int) (project db.Project, err erro...
  method DeleteProject (line 55) | func (d *BoltDb) DeleteProject(projectID int) error {
  method UpdateProject (line 59) | func (d *BoltDb) UpdateProject(project db.Project) error {

FILE: db/bolt/project_invite.go
  method GetProjectInvites (line 7) | func (d *BoltDb) GetProjectInvites(projectID int, params db.RetrieveQuer...
  method CreateProjectInvite (line 41) | func (d *BoltDb) CreateProjectInvite(invite db.ProjectInvite) (db.Projec...
  method GetProjectInvite (line 49) | func (d *BoltDb) GetProjectInvite(projectID int, inviteID int) (invite d...
  method GetProjectInviteByToken (line 54) | func (d *BoltDb) GetProjectInviteByToken(token string) (invite db.Projec...
  method UpdateProjectInvite (line 83) | func (d *BoltDb) UpdateProjectInvite(invite db.ProjectInvite) error {
  method DeleteProjectInvite (line 87) | func (d *BoltDb) DeleteProjectInvite(projectID int, inviteID int) error {

FILE: db/bolt/project_test.go
  function TestGetProjects (line 9) | func TestGetProjects(t *testing.T) {
  function TestGetProject (line 56) | func TestGetProject(t *testing.T) {

FILE: db/bolt/public_alias.go
  type publicAlias (line 10) | type publicAlias struct
    method getAliases (line 16) | func (d *publicAlias) getAliases(projectID int, filter func(i any) boo...
    method getAlias (line 23) | func (d *publicAlias) getAlias(projectID int, aliasID int, res any) (e...
    method getPublicAlias (line 30) | func (d *publicAlias) getPublicAlias(alias string, aliasObj any) (err ...
    method createAlias (line 37) | func (d *publicAlias) createAlias(aliasObj any) (newAlias any, err err...
    method deleteIntegrationAlias (line 67) | func (d *publicAlias) deleteIntegrationAlias(projectID int, aliasID in...

FILE: db/bolt/repository.go
  method GetRepository (line 7) | func (d *BoltDb) GetRepository(projectID int, repositoryID int) (reposit...
  method GetRepositoryRefs (line 16) | func (d *BoltDb) GetRepositoryRefs(projectID int, repositoryID int) (db....
  method GetRepositories (line 20) | func (d *BoltDb) GetRepositories(projectID int, params db.RetrieveQueryP...
  method UpdateRepository (line 25) | func (d *BoltDb) UpdateRepository(repository db.Repository) error {
  method CreateRepository (line 33) | func (d *BoltDb) CreateRepository(repository db.Repository) (db.Reposito...
  method DeleteRepository (line 42) | func (d *BoltDb) DeleteRepository(projectID int, repositoryId int) error {

FILE: db/bolt/role.go
  method GetGlobalRole (line 7) | func (d *BoltDb) GetGlobalRole(roleID int) (role db.Role, err error) {
  method GetGlobalRoleBySlug (line 12) | func (d *BoltDb) GetGlobalRoleBySlug(slug string) (db.Role, error) {
  method GetProjectRoles (line 31) | func (d *BoltDb) GetProjectRoles(projectID int) (roles []db.Role, err er...
  method GetGlobalRoles (line 39) | func (d *BoltDb) GetGlobalRoles() (roles []db.Role, err error) {
  method UpdateRole (line 47) | func (d *BoltDb) UpdateRole(role db.Role) error {
  method CreateRole (line 51) | func (d *BoltDb) CreateRole(role db.Role) (newRole db.Role, err error) {
  method DeleteRole (line 60) | func (d *BoltDb) DeleteRole(slug string) error {
  method GetProjectRole (line 64) | func (d *BoltDb) GetProjectRole(projectID int, slug string) (db.Role, er...
  method GetProjectOrGlobalRoleBySlug (line 79) | func (d *BoltDb) GetProjectOrGlobalRoleBySlug(projectID int, slug string...

FILE: db/bolt/runner_pro.go
  method GetRunner (line 9) | func (d *BoltDb) GetRunner(projectID int, runnerID int) (runner db.Runne...
  function validateTag (line 22) | func validateTag(tag string) error {
  method GetRunners (line 30) | func (d *BoltDb) GetRunners(projectID int, activeOnly bool, tag *string)...
  method DeleteRunner (line 59) | func (d *BoltDb) DeleteRunner(projectID int, runnerID int) error {
  method GetRunnerTags (line 72) | func (d *BoltDb) GetRunnerTags(projectID int) ([]db.RunnerTag, error) {
  method GetRunnerCount (line 96) | func (d *BoltDb) GetRunnerCount() (res int, err error) {

FILE: db/bolt/runner_pro_test.go
  function Test_DeleteRunner_DeletesProjectRunner (line 9) | func Test_DeleteRunner_DeletesProjectRunner(t *testing.T) {

FILE: db/bolt/schedule.go
  method GetSchedules (line 8) | func (d *BoltDb) GetSchedules() (schedules []db.Schedule, err error) {
  method getProjectSchedules (line 29) | func (d *BoltDb) getProjectSchedules(projectID int, filter func(referrin...
  method GetProjectSchedules (line 37) | func (d *BoltDb) GetProjectSchedules(projectID int, includeTaskParams bo...
  method GetTemplateSchedules (line 66) | func (d *BoltDb) GetTemplateSchedules(projectID int, templateID int, onl...
  method CreateSchedule (line 74) | func (d *BoltDb) CreateSchedule(schedule db.Schedule) (newSchedule db.Sc...
  method UpdateSchedule (line 83) | func (d *BoltDb) UpdateSchedule(schedule db.Schedule) error {
  method GetSchedule (line 87) | func (d *BoltDb) GetSchedule(projectID int, scheduleID int) (schedule db...
  method deleteSchedule (line 92) | func (d *BoltDb) deleteSchedule(projectID int, scheduleID int, tx *bbolt...
  method DeleteSchedule (line 96) | func (d *BoltDb) DeleteSchedule(projectID int, scheduleID int) error {
  method SetScheduleActive (line 102) | func (d *BoltDb) SetScheduleActive(projectID int, scheduleID int, active...
  method SetScheduleCommitHash (line 111) | func (d *BoltDb) SetScheduleCommitHash(projectID int, scheduleID int, ha...

FILE: db/bolt/secret_storage.go
  method GetSecretStorages (line 5) | func (d *BoltDb) GetSecretStorages(projectID int) ([]db.SecretStorage, e...
  method CreateSecretStorage (line 9) | func (d *BoltDb) CreateSecretStorage(storage db.SecretStorage) (db.Secre...
  method GetSecretStorage (line 14) | func (d *BoltDb) GetSecretStorage(projectID int, storageID int) (db.Secr...
  method DeleteSecretStorage (line 19) | func (d *BoltDb) DeleteSecretStorage(projectID int, storageID int) error {
  method UpdateSecretStorage (line 23) | func (d *BoltDb) UpdateSecretStorage(storage db.SecretStorage) error {
  method GetSecretStorageRefs (line 28) | func (d *BoltDb) GetSecretStorageRefs(projectID int, storageID int) (db....

FILE: db/bolt/session.go
  type globalToken (line 11) | type globalToken struct
  method CreateSession (line 23) | func (d *BoltDb) CreateSession(session db.Session) (db.Session, error) {
  method CreateAPIToken (line 31) | func (d *BoltDb) CreateAPIToken(token db.APIToken) (db.APIToken, error) {
  method GetAPIToken (line 48) | func (d *BoltDb) GetAPIToken(tokenID string) (token db.APIToken, err err...
  method ExpireAPIToken (line 58) | func (d *BoltDb) ExpireAPIToken(userID int, tokenID string) (err error) {
  method DeleteAPIToken (line 69) | func (d *BoltDb) DeleteAPIToken(userID int, tokenID string) (err error) {
  method GetSession (line 89) | func (d *BoltDb) GetSession(userID int, sessionID int) (session db.Sessi...
  method ExpireSession (line 94) | func (d *BoltDb) ExpireSession(userID int, sessionID int) (err error) {
  method SetSessionVerificationMethod (line 105) | func (d *BoltDb) SetSessionVerificationMethod(userID int, sessionID int,...
  method VerifySession (line 109) | func (d *BoltDb) VerifySession(userID int, sessionID int) (err error) {
  method TouchSession (line 120) | func (d *BoltDb) TouchSession(userID int, sessionID int) (err error) {
  method GetAPITokens (line 131) | func (d *BoltDb) GetAPITokens(userID int) (tokens []db.APIToken, err err...

FILE: db/bolt/task.go
  method CreateTaskStage (line 10) | func (d *BoltDb) CreateTaskStage(stage db.TaskStage) (db.TaskStage, erro...
  method GetTaskStages (line 18) | func (d *BoltDb) GetTaskStages(projectID int, taskID int) (res []db.Task...
  method clearTasks (line 47) | func (d *BoltDb) clearTasks(projectID int, templateID int, maxTasks int) {
  method CreateTask (line 109) | func (d *BoltDb) CreateTask(task db.Task, maxTasks int) (newTask db.Task...
  method UpdateTask (line 129) | func (d *BoltDb) UpdateTask(task db.Task) error {
  method CreateTaskOutput (line 133) | func (d *BoltDb) CreateTaskOutput(output db.TaskOutput) (db.TaskOutput, ...
  method InsertTaskOutputBatch (line 141) | func (d *BoltDb) InsertTaskOutputBatch(output []db.TaskOutput) error {
  method getTasks (line 157) | func (d *BoltDb) getTasks(projectID int, templateID *int, params db.Retr...
  method GetTask (line 217) | func (d *BoltDb) GetTask(projectID int, taskID int) (task db.Task, err e...
  method GetTemplateTasks (line 232) | func (d *BoltDb) GetTemplateTasks(projectID int, templateID int, params ...
  method GetProjectTasks (line 236) | func (d *BoltDb) GetProjectTasks(projectID int, params db.RetrieveQueryP...
  method deleteTaskWithOutputs (line 240) | func (d *BoltDb) deleteTaskWithOutputs(projectID int, taskID int, checkT...
  method DeleteTaskWithOutputs (line 262) | func (d *BoltDb) DeleteTaskWithOutputs(projectID int, taskID int) error {
  method GetTaskOutputs (line 268) | func (d *BoltDb) GetTaskOutputs(projectID int, taskID int, params db.Ret...
  method EndTaskStage (line 281) | func (d *BoltDb) EndTaskStage(taskID int, stageID int, end time.Time) er...
  method CreateTaskStageResult (line 285) | func (d *BoltDb) CreateTaskStageResult(taskID int, stageID int, result m...
  method GetTaskStageResult (line 289) | func (d *BoltDb) GetTaskStageResult(projectID int, taskID int, stageID i...
  method GetTaskStageOutputs (line 293) | func (d *BoltDb) GetTaskStageOutputs(projectID int, taskID int, stageID ...
  method GetNodeCount (line 297) | func (d *BoltDb) GetNodeCount() (int, error) {
  method GetUiCount (line 301) | func (d *BoltDb) GetUiCount() (int, error) {

FILE: db/bolt/template.go
  method CreateTemplate (line 12) | func (d *BoltDb) CreateTemplate(template db.Template) (newTemplate db.Te...
  method UpdateTemplate (line 33) | func (d *BoltDb) UpdateTemplate(template db.Template) error {
  method setTemplateDescriptionTx (line 48) | func (d *BoltDb) setTemplateDescriptionTx(projectID int, templateID int,...
  method SetTemplateDescription (line 65) | func (d *BoltDb) SetTemplateDescription(projectID int, templateID int, d...
  method GetTemplatesWithPermissions (line 73) | func (d *BoltDb) GetTemplatesWithPermissions(projectID int, userID int, ...
  method GetTemplates (line 88) | func (d *BoltDb) GetTemplates(projectID int, filter db.TemplateFilter, p...
  method getRawTemplateTx (line 210) | func (d *BoltDb) getRawTemplateTx(projectID int, templateID int, tx *bbo...
  method getRawTemplate (line 215) | func (d *BoltDb) getRawTemplate(projectID int, templateID int) (template...
  method GetTemplate (line 220) | func (d *BoltDb) GetTemplate(projectID int, templateID int) (template db...
  method deleteTemplate (line 229) | func (d *BoltDb) deleteTemplate(projectID int, templateID int, tx *bbolt...
  method DeleteTemplate (line 289) | func (d *BoltDb) DeleteTemplate(projectID int, templateID int) error {
  method GetTemplateRefs (line 295) | func (d *BoltDb) GetTemplateRefs(projectID int, templateID int) (db.Obje...
  method GetTemplatePermission (line 299) | func (d *BoltDb) GetTemplatePermission(projectID int, templateID int, us...
  method GetTemplateRoles (line 302) | func (d *BoltDb) GetTemplateRoles(projectID int, templateID int) (roles ...
  method CreateTemplateRole (line 306) | func (d *BoltDb) CreateTemplateRole(role db.TemplateRolePerm) (newRole d...
  method DeleteTemplateRole (line 309) | func (d *BoltDb) DeleteTemplateRole(projectID int, templateID int, roleI...
  method UpdateTemplateRole (line 312) | func (d *BoltDb) UpdateTemplateRole(role db.TemplateRolePerm) error {
  method GetTemplateRole (line 315) | func (d *BoltDb) GetTemplateRole(projectID int, templateID int, roleID i...

FILE: db/bolt/template_test.go
  function Test_SetTemplateDescription (line 9) | func Test_SetTemplateDescription(t *testing.T) {

FILE: db/bolt/template_vault.go
  method GetTemplateVaults (line 8) | func (d *BoltDb) GetTemplateVaults(projectID int, templateID int) (vault...
  method CreateTemplateVault (line 24) | func (d *BoltDb) CreateTemplateVault(vault db.TemplateVault) (newVault d...
  method UpdateTemplateVaults (line 34) | func (d *BoltDb) UpdateTemplateVaults(projectID int, templateID int, vau...
  method deleteTemplateVault (line 73) | func (d *BoltDb) deleteTemplateVault(projectID int, vaultID int, tx *bbo...

FILE: db/bolt/template_vault_test.go
  function TestGetTemplateVaults (line 9) | func TestGetTemplateVaults(t *testing.T) {
  function TestCreateTemplateVault (line 48) | func TestCreateTemplateVault(t *testing.T) {
  function TestUpdateTemplateVaults (line 87) | func TestUpdateTemplateVaults(t *testing.T) {

FILE: db/bolt/user.go
  method CreateUserWithoutPassword (line 12) | func (d *BoltDb) CreateUserWithoutPassword(user db.User) (newUser db.Use...
  method ImportUser (line 43) | func (d *BoltDb) ImportUser(user db.UserWithPwd) (newUser db.User, err e...
  method CreateUser (line 47) | func (d *BoltDb) CreateUser(user db.UserWithPwd) (newUser db.User, err e...
  method DeleteUser (line 84) | func (d *BoltDb) DeleteUser(userID int) error {
  method UpdateUser (line 99) | func (d *BoltDb) UpdateUser(user db.UserWithPwd) error {
  method SetUserPassword (line 122) | func (d *BoltDb) SetUserPassword(userID int, password string) error {
  method CreateProjectUser (line 135) | func (d *BoltDb) CreateProjectUser(projectUser db.ProjectUser) (db.Proje...
  method GetProjectUser (line 145) | func (d *BoltDb) GetProjectUser(projectID, userID int) (user db.ProjectU...
  method GetProjectUsers (line 150) | func (d *BoltDb) GetProjectUsers(projectID int, params db.RetrieveQueryP...
  method UpdateProjectUser (line 171) | func (d *BoltDb) UpdateProjectUser(projectUser db.ProjectUser) error {
  method DeleteProjectUser (line 175) | func (d *BoltDb) DeleteProjectUser(projectID, userID int) error {
  method getTotp (line 179) | func (d *BoltDb) getTotp(userID int) (res *db.UserTotp, err error) {
  method GetUser (line 196) | func (d *BoltDb) GetUser(userID int) (user db.User, err error) {
  method GetProUserCount (line 207) | func (d *BoltDb) GetProUserCount() (count int, err error) {
  method GetUserCount (line 220) | func (d *BoltDb) GetUserCount() (count int, err error) {
  method GetUsers (line 230) | func (d *BoltDb) GetUsers(params db.RetrieveQueryParams) (users []db.Use...
  method GetUserByLoginOrEmail (line 235) | func (d *BoltDb) GetUserByLoginOrEmail(login string, email string) (exis...
  method GetAllAdmins (line 262) | func (d *BoltDb) GetAllAdmins() (users []db.User, err error) {
  method AddTotpVerification (line 270) | func (d *BoltDb) AddTotpVerification(userID int, url string, recoveryHas...
  method DeleteTotpVerification (line 295) | func (d *BoltDb) DeleteTotpVerification(userID int, totpID int) error {
  method AddEmailOtpVerification (line 299) | func (d *BoltDb) AddEmailOtpVerification(userID int, code string) (res d...
  method DeleteEmailOtpVerification (line 303) | func (d *BoltDb) DeleteEmailOtpVerification(userID int, totpID int) (err...

FILE: db/bolt/user_test.go
  function TestBoltDb_UpdateProjectUser (line 10) | func TestBoltDb_UpdateProjectUser(t *testing.T) {
  function TestGetUsers (line 41) | func TestGetUsers(t *testing.T) {
  function TestGetUser (line 60) | func TestGetUser(t *testing.T) {
  function TestGetUserCount (line 82) | func TestGetUserCount(t *testing.T) {
  function TestBoltDb_DeleteUser (line 115) | func TestBoltDb_DeleteUser(t *testing.T) {

FILE: db/bolt/view.go
  method GetView (line 5) | func (d *BoltDb) GetView(projectID int, viewID int) (view db.View, err e...
  method GetViews (line 10) | func (d *BoltDb) GetViews(projectID int) (views []db.View, err error) {
  method UpdateView (line 15) | func (d *BoltDb) UpdateView(view db.View) error {
  method CreateView (line 19) | func (d *BoltDb) CreateView(view db.View) (db.View, error) {
  method DeleteView (line 24) | func (d *BoltDb) DeleteView(projectID int, viewID int) error {
  method SetViewPositions (line 28) | func (d *BoltDb) SetViewPositions(projectID int, positions map[int]int) ...

FILE: db/bolt/view_test.go
  function TestGetViews (line 10) | func TestGetViews(t *testing.T) {
  function TestSetViewPositions (line 53) | func TestSetViewPositions(t *testing.T) {
  function TestGetView (line 130) | func TestGetView(t *testing.T) {
  function TestUpdateView (line 163) | func TestUpdateView(t *testing.T) {
  function TestCreateView (line 203) | func TestCreateView(t *testing.T) {
  function TestDeleteView (line 236) | func TestDeleteView(t *testing.T) {

FILE: db/config.go
  function ConvertFlatToNested (line 8) | func ConvertFlatToNested(flatMap map[string]string) map[string]any {
  function FillConfigFromDB (line 30) | func FillConfigFromDB(store Store) (err error) {

FILE: db/config_test.go
  function TestConfig_assignMapToStruct (line 9) | func TestConfig_assignMapToStruct(t *testing.T) {

FILE: db/factory/store.go
  function CreateStore (line 10) | func CreateStore() db.Store {

FILE: db/migration/migration.go
  type Migrator (line 8) | type Migrator struct
    method Migrate (line 17) | func (m *Migrator) Migrate() error {
    method migrateProject (line 25) | func (m *Migrator) migrateProject() error {

FILE: db/sql/SqlDb.go
  type SqlDbConnection (line 25) | type SqlDbConnection struct
    method Connect (line 38) | func (d *SqlDbConnection) Connect() {
    method Close (line 107) | func (d *SqlDbConnection) Close() {
    method prepareQueryWithDialect (line 134) | func (d *SqlDbConnection) prepareQueryWithDialect(query string, dialec...
    method PrepareDateQueryParam (line 155) | func (d *SqlDbConnection) PrepareDateQueryParam(paramName string) stri...
    method PrepareQuery (line 163) | func (d *SqlDbConnection) PrepareQuery(query string) string {
    method Insert (line 179) | func (d *SqlDbConnection) Insert(primaryKeyColumnName string, query st...
    method Exec (line 212) | func (d *SqlDbConnection) Exec(query string, args ...any) (sql.Result,...
    method ExecTx (line 217) | func (d *SqlDbConnection) ExecTx(tx *gorp.Transaction, query string, a...
    method SelectOne (line 222) | func (d *SqlDbConnection) SelectOne(holder any, query string, args ......
    method SelectAll (line 232) | func (d *SqlDbConnection) SelectAll(i any, query string, args ...any) ...
    method DeleteObject (line 237) | func (d *SqlDbConnection) DeleteObject(projectID int, props db.ObjectP...
    method GetObject (line 258) | func (d *SqlDbConnection) GetObject(projectID int, props db.ObjectProp...
    method GetObjectsByReferrer (line 279) | func (d *SqlDbConnection) GetObjectsByReferrer(
    method GetDialect (line 335) | func (d *SqlDbConnection) GetDialect() string {
  type SqlDb (line 30) | type SqlDb struct
    method Sql (line 34) | func (d *SqlDb) Sql() *gorp.DbMap {
    method GetConnection (line 339) | func (d *SqlDb) GetConnection() *SqlDbConnection {
    method GetDialect (line 343) | func (d *SqlDb) GetDialect() string {
    method Close (line 347) | func (d *SqlDb) Close(token string) {
    method PrepareQuery (line 408) | func (d *SqlDb) PrepareQuery(query string) string {
    method insert (line 412) | func (d *SqlDb) insert(primaryKeyColumnName string, query string, args...
    method exec (line 416) | func (d *SqlDb) exec(query string, args ...any) (sql.Result, error) {
    method execTx (line 420) | func (d *SqlDb) execTx(tx *gorp.Transaction, query string, args ...any...
    method selectOne (line 425) | func (d *SqlDb) selectOne(holder any, query string, args ...any) error {
    method selectAll (line 435) | func (d *SqlDb) selectAll(i any, query string, args ...any) ([]any, er...
    method getObject (line 484) | func (d *SqlDb) getObject(projectID int, props db.ObjectProps, objectI...
    method makeObjectsQuery (line 488) | func (d *SqlDb) makeObjectsQuery(projectID int, props db.ObjectProps, ...
    method getObjects (line 530) | func (d *SqlDb) getObjects(
    method deleteObject (line 556) | func (d *SqlDb) deleteObject(projectID int, props db.ObjectProps, obje...
    method PermanentConnection (line 560) | func (d *SqlDb) PermanentConnection() bool {
    method Connect (line 564) | func (d *SqlDb) Connect(_ string) {
    method getObjectRefs (line 568) | func (d *SqlDb) getObjectRefs(projectID int, objectProps db.ObjectProp...
    method getObjectRefsFrom (line 602) | func (d *SqlDb) getObjectRefsFrom(
    method IsInitialized (line 678) | func (d *SqlDb) IsInitialized() (bool, error) {
    method getObjectByReferrer (line 683) | func (d *SqlDb) getObjectByReferrer(referrerID int, referringObjectPro...
    method deleteByReferrer (line 698) | func (d *SqlDb) deleteByReferrer(referrerID int, referringObjectProps ...
    method deleteObjectByReferencedID (line 708) | func (d *SqlDb) deleteObjectByReferencedID(referencedID int, reference...
    method GetObject (line 753) | func (d *SqlDb) GetObject(props db.ObjectProps, ID int) (object any, e...
    method CreateObject (line 767) | func (d *SqlDb) CreateObject(props db.ObjectProps, object any) (newObj...
    method GetObjectsByForeignKeyQuery (line 791) | func (d *SqlDb) GetObjectsByForeignKeyQuery(props db.ObjectProps, fore...
    method GetAllObjectsByForeignKey (line 812) | func (d *SqlDb) GetAllObjectsByForeignKey(props db.ObjectProps, foreig...
    method GetAllObjects (line 827) | func (d *SqlDb) GetAllObjects(props db.ObjectProps) (objects any, err ...
    method GetReferencesForForeignKey (line 860) | func (d *SqlDb) GetReferencesForForeignKey(objectProps db.ObjectProps,...
    method GetObjectReferences (line 877) | func (d *SqlDb) GetObjectReferences(objectProps db.ObjectProps, referr...
    method GetTaskStats (line 917) | func (d *SqlDb) GetTaskStats(projectID int, templateID *int, unit db.T...
  function CreateTestStore (line 114) | func CreateTestStore() *SqlDb {
  function formatArgs (line 167) | func formatArgs(args []any) (formattedArgs []any) {
  function CreateDb (line 327) | func CreateDb(dialect string) *SqlDb {
  function getQueryForParams (line 351) | func getQueryForParams(q squirrel.SelectBuilder, prefix string, props db...
  function handleRollbackError (line 388) | func handleRollbackError(err error) {
  function validateMutationResult (line 397) | func validateMutationResult(res sql.Result, err error) error {
  function connect (line 439) | func connect() (*sql.DB, error) {
  function createDb (line 454) | func createDb() error {
  function InsertTemplateFromType (line 719) | func InsertTemplateFromType(typeInstance any) (string, []any) {

FILE: db/sql/SqlDb_test.go
  function TestValidatePort (line 8) | func TestValidatePort(t *testing.T) {

FILE: db/sql/access_key.go
  method GetAccessKey (line 10) | func (d *SqlDb) GetAccessKey(projectID int, accessKeyID int) (key db.Acc...
  method GetAccessKeyRefs (line 15) | func (d *SqlDb) GetAccessKeyRefs(projectID int, keyID int) (db.ObjectRef...
  method GetAccessKeys (line 19) | func (d *SqlDb) GetAccessKeys(projectID int, options db.GetAccessKeyOpti...
  method UpdateAccessKey (line 58) | func (d *SqlDb) UpdateAccessKey(key db.AccessKey) error {
  method CreateAccessKey (line 97) | func (d *SqlDb) CreateAccessKey(key db.AccessKey) (newKey db.AccessKey, ...
  method DeleteAccessKey (line 167) | func (d *SqlDb) DeleteAccessKey(projectID int, accessKeyID int) error {
  constant RekeyBatchSize (line 171) | RekeyBatchSize = 100
  method RekeyAccessKeys (line 173) | func (d *SqlDb) RekeyAccessKeys(oldKey string) (err error) {

FILE: db/sql/environment.go
  method GetEnvironment (line 7) | func (d *SqlDb) GetEnvironment(projectID int, environmentID int) (enviro...
  method GetEnvironmentRefs (line 12) | func (d *SqlDb) GetEnvironmentRefs(projectID int, environmentID int) (db...
  method GetEnvironments (line 16) | func (d *SqlDb) GetEnvironments(projectID int, params db.RetrieveQueryPa...
  method UpdateEnvironment (line 22) | func (d *SqlDb) UpdateEnvironment(env db.Environment) error {
  method CreateEnvironment (line 39) | func (d *SqlDb) CreateEnvironment(env db.Environment) (newEnv db.Environ...
  method DeleteEnvironment (line 68) | func (d *SqlDb) DeleteEnvironment(projectID int, environmentID int) error {
  method GetEnvironmentSecrets (line 72) | func (d *SqlDb) GetEnvironmentSecrets(projectID int, environmentID int) ...

FILE: db/sql/event.go
  method getEvents (line 9) | func (d *SqlDb) getEvents(q squirrel.SelectBuilder, params db.RetrieveQu...
  method CreateEvent (line 32) | func (d *SqlDb) CreateEvent(evt db.Event) (newEvent db.Event, err error) {
  method GetUserEvents (line 53) | func (d *SqlDb) GetUserEvents(userID int, params db.RetrieveQueryParams)...
  method GetEvents (line 64) | func (d *SqlDb) GetEvents(projectID int, params db.RetrieveQueryParams) ...
  method GetAllEvents (line 74) | func (d *SqlDb) GetAllEvents(params db.RetrieveQueryParams) ([]db.Event,...

FILE: db/sql/global_runner.go
  method GetRunnerByToken (line 11) | func (d *SqlDb) GetRunnerByToken(token string) (runner db.Runner, err er...
  method GetGlobalRunner (line 32) | func (d *SqlDb) GetGlobalRunner(runnerID int) (runner db.Runner, err err...
  method GetAllRunners (line 37) | func (d *SqlDb) GetAllRunners(activeOnly bool, globalOnly bool) (runners...
  method DeleteGlobalRunner (line 53) | func (d *SqlDb) DeleteGlobalRunner(runnerID int) (err error) {
  method ClearRunnerCache (line 58) | func (d *SqlDb) ClearRunnerCache(runner db.Runner) (err error) {
  method TouchRunner (line 76) | func (d *SqlDb) TouchRunner(runner db.Runner) (err error) {
  method UpdateRunner (line 94) | func (d *SqlDb) UpdateRunner(runner db.Runner) (err error) {
  method CreateRunner (line 107) | func (d *SqlDb) CreateRunner(runner db.Runner) (newRunner db.Runner, err...

FILE: db/sql/integration.go
  method CreateIntegration (line 8) | func (d *SqlDb) CreateIntegration(integration db.Integration) (newIntegr...
  method GetIntegrations (line 49) | func (d *SqlDb) GetIntegrations(projectID int, params db.RetrieveQueryPa...
  method GetIntegration (line 70) | func (d *SqlDb) GetIntegration(projectID int, integrationID int) (integr...
  method GetIntegrationRefs (line 89) | func (d *SqlDb) GetIntegrationRefs(projectID int, integrationID int) (re...
  method DeleteIntegration (line 98) | func (d *SqlDb) DeleteIntegration(projectID int, integrationID int) (err...
  method UpdateIntegration (line 116) | func (d *SqlDb) UpdateIntegration(integration db.Integration) (err error) {
  method CreateIntegrationExtractValue (line 169) | func (d *SqlDb) CreateIntegrationExtractValue(projectId int, value db.In...
  method GetIntegrationExtractValues (line 198) | func (d *SqlDb) GetIntegrationExtractValues(projectID int, params db.Ret...
  method GetIntegrationExtractValue (line 204) | func (d *SqlDb) GetIntegrationExtractValue(projectID int, valueID int, i...
  method GetIntegrationExtractValueRefs (line 220) | func (d *SqlDb) GetIntegrationExtractValueRefs(projectID int, valueID in...
  method DeleteIntegrationExtractValue (line 225) | func (d *SqlDb) DeleteIntegrationExtractValue(projectID int, valueID int...
  method UpdateIntegrationExtractValue (line 229) | func (d *SqlDb) UpdateIntegrationExtractValue(projectID int, integration...
  method CreateIntegrationMatcher (line 249) | func (d *SqlDb) CreateIntegrationMatcher(projectID int, matcher db.Integ...
  method GetIntegrationMatchers (line 279) | func (d *SqlDb) GetIntegrationMatchers(projectID int, params db.Retrieve...
  method GetIntegrationMatcher (line 295) | func (d *SqlDb) GetIntegrationMatcher(projectID int, matcherID int, inte...
  method GetIntegrationMatcherRefs (line 311) | func (d *SqlDb) GetIntegrationMatcherRefs(projectID int, matcherID int, ...
  method DeleteIntegrationMatcher (line 317) | func (d *SqlDb) DeleteIntegrationMatcher(projectID int, matcherID int, i...
  method UpdateIntegrationMatcher (line 321) | func (d *SqlDb) UpdateIntegrationMatcher(projectID int, integrationMatch...

FILE: db/sql/integration_alias.go
  method CreateIntegrationAlias (line 8) | func (d *SqlDb) CreateIntegrationAlias(alias db.IntegrationAlias) (res d...
  method GetIntegrationAliases (line 26) | func (d *SqlDb) GetIntegrationAliases(projectID int, integrationID *int)...
  method GetIntegrationsByAlias (line 47) | func (d *SqlDb) GetIntegrationsByAlias(alias string) (res []db.Integrati...
  method DeleteIntegrationAlias (line 99) | func (d *SqlDb) DeleteIntegrationAlias(projectID int, aliasID int) error {

FILE: db/sql/inventory.go
  method GetInventory (line 8) | func (d *SqlDb) GetInventory(projectID int, inventoryID int) (inventory ...
  method GetInventories (line 14) | func (d *SqlDb) GetInventories(projectID int, params db.RetrieveQueryPar...
  method GetInventoryRefs (line 26) | func (d *SqlDb) GetInventoryRefs(projectID int, inventoryID int) (db.Obj...
  method DeleteInventory (line 30) | func (d *SqlDb) DeleteInventory(projectID int, inventoryID int) error {
  method UpdateInventory (line 34) | func (d *SqlDb) UpdateInventory(inventory db.Inventory) error {
  method CreateInventory (line 60) | func (d *SqlDb) CreateInventory(inventory db.Inventory) (newInventory db...

FILE: db/sql/migration.go
  function getVersionPath (line 32) | func getVersionPath(version db.Migration) string {
  function getVersionErrPath (line 37) | func getVersionErrPath(version db.Migration) string {
  function getVersionSQL (line 43) | func getVersionSQL(dialect string, name string, ignoreErrors bool) (quer...
  function getDialectConfig (line 67) | func getDialectConfig(dialect string) interface{} {
  function preprocessSqlDialect (line 88) | func preprocessSqlDialect(dialect string, sql string) (string, error) {
  method prepareMigration (line 105) | func (d *SqlDb) prepareMigration(query string) string {
  method IsMigrationApplied (line 151) | func (d *SqlDb) IsMigrationApplied(migration db.Migration) (bool, error) {
  method ApplyMigration (line 174) | func (d *SqlDb) ApplyMigration(migration db.Migration) error {
  method TryRollbackMigration (line 254) | func (d *SqlDb) TryRollbackMigration(version db.Migration) {

FILE: db/sql/migration_2_10_24.go
  type migration_2_10_24 (line 5) | type migration_2_10_24 struct
    method PreApply (line 9) | func (m migration_2_10_24) PreApply(tx *gorp.Transaction) error {

FILE: db/sql/migration_2_8_28.go
  type migration_2_8_26 (line 8) | type migration_2_8_26 struct
    method PostApply (line 12) | func (m migration_2_8_26) PostApply(tx *gorp.Transaction) error {

FILE: db/sql/migration_2_8_42.go
  type migration_2_8_42 (line 5) | type migration_2_8_42 struct
    method PostApply (line 9) | func (m migration_2_8_42) PostApply(tx *gorp.Transaction) error {

FILE: db/sql/migrations/v0.0.0.sql
  type `user` (line 1) | create table `user` (
  type `project` (line 13) | create table `project` (
  type `project__user` (line 19) | create table `project__user` (
  type `access_key` (line 29) | create table `access_key` (
  type `project__repository` (line 41) | create table `project__repository` (
  type `project__inventory` (line 51) | create table `project__inventory` (
  type `project__environment` (line 62) | create table `project__environment` (
  type `project__template` (line 71) | create table `project__template` (
  type `project__template_schedule` (line 87) | create table `project__template_schedule` (
  type `task` (line 94) | create table `task` (
  type `task__output` (line 104) | create table `task__output` (

FILE: db/sql/migrations/v1.2.0.sql
  type `user__token` (line 1) | create table `user__token` (

FILE: db/sql/migrations/v1.4.0.sql
  type `event` (line 1) | CREATE TABLE `event` (

FILE: db/sql/migrations/v1.5.0.sql
  type `session` (line 1) | CREATE TABLE `session` (
  type `user_id` (line 11) | CREATE INDEX `user_id` ON `session`(`user_id`)
  type `expired` (line 13) | CREATE INDEX `expired` ON `session`(`expired`)

FILE: db/sql/migrations/v2.10.24.sql
  type `project__template_vault` (line 1) | create table `project__template_vault` (

FILE: db/sql/migrations/v2.11.5.sql
  type project__terraform_inventory_alias (line 1) | create table project__terraform_inventory_alias(
  type project__terraform_inventory_state (line 11) | create table project__terraform_inventory_state(

FILE: db/sql/migrations/v2.12.0.sql
  type user__totp (line 1) | create table user__totp(

FILE: db/sql/migrations/v2.14.12.sql
  type task__output_time_idx (line 1) | create index task__output_time_idx on task__output (time)

FILE: db/sql/migrations/v2.15.0.sql
  type task__stage (line 1) | create table task__stage
  type task__stage_result (line 15) | create table task__stage_result

FILE: db/sql/migrations/v2.15.1.sqlite.sql
  type "option" (line 1) | CREATE TABLE "option" (
  type project (line 6) | CREATE TABLE project (
  type project__environment (line 16) | CREATE TABLE project__environment (
  type project__environment__project__environment_project_id (line 25) | CREATE INDEX project__environment__project__environment_project_id
  type project__view (line 28) | CREATE TABLE project__view (
  type project__view__project__view_project_id (line 35) | CREATE INDEX project__view__project__view_project_id
  type runner (line 38) | CREATE TABLE runner (
  type runner__runner__project_id (line 52) | CREATE INDEX runner__runner__project_id
  type session (line 55) | CREATE TABLE session (
  type session__session__expired (line 68) | CREATE INDEX session__session__expired
  type session__session__user_id (line 71) | CREATE INDEX session__session__user_id
  type user (line 74) | CREATE TABLE user (
  type access_key (line 87) | CREATE TABLE access_key (
  type access_key__environment_id (line 97) | CREATE INDEX access_key__environment_id
  type access_key__project_id (line 100) | CREATE INDEX access_key__project_id
  type access_key__user_id (line 103) | CREATE INDEX access_key__user_id
  type event (line 106) | CREATE TABLE event (
  type event__project_id (line 116) | CREATE INDEX event__project_id
  type event__user_id (line 119) | CREATE INDEX event__user_id
  type event_backup_5784568 (line 122) | CREATE TABLE event_backup_5784568 (
  type event_backup_5784568__user_id (line 131) | CREATE INDEX event_backup_5784568__user_id
  type project__repository (line 134) | CREATE TABLE project__repository (
  type project__repository__project_id (line 143) | CREATE INDEX project__repository__project_id
  type project__repository__ssh_key_id (line 146) | CREATE INDEX project__repository__ssh_key_id
  type project__inventory (line 149) | CREATE TABLE project__inventory (
  type project__inventory__become_key_id (line 162) | CREATE INDEX project__inventory__become_key_id
  type project__inventory__holder_id (line 165) | CREATE INDEX project__inventory__holder_id
  type project__inventory__project_id (line 168) | CREATE INDEX project__inventory__project_id
  type project__inventory__repository_id (line 171) | CREATE INDEX project__inventory__repository_id
  type project__inventory__ssh_key_id (line 174) | CREATE INDEX project__inventory__ssh_key_id
  type project__template (line 177) | CREATE TABLE project__template (
  type project__template__build_template_id (line 203) | CREATE INDEX project__template__build_template_id
  type project__template__environment_id (line 206) | CREATE INDEX project__template__environment_id
  type project__template__inventory_id (line 209) | CREATE INDEX project__template__inventory_id
  type project__template__project_id (line 212) | CREATE INDEX project__template__project_id
  type project__template__repository_id (line 215) | CREATE INDEX project__template__repository_id
  type project__template__view_id (line 218) | CREATE INDEX project__template__view_id
  type project__integration (line 221) | CREATE TABLE project__integration (
  type project__integration__auth_secret_id (line 233) | CREATE INDEX project__integration__auth_secret_id
  type project__integration__project_id (line 236) | CREATE INDEX project__integration__project_id
  type project__integration__template_id (line 239) | CREATE INDEX project__integration__template_id
  type project__integration_alias (line 242) | CREATE TABLE project__integration_alias (
  type project__integration_alias__integration_id (line 249) | CREATE INDEX project__integration_alias__integration_id
  type project__integration_alias__project_id (line 252) | CREATE INDEX project__integration_alias__project_id
  type project__integration_extract_value (line 255) | CREATE TABLE project__integration_extract_value (
  type project__integration_extract_value__integration_id (line 266) | CREATE INDEX project__integration_extract_value__integration_id
  type project__integration_matcher (line 269) | CREATE TABLE project__integration_matcher (
  type project__integration_matcher__integration_id (line 280) | CREATE INDEX project__integration_matcher__integration_id
  type project__schedule (line 283) | CREATE TABLE project__schedule (
  type project__schedule__project_id (line 294) | CREATE INDEX project__schedule__project_id
  type project__schedule__repository_id (line 297) | CREATE INDEX project__schedule__repository_id
  type project__schedule__template_id (line 300) | CREATE INDEX project__schedule__template_id
  type project__template_vault (line 303) | CREATE TABLE project__template_vault (
  type project__template_vault__project_id (line 314) | CREATE INDEX project__template_vault__project_id
  type project__template_vault__vault_key_id (line 317) | CREATE INDEX project__template_vault__vault_key_id
  type project__terraform_inventory_alias (line 320) | CREATE TABLE project__terraform_inventory_alias (
  type project__terraform_inventory_alias__auth_key_id (line 327) | CREATE INDEX project__terraform_inventory_alias__auth_key_id
  type project__terraform_inventory_alias__inventory_id (line 330) | CREATE INDEX project__terraform_inventory_alias__inventory_id
  type project__terraform_inventory_alias__project_id (line 333) | CREATE INDEX project__terraform_inventory_alias__project_id
  type project__user (line 336) | CREATE TABLE project__user (
  type project__user__user_id (line 343) | CREATE INDEX project__user__user_id
  type task (line 346) | CREATE TABLE task (
  type task__integration_id (line 370) | CREATE INDEX task__integration_id
  type task__inventory_id (line 373) | CREATE INDEX task__inventory_id
  type task__project_id (line 376) | CREATE INDEX task__project_id
  type task__schedule_id (line 379) | CREATE INDEX task__schedule_id
  type task__template_id (line 382) | CREATE INDEX task__template_id
  type project__terraform_inventory_state (line 385) | CREATE TABLE project__terraform_inventory_state (
  type project__terraform_inventory_state__inventory_id (line 394) | CREATE INDEX project__terraform_inventory_state__inventory_id
  type project__terraform_inventory_state__project_id (line 397) | CREATE INDEX project__terraform_inventory_state__project_id
  type project__terraform_inventory_state__task_id (line 400) | CREATE INDEX project__terraform_inventory_state__task_id
  type task__output (line 403) | CREATE TABLE task__output (
  type task__output__task__output_time_idx (line 410) | CREATE INDEX task__output__task__output_time_idx
  type task__output__task_id (line 413) | CREATE INDEX task__output__task_id
  type task__stage (line 416) | CREATE TABLE task__stage (
  type task__stage__end_output_id (line 426) | CREATE INDEX task__stage__end_output_id
  type task__stage__start_output_id (line 429) | CREATE INDEX task__stage__start_output_id
  type task__stage__task_id (line 432) | CREATE INDEX task__stage__task_id
  type task__stage_result (line 435) | CREATE TABLE task__stage_result (
  type task__stage_result__stage_id (line 442) | CREATE INDEX task__stage_result__stage_id
  type task__stage_result__task_id (line 445) | CREATE INDEX task__stage_result__task_id
  type user__token (line 448) | CREATE TABLE user__token (
  type user__token__user_id (line 455) | CREATE INDEX user__token__user_id
  type user__totp (line 458) | CREATE TABLE user__totp (

FILE: db/sql/migrations/v2.15.2.sql
  type user__email_otp (line 1) | create table user__email_otp(

FILE: db/sql/migrations/v2.15.3.sql
  type task__ansible_error (line 1) | create table task__ansible_error(
  type task__ansible_host (line 10) | create table task__ansible_host(

FILE: db/sql/migrations/v2.16.0.sql
  type project__secret_storage (line 6) | create table project__secret_storage (

FILE: db/sql/migrations/v2.16.2.sql
  type project__task_params (line 1) | create table project__task_params

FILE: db/sql/migrations/v2.16.3.sql
  type project__invite (line 1) | create table project__invite

FILE: db/sql/migrations/v2.16.8.err.sql
  type task__stage__start_output_id (line 5) | create index if not exists task__stage__start_output_id on `task__stage`...
  type task__stage__end_output_id (line 6) | create index if not exists task__stage__end_output_id on `task__stage`(`...

FILE: db/sql/migrations/v2.17.1.sql
  type role (line 1) | create table role
  type project__template_role (line 10) | create table project__template_role

FILE: db/sql/migrations/v2.17.15.sql
  type task__output_task_id_idx (line 6) | create index if not exists task__output_task_id_idx on task__output (tas...
  type task_template_id_idx (line 7) | create index if not exists task_template_id_idx on task (template_id)
  type task_project_id_idx (line 8) | create index if not exists task_project_id_idx on task (project_id)

FILE: db/sql/migrations/v2.2.1.sql
  type task__output (line 3) | create table task__output

FILE: db/sql/migrations/v2.3.1.sql
  type session (line 3) | create table session
  type expired (line 18) | create index expired
  type user_id (line 21) | create index user_id

FILE: db/sql/migrations/v2.3.2.sql
  type user__token (line 5) | create table user__token

FILE: db/sql/migrations/v2.7.13.sql
  type `project__schedule` (line 3) | create table `project__schedule`

FILE: db/sql/migrations/v2.8.20.sql
  type `event` (line 3) | create table `event`

FILE: db/sql/migrations/v2.8.38.sql
  type project__schedule (line 21) | create table project__schedule

FILE: db/sql/migrations/v2.8.39.sql
  type `project__template_backup_385025846` (line 7) | create table `project__template_backup_385025846` (

FILE: db/sql/migrations/v2.8.8.sql
  type `project__view` (line 1) | create table `project__view` (

FILE: db/sql/migrations/v2.9.6.sql
  type runner (line 1) | create table runner

FILE: db/sql/migrations/v2.9.60.sql
  type project__integration (line 1) | create table project__integration (
  type project__integration_extractor (line 15) | create table project__integration_extractor (
  type project__integration_extract_value (line 23) | create table project__integration_extract_value (
  type project__integration_matcher (line 35) | create table project__integration_matcher (

FILE: db/sql/migrations/v2.9.61.sql
  type project__integration (line 6) | create table project__integration (
  type project__integration_extract_value (line 21) | create table project__integration_extract_value (
  type project__integration_matcher (line 33) | create table project__integration_matcher (
  type project__integration_alias (line 46) | create table project__integration_alias (

FILE: db/sql/migrations/v2.9.62.sql
  type `option` (line 7) | create table `option` (

FILE: db/sql/option.go
  method SetOption (line 9) | func (d *SqlDb) SetOption(key string, value string) error {
  method GetOptions (line 24) | func (d *SqlDb) GetOptions(params db.RetrieveQueryParams) (res map[strin...
  method getOption (line 53) | func (d *SqlDb) getOption(key string) (value string, err error) {
  method GetOption (line 73) | func (d *SqlDb) GetOption(key string) (value string, err error) {
  method DeleteOption (line 84) | func (d *SqlDb) DeleteOption(key string) (err error) {
  method DeleteOptions (line 95) | func (d *SqlDb) DeleteOptions(filter string) (err error) {

FILE: db/sql/project.go
  method CreateProject (line 9) | func (d *SqlDb) CreateProject(project db.Project) (newProject db.Project...
  method GetAllProjects (line 26) | func (d *SqlDb) GetAllProjects() (projects []db.Project, err error) {
  method GetProjects (line 42) | func (d *SqlDb) GetProjects(userID int) (projects []db.Project, err erro...
  method GetProject (line 60) | func (d *SqlDb) GetProject(projectID int) (project db.Project, err error) {
  method DeleteProject (line 75) | func (d *SqlDb) DeleteProject(projectID int) error {
  method UpdateProject (line 112) | func (d *SqlDb) UpdateProject(project db.Project) error {

FILE: db/sql/project_invite.go
  method GetProjectInvites (line 10) | func (d *SqlDb) GetProjectInvites(projectID int, params db.RetrieveQuery...
  method CreateProjectInvite (line 105) | func (d *SqlDb) CreateProjectInvite(invite db.ProjectInvite) (newInvite ...
  method GetProjectInvite (line 128) | func (d *SqlDb) GetProjectInvite(projectID int, inviteID int) (invite db...
  method GetProjectInviteByToken (line 136) | func (d *SqlDb) GetProjectInviteByToken(token string) (invite db.Project...
  method UpdateProjectInvite (line 143) | func (d *SqlDb) UpdateProjectInvite(invite db.ProjectInvite) error {
  method DeleteProjectInvite (line 152) | func (d *SqlDb) DeleteProjectInvite(projectID int, inviteID int) error {

FILE: db/sql/repository.go
  method GetRepository (line 8) | func (d *SqlDb) GetRepository(projectID int, repositoryID int) (db.Repos...
  method GetRepositoryRefs (line 21) | func (d *SqlDb) GetRepositoryRefs(projectID int, repositoryID int) (db.O...
  method GetRepositories (line 25) | func (d *SqlDb) GetRepositories(projectID int, params db.RetrieveQueryPa...
  method UpdateRepository (line 58) | func (d *SqlDb) UpdateRepository(repository db.Repository) error {
  method CreateRepository (line 76) | func (d *SqlDb) CreateRepository(repository db.Repository) (newRepo db.R...
  method DeleteRepository (line 101) | func (d *SqlDb) DeleteRepository(projectID int, repositoryId int) error {

FILE: db/sql/role.go
  method GetGlobalRoleBySlug (line 5) | func (d *SqlDb) GetGlobalRoleBySlug(slug string) (db.Role, error) {
  method GetProjectRoles (line 11) | func (d *SqlDb) GetProjectRoles(projectID int) ([]db.Role, error) {
  method GetGlobalRoles (line 17) | func (d *SqlDb) GetGlobalRoles() ([]db.Role, error) {
  method UpdateRole (line 23) | func (d *SqlDb) UpdateRole(role db.Role) error {
  method CreateRole (line 32) | func (d *SqlDb) CreateRole(role db.Role) (db.Role, error) {
  method DeleteRole (line 48) | func (d *SqlDb) DeleteRole(slug string) error {
  method GetProjectRole (line 53) | func (d *SqlDb) GetProjectRole(projectID int, slug string) (db.Role, err...
  method GetProjectOrGlobalRoleBySlug (line 59) | func (d *SqlDb) GetProjectOrGlobalRoleBySlug(projectID int, slug string)...

FILE: db/sql/runner.go
  function validateTag (line 9) | func validateTag(tag string) error {
  function makePropsNonGlobal (line 17) | func makePropsNonGlobal(props db.ObjectProps) (res db.ObjectProps) {
  method GetRunner (line 25) | func (d *SqlDb) GetRunner(projectID int, runnerID int) (runner db.Runner...
  method GetRunners (line 30) | func (d *SqlDb) GetRunners(projectID int, activeOnly bool, tag *string) ...
  method DeleteRunner (line 52) | func (d *SqlDb) DeleteRunner(projectID int, runnerID int) (err error) {
  method GetRunnerCount (line 57) | func (d *SqlDb) GetRunnerCount() (res int, err error) {
  method GetRunnerTags (line 74) | func (d *SqlDb) GetRunnerTags(projectID int) (res []db.RunnerTag, err er...

FILE: db/sql/schedule.go
  method CreateSchedule (line 8) | func (d *SqlDb) CreateSchedule(schedule db.Schedule) (newSchedule db.Sch...
  method SetScheduleLastCommitHash (line 49) | func (d *SqlDb) SetScheduleLastCommitHash(projectID int, scheduleID int,...
  method UpdateSchedule (line 59) | func (d *SqlDb) UpdateSchedule(schedule db.Schedule) (err error) {
  method GetSchedule (line 116) | func (d *SqlDb) GetSchedule(projectID int, scheduleID int) (schedule db....
  method DeleteSchedule (line 140) | func (d *SqlDb) DeleteSchedule(projectID int, scheduleID int) (err error) {
  method GetSchedules (line 159) | func (d *SqlDb) GetSchedules() (schedules []db.Schedule, err error) {
  method GetProjectSchedules (line 164) | func (d *SqlDb) GetProjectSchedules(projectID int, includeTaskParams boo...
  method GetTemplateSchedules (line 197) | func (d *SqlDb) GetTemplateSchedules(projectID int, templateID int, only...
  method SetScheduleActive (line 217) | func (d *SqlDb) SetScheduleActive(projectID int, scheduleID int, active ...
  method SetScheduleCommitHash (line 225) | func (d *SqlDb) SetScheduleCommitHash(projectID int, scheduleID int, has...

FILE: db/sql/secret_storage.go
  method GetSecretStorages (line 5) | func (d *SqlDb) GetSecretStorages(projectID int) (storages []db.SecretSt...
  method CreateSecretStorage (line 25) | func (d *SqlDb) CreateSecretStorage(storage db.SecretStorage) (newStorag...
  method GetSecretStorage (line 45) | func (d *SqlDb) GetSecretStorage(projectID int, storageID int) (key db.S...
  method DeleteSecretStorage (line 52) | func (d *SqlDb) DeleteSecretStorage(projectID int, storageID int) error {
  method GetSecretStorageRefs (line 56) | func (d *SqlDb) GetSecretStorageRefs(projectID int, storageID int) (db.O...
  method UpdateSecretStorage (line 60) | func (d *SqlDb) UpdateSecretStorage(storage db.SecretStorage) error {

FILE: db/sql/session.go
  method SetSessionVerificationMethod (line 11) | func (d *SqlDb) SetSessionVerificationMethod(userID int, sessionID int, ...
  method VerifySession (line 15) | func (d *SqlDb) VerifySession(userID int, sessionID int) error {
  method CreateSession (line 21) | func (d *SqlDb) CreateSession(session db.Session) (db.Session, error) {
  method CreateAPIToken (line 26) | func (d *SqlDb) CreateAPIToken(token db.APIToken) (db.APIToken, error) {
  method GetAPIToken (line 32) | func (d *SqlDb) GetAPIToken(tokenID string) (token db.APIToken, err erro...
  method ExpireAPIToken (line 38) | func (d *SqlDb) ExpireAPIToken(userID int, tokenID string) error {
  function validateAPIToken (line 42) | func validateAPIToken(token string) error {
  method DeleteAPIToken (line 49) | func (d *SqlDb) DeleteAPIToken(userID int, tokenPrefix string) (err erro...
  method GetSession (line 61) | func (d *SqlDb) GetSession(userID int, sessionID int) (session db.Sessio...
  method ExpireSession (line 67) | func (d *SqlDb) ExpireSession(userID int, sessionID int) error {
  method TouchSession (line 73) | func (d *SqlDb) TouchSession(userID int, sessionID int) error {
  method GetAPITokens (line 79) | func (d *SqlDb) GetAPITokens(userID int) (tokens []db.APIToken, err erro...

FILE: db/sql/task.go
  method CreateTaskStage (line 12) | func (d *SqlDb) CreateTaskStage(stage db.TaskStage) (res db.TaskStage, e...
  method EndTaskStage (line 32) | func (d *SqlDb) EndTaskStage(taskID int, stageID int, end time.Time) (er...
  method CreateTaskStageResult (line 42) | func (d *SqlDb) CreateTaskStageResult(taskID int, stageID int, result ma...
  method getTaskStage (line 60) | func (d *SqlDb) getTaskStage(taskID int, stageID int) (res db.TaskStage,...
  method validateTask (line 70) | func (d *SqlDb) validateTask(projectID int, taskID int) error {
  method GetTaskStageResult (line 76) | func (d *SqlDb) GetTaskStageResult(projectID int, taskID int, stageID in...
  method getTaskStages (line 91) | func (d *SqlDb) getTaskStages(projectID int, taskID int, stageType *db.T...
  method GetTaskStages (line 116) | func (d *SqlDb) GetTaskStages(projectID int, taskID int) ([]db.TaskStage...
  method clearTasks (line 120) | func (d *SqlDb) clearTasks(projectID int, templateID int, maxTasks int) {
  method CreateTask (line 169) | func (d *SqlDb) CreateTask(task db.Task, maxTasks int) (newTask db.Task,...
  method UpdateTask (line 191) | func (d *SqlDb) UpdateTask(task db.Task) error {
  method CreateTaskOutput (line 218) | func (d *SqlDb) CreateTaskOutput(output db.TaskOutput) (db.TaskOutput, e...
  method InsertTaskOutputBatch (line 230) | func (d *SqlDb) InsertTaskOutputBatch(output []db.TaskOutput) error {
  method getTasks (line 255) | func (d *SqlDb) getTasks(projectID int, templateID *int, taskIDs []int, ...
  method GetTask (line 307) | func (d *SqlDb) GetTask(projectID int, taskID int) (task db.Task, err er...
  method GetTemplateTasks (line 324) | func (d *SqlDb) GetTemplateTasks(projectID int, templateID int, params d...
  method GetProjectTasks (line 329) | func (d *SqlDb) GetProjectTasks(projectID int, params db.RetrieveQueryPa...
  method DeleteTaskWithOutputs (line 335) | func (d *SqlDb) DeleteTaskWithOutputs(projectID int, taskID int) (err er...
  method GetTaskOutputs (line 353) | func (d *SqlDb) GetTaskOutputs(projectID int, taskID int, params db.Retr...
  method GetTaskStageOutputs (line 377) | func (d *SqlDb) GetTaskStageOutputs(projectID int, taskID int, stageID i...
  method GetNodeCount (line 397) | func (d *SqlDb) GetNodeCount() (int, error) {
  method GetUiCount (line 401) | func (d *SqlDb) GetUiCount() (int, error) {

FILE: db/sql/template.go
  method CreateTemplate (line 13) | func (d *SqlDb) CreateTemplate(template db.Template) (newTemplate db.Tem...
  method UpdateTemplate (line 83) | func (d *SqlDb) UpdateTemplate(template db.Template) error {
  method SetTemplateDescription (line 146) | func (d *SqlDb) SetTemplateDescription(projectID int, templateID int, de...
  method getTemplates (line 159) | func (d *SqlDb) getTemplates(
  method GetTemplatesWithPermissions (line 352) | func (d *SqlDb) GetTemplatesWithPermissions(projectID int, userID int, f...
  method GetTemplates (line 356) | func (d *SqlDb) GetTemplates(projectID int, filter db.TemplateFilter, pa...
  method GetTemplate (line 371) | func (d *SqlDb) GetTemplate(projectID int, templateID int) (template db....
  method DeleteTemplate (line 386) | func (d *SqlDb) DeleteTemplate(projectID int, templateID int) error {
  method GetTemplateRefs (line 391) | func (d *SqlDb) GetTemplateRefs(projectID int, templateID int) (db.Objec...
  method GetTemplateRole (line 395) | func (d *SqlDb) GetTemplateRole(projectID int, templateID int, id int) (...
  method GetTemplatePermission (line 413) | func (d *SqlDb) GetTemplatePermission(projectID int, templateID int, use...
  method GetTemplateRoles (line 465) | func (d *SqlDb) GetTemplateRoles(projectID int, templateID int) (roles [...
  method CreateTemplateRole (line 479) | func (d *SqlDb) CreateTemplateRole(role db.TemplateRolePerm) (newRole db...
  method DeleteTemplateRole (line 496) | func (d *SqlDb) DeleteTemplateRole(projectID int, templateID int, id int...
  method UpdateTemplateRole (line 500) | func (d *SqlDb) UpdateTemplateRole(role db.TemplateRolePerm) error {

FILE: db/sql/template_vault.go
  method GetTemplateVaults (line 9) | func (d *SqlDb) GetTemplateVaults(projectID int, templateID int) (vaults...
  method CreateTemplateVault (line 25) | func (d *SqlDb) CreateTemplateVault(vault db.TemplateVault) (newVault db...
  method UpdateTemplateVaults (line 44) | func (d *SqlDb) UpdateTemplateVaults(projectID int, templateID int, vaul...

FILE: db/sql/user.go
  method CreateUserWithoutPassword (line 13) | func (d *SqlDb) CreateUserWithoutPassword(user db.User) (newUser db.User...
  method CreateUser (line 33) | func (d *SqlDb) CreateUser(user db.UserWithPwd) (newUser db.User, err er...
  method ImportUser (line 59) | func (d *SqlDb) ImportUser(user db.UserWithPwd) (newUser db.User, err er...
  method DeleteUser (line 77) | func (d *SqlDb) DeleteUser(userID int) error {
  method UpdateUser (line 82) | func (d *SqlDb) UpdateUser(user db.UserWithPwd) error {
  method SetUserPassword (line 116) | func (d *SqlDb) SetUserPassword(userID int, password string) error {
  method CreateProjectUser (line 127) | func (d *SqlDb) CreateProjectUser(projectUser db.ProjectUser) (newProjec...
  method GetProjectUser (line 142) | func (d *SqlDb) GetProjectUser(projectID, userID int) (db.ProjectUser, e...
  method GetProjectUsers (line 153) | func (d *SqlDb) GetProjectUsers(projectID int, params db.RetrieveQueryPa...
  method UpdateProjectUser (line 191) | func (d *SqlDb) UpdateProjectUser(projectUser db.ProjectUser) error {
  method DeleteProjectUser (line 201) | func (d *SqlDb) DeleteProjectUser(projectID, userID int) error {
  method GetUser (line 207) | func (d *SqlDb) GetUser(userID int) (user db.User, err error) {
  method GetProUserCount (line 240) | func (d *SqlDb) GetProUserCount() (count int, err error) {
  method GetUserCount (line 249) | func (d *SqlDb) GetUserCount() (count int, err error) {
  function escapeLike (line 258) | func escapeLike(s string) string {
  method GetUsers (line 266) | func (d *SqlDb) GetUsers(params db.RetrieveQueryParams) (users []db.User...
  method GetUserByLoginOrEmail (line 290) | func (d *SqlDb) GetUserByLoginOrEmail(login string, email string) (user ...
  method GetAllAdmins (line 325) | func (d *SqlDb) GetAllAdmins() (users []db.User, err error) {
  method AddTotpVerification (line 331) | func (d *SqlDb) AddTotpVerification(userID int, url string, recoveryHash...
  method DeleteTotpVerification (line 359) | func (d *SqlDb) DeleteTotpVerification(userID int, totpID int) error {
  method insertEmailOtp (line 364) | func (d *SqlDb) insertEmailOtp(userID int, code string) (totp db.UserEma...
  method AddEmailOtpVerification (line 390) | func (d *SqlDb) AddEmailOtpVerification(userID int, code string) (res db...
  method DeleteEmailOtpVerification (line 408) | func (d *SqlDb) DeleteEmailOtpVerification(userID int, totpID int) error {

FILE: db/sql/view.go
  method GetView (line 5) | func (d *SqlDb) GetView(projectID int, viewID int) (view db.View, err er...
  method GetViews (line 10) | func (d *SqlDb) GetViews(projectID int) (views []db.View, err error) {
  method UpdateView (line 15) | func (d *SqlDb) UpdateView(view db.View) error {
  method CreateView (line 32) | func (d *SqlDb) CreateView(view db.View) (newView db.View, err error) {
  method DeleteView (line 55) | func (d *SqlDb) DeleteView(projectID int, viewID int) error {
  method SetViewPositions (line 59) | func (d *SqlDb) SetViewPositions(projectID int, positions map[int]int) e...

FILE: db_lib/AccessKeyInstaller.go
  type AccessKeyInstaller (line 9) | type AccessKeyInstaller interface

FILE: db_lib/AnsibleApp.go
  function getMD5Hash (line 14) | func getMD5Hash(filepath string) (string, error) {
  function hasRequirementsChanges (line 28) | func hasRequirementsChanges(requirementsFilePath string, requirementsHas...
  function writeMD5Hash (line 42) | func writeMD5Hash(requirementsFile string, requirementsHashFile string) ...
  type AnsibleApp (line 51) | type AnsibleApp struct
    method SetLogger (line 58) | func (t *AnsibleApp) SetLogger(logger task_logger.Logger) task_logger....
    method Run (line 64) | func (t *AnsibleApp) Run(args LocalAppRunningArgs) error {
    method Log (line 70) | func (t *AnsibleApp) Log(msg string) {
    method Clear (line 74) | func (t *AnsibleApp) Clear() {
    method InstallRequirements (line 77) | func (t *AnsibleApp) InstallRequirements(args LocalAppInstallingArgs) ...
    method getRepoPath (line 87) | func (t *AnsibleApp) getRepoPath() string {
    method installGalaxyRequirementsFile (line 91) | func (t *AnsibleApp) installGalaxyRequirementsFile(requirementsType Ga...
    method GetPlaybookDir (line 119) | func (t *AnsibleApp) GetPlaybookDir() string {
    method installRolesRequirements (line 132) | func (t *AnsibleApp) installRolesRequirements(environmentVars []string...
    method installCollectionsRequirements (line 152) | func (t *AnsibleApp) installCollectionsRequirements(environmentVars []...
    method runGalaxy (line 172) | func (t *AnsibleApp) runGalaxy(args []string, environmentVars []string...
  type GalaxyRequirementsType (line 125) | type GalaxyRequirementsType
  constant GalaxyRole (line 128) | GalaxyRole       GalaxyRequirementsType = "role"
  constant GalaxyCollection (line 129) | GalaxyCollection GalaxyRequirementsType = "collection"

FILE: db_lib/AnsiblePlaybook.go
  type AnsiblePlaybook (line 16) | type AnsiblePlaybook struct
    method makeCmd (line 22) | func (p AnsiblePlaybook) makeCmd(command string, args []string, enviro...
    method runCmd (line 45) | func (p AnsiblePlaybook) runCmd(command string, args []string, environ...
    method RunPlaybook (line 54) | func (p AnsiblePlaybook) RunPlaybook(args []string, environmentVars []...
    method RunGalaxy (line 96) | func (p AnsiblePlaybook) RunGalaxy(args []string, environmentVars []st...
    method GetFullPath (line 100) | func (p AnsiblePlaybook) GetFullPath() (path string) {

FILE: db_lib/AppFactory.go
  function CreateApp (line 8) | func CreateApp(template db.Template, repository db.Repository, inventory...

FILE: db_lib/CmdGitClient.go
  type CmdGitClient (line 17) | type CmdGitClient struct
    method makeCmd (line 21) | func (c CmdGitClient) makeCmd(
    method run (line 60) | func (c CmdGitClient) run(r GitRepository, targetDir GitRepositoryDirT...
    method output (line 77) | func (c CmdGitClient) output(r GitRepository, targetDir GitRepositoryD...
    method Clone (line 93) | func (c CmdGitClient) Clone(r GitRepository) error {
    method Pull (line 112) | func (c CmdGitClient) Pull(r GitRepository) error {
    method Checkout (line 122) | func (c CmdGitClient) Checkout(r GitRepository, target string) error {
    method CanBePulled (line 128) | func (c CmdGitClient) CanBePulled(r GitRepository) bool {
    method GetLastCommitMessage (line 140) | func (c CmdGitClient) GetLastCommitMessage(r GitRepository) (msg strin...
    method GetLastCommitHash (line 155) | func (c CmdGitClient) GetLastCommitHash(r GitRepository) (hash string,...
    method GetLastRemoteCommitHash (line 161) | func (c CmdGitClient) GetLastRemoteCommitHash(r GitRepository) (hash s...
    method GetRemoteBranches (line 179) | func (c CmdGitClient) GetRemoteBranches(r GitRepository) ([]string, er...
  function getRepositoryBranchNames (line 194) | func getRepositoryBranchNames(branches []string) []string {

FILE: db_lib/GitClientFactory.go
  function CreateDefaultGitClient (line 5) | func CreateDefaultGitClient(keyInstaller AccessKeyInstaller) GitClient {
  function CreateGoGitClient (line 16) | func CreateGoGitClient(keyInstaller AccessKeyInstaller) GitClient {
  function CreateCmdGitClient (line 22) | func CreateCmdGitClient(keyInstaller AccessKeyInstaller) GitClient {

FILE: db_lib/GitRepository.go
  type GitRepositoryDirType (line 12) | type GitRepositoryDirType
  constant GitRepositoryTmpPath (line 15) | GitRepositoryTmpPath GitRepositoryDirType = iota
  constant GitRepositoryFullPath (line 16) | GitRepositoryFullPath
  type GitClient (line 19) | type GitClient interface
  type GitRepository (line 30) | type GitRepository struct
    method GetFullPath (line 38) | func (r GitRepository) GetFullPath() string {
    method ValidateRepo (line 45) | func (r GitRepository) ValidateRepo() error {
    method Clone (line 50) | func (r GitRepository) Clone() error {
    method Pull (line 54) | func (r GitRepository) Pull() error {
    method Checkout (line 58) | func (r GitRepository) Checkout(target string) error {
    method CanBePulled (line 62) | func (r GitRepository) CanBePulled() bool {
    method GetLastCommitMessage (line 66) | func (r GitRepository) GetLastCommitMessage() (msg string, err error) {
    method GetLastCommitHash (line 70) | func (r GitRepository) GetLastCommitHash() (hash string, err error) {
    method GetLastRemoteCommitHash (line 74) | func (r GitRepository) GetLastRemoteCommitHash() (hash string, err err...
    method GetRemoteBranches (line 78) | func (r GitRepository) GetRemoteBranches() ([]string, error) {

FILE: db_lib/GoGitClient.go
  type GoGitClient (line 22) | type GoGitClient struct
    method getAuthMethod (line 41) | func (c GoGitClient) getAuthMethod(r GitRepository) (transport.AuthMet...
    method Clone (line 96) | func (c GoGitClient) Clone(r GitRepository) error {
    method Pull (line 121) | func (c GoGitClient) Pull(r GitRepository) error {
    method Checkout (line 151) | func (c GoGitClient) Checkout(r GitRepository, target string) error {
    method CanBePulled (line 172) | func (c GoGitClient) CanBePulled(r GitRepository) bool {
    method GetLastCommitMessage (line 216) | func (c GoGitClient) GetLastCommitMessage(r GitRepository) (msg string...
    method GetLastCommitHash (line 243) | func (c GoGitClient) GetLastCommitHash(r GitRepository) (hash string, ...
    method GetLastRemoteCommitHash (line 259) | func (c GoGitClient) GetLastRemoteCommitHash(r GitRepository) (hash st...
    method GetRemoteBranches (line 294) | func (c GoGitClient) GetRemoteBranches(r GitRepository) ([]string, err...
  type ProgressWrapper (line 26) | type ProgressWrapper struct
    method Write (line 30) | func (t ProgressWrapper) Write(p []byte) (n int, err error) {
  function openRepository (line 80) | func openRepository(r GitRepository, targetDir GitRepositoryDirType) (*g...

FILE: db_lib/LocalApp.go
  function getHomeDir (line 15) | func getHomeDir(repo db.Repository, templateID int) string {
  function getEnvironmentVars (line 26) | func getEnvironmentVars() []string {
  type LocalAppRunningArgs (line 45) | type LocalAppRunningArgs struct
  type LocalAppInstallingArgs (line 54) | type LocalAppInstallingArgs struct
  type LocalApp (line 61) | type LocalApp interface

FILE: db_lib/LocalApp_test.go
  function contains (line 13) | func contains(slice []string, item string) bool {
  function TestGetEnvironmentVars (line 22) | func TestGetEnvironmentVars(t *testing.T) {
  function TestGetHomeDir (line 53) | func TestGetHomeDir(t *testing.T) {

FILE: db_lib/ShellApp.go
  type ShellApp (line 14) | type ShellApp struct
    method makeCmd (line 43) | func (t *ShellApp) makeCmd(command string, args []string, environmentV...
    method runCmd (line 57) | func (t *ShellApp) runCmd(command string, args []string) error {
    method GetFullPath (line 63) | func (t *ShellApp) GetFullPath() (path string) {
    method SetLogger (line 68) | func (t *ShellApp) SetLogger(logger task_logger.Logger) task_logger.Lo...
    method Clear (line 77) | func (t *ShellApp) Clear() {
    method InstallRequirements (line 80) | func (t *ShellApp) InstallRequirements(args LocalAppInstallingArgs) er...
    method makeShellCmd (line 84) | func (t *ShellApp) makeShellCmd(args []string, environmentVars []strin...
    method Run (line 111) | func (t *ShellApp) Run(args LocalAppRunningArgs) error {
  type bashReader (line 22) | type bashReader struct
    method Read (line 27) | func (r *bashReader) Read(p []byte) (n int, err error) {

FILE: db_lib/TerraformApp.go
  type TerraformApp (line 19) | type TerraformApp struct
    method makeCmd (line 72) | func (t *TerraformApp) makeCmd(command string, args []string, environm...
    method runCmd (line 113) | func (t *TerraformApp) runCmd(command string, args []string) error {
    method GetFullPath (line 119) | func (t *TerraformApp) GetFullPath() string {
    method SetLogger (line 123) | func (t *TerraformApp) SetLogger(logger task_logger.Logger) task_logge...
    method init (line 133) | func (t *TerraformApp) init(environmentVars []string, keyInstaller Acc...
    method isWorkspacesSupported (line 187) | func (t *TerraformApp) isWorkspacesSupported(environmentVars []string)...
    method selectWorkspace (line 199) | func (t *TerraformApp) selectWorkspace(workspace string, environmentVa...
    method Clear (line 238) | func (t *TerraformApp) Clear() {
    method InstallRequirements (line 260) | func (t *TerraformApp) InstallRequirements(args LocalAppInstallingArgs...
    method InstallRequirementsWithInitArgs (line 264) | func (t *TerraformApp) InstallRequirementsWithInitArgs(args LocalAppIn...
    method Plan (line 300) | func (t *TerraformApp) Plan(args []string, environmentVars []string, i...
    method Apply (line 329) | func (t *TerraformApp) Apply(args []string, environmentVars []string, ...
    method Run (line 350) | func (t *TerraformApp) Run(args LocalAppRunningArgs) error {
  type terraformReader (line 30) | type terraformReader struct
    method Read (line 36) | func (r *terraformReader) Read(p []byte) (n int, err error) {
  type TerraformInstallRequirementsArgs (line 255) | type TerraformInstallRequirementsArgs struct

FILE: pkg/common_errors/common_errors.go
  type UserVisibleError (line 9) | type UserVisibleError struct
    method Error (line 13) | func (e *UserVisibleError) Error() string { return e.Err.Error() }
    method Unwrap (line 14) | func (e *UserVisibleError) Unwrap() error { return e.Err }
  function NewUserError (line 16) | func NewUserError(err error) error {
  function NewUserErrorS (line 20) | func NewUserErrorS(err string) error {
  function GetErrorContext (line 26) | func GetErrorContext() string {

FILE: pkg/conv/conv.go
  function ConvertFloatToIntIfPossible (line 8) | func ConvertFloatToIntIfPossible(v any) (int64, bool) {
  function StructToFlatMap (line 28) | func StructToFlatMap(obj any) map[string]any {

FILE: pkg/random/string.go
  constant digits (line 9) | digits = "0123456789"
  constant chars (line 10) | chars  = "abcdefghijklmnopqrstuvwxyz0123456789"
  function rnd (line 13) | func rnd(strlen int, baseStr string) string {
  function Number (line 26) | func Number(strlen int) string {
  function String (line 30) | func String(strlen int) string {

FILE: pkg/ssh/agent.go
  type AgentKey (line 17) | type AgentKey struct
  type Agent (line 22) | type Agent struct
    method Listen (line 34) | func (a *Agent) Listen() error {
    method Close (line 101) | func (a *Agent) Close() error {
  function NewAgent (line 30) | func NewAgent() Agent {
  function StartSSHAgent (line 111) | func StartSSHAgent(key db.AccessKey, logger task_logger.Logger) (Agent, ...
  type AccessKeyInstallation (line 137) | type AccessKeyInstallation struct
    method GetGitEnv (line 144) | func (key *AccessKeyInstallation) GetGitEnv() (env []string) {
    method Destroy (line 160) | func (key *AccessKeyInstallation) Destroy() error {
  type KeyInstaller (line 167) | type KeyInstaller struct
    method Install (line 169) | func (KeyInstaller) Install(key db.AccessKey, usage db.AccessKeyRole, ...

FILE: pkg/ssh/agent_test.go
  function TestAgent_Close_WithNilListener (line 8) | func TestAgent_Close_WithNilListener(t *testing.T) {
  function TestAgent_Close_WithNilDone (line 20) | func TestAgent_Close_WithNilDone(t *testing.T) {
  function TestAgent_Close_WithAllNil (line 34) | func TestAgent_Close_WithAllNil(t *testing.T) {
  function TestAgent_Close_FailedInitialization (line 47) | func TestAgent_Close_FailedInitialization(t *testing.T) {

FILE: pkg/task_logger/task_logger.go
  type TaskStatus (line 8) | type TaskStatus
    method IsValid (line 35) | func (s TaskStatus) IsValid() bool {
    method IsNotifiable (line 52) | func (s TaskStatus) IsNotifiable() bool {
    method Format (line 56) | func (s TaskStatus) Format() (res string) {
    method IsFinished (line 99) | func (s TaskStatus) IsFinished() bool {
  constant TaskWaitingStatus (line 11) | TaskWaitingStatus       TaskStatus = "waiting"
  constant TaskStartingStatus (line 12) | TaskStartingStatus      TaskStatus = "starting"
  constant TaskWaitingConfirmation (line 13) | TaskWaitingConfirmation TaskStatus = "waiting_confirmation"
  constant TaskConfirmed (line 14) | TaskConfirmed           TaskStatus = "confirmed"
  constant TaskRejected (line 15) | TaskRejected            TaskStatus = "rejected"
  constant TaskRunningStatus (line 16) | TaskRunningStatus       TaskStatus = "running"
  constant TaskStoppingStatus (line 17) | TaskStoppingStatus      TaskStatus = "stopping"
  constant TaskStoppedStatus (line 18) | TaskStoppedStatus       TaskStatus = "stopped"
  constant TaskSuccessStatus (line 19) | TaskSuccessStatus       TaskStatus = "success"
  constant TaskFailStatus (line 20) | TaskFailStatus          TaskStatus = "error"
  function UnfinishedTaskStatuses (line 23) | func UnfinishedTaskStatuses() []TaskStatus {
  type StatusListener (line 103) | type StatusListener
  type LogListener (line 104) | type LogListener
  type Logger (line 106) | type Logger interface

FILE: pkg/tz/time.go
  function Now (line 5) | func Now() time.Time {
  function In (line 9) | func In(t time.Time) time.Time {

FILE: pro/api/auth_verify.go
  function VerifySessionByEmail (line 9) | func VerifySessionByEmail(session *db.Session, w http.ResponseWriter, r ...

FILE: pro/api/projects/runners.go
  function NewProjectRunnerController (line 12) | func NewProjectRunnerController(subscriptionService pro_interfaces.Subsc...
  type ProjectRunnerControllerImpl (line 16) | type ProjectRunnerControllerImpl struct
    method GetRunners (line 19) | func (c *ProjectRunnerControllerImpl) GetRunners(w http.ResponseWriter...
    method AddRunner (line 30) | func (c *ProjectRunnerControllerImpl) AddRunner(w http.ResponseWriter,...
    method RunnerMiddleware (line 34) | func (c *ProjectRunnerControllerImpl) RunnerMiddleware(next http.Handl...
    method GetRunner (line 40) | func (c *ProjectRunnerControllerImpl) GetRunner(w http.ResponseWriter,...
    method UpdateRunner (line 44) | func (c *ProjectRunnerControllerImpl) UpdateRunner(w http.ResponseWrit...
    method DeleteRunner (line 48) | func (c *ProjectRunnerControllerImpl) DeleteRunner(w http.ResponseWrit...
    method SetRunnerActive (line 52) | func (c *ProjectRunnerControllerImpl) SetRunnerActive(w http.ResponseW...
    method ClearRunnerCache (line 56) | func (c *ProjectRunnerControllerImpl) ClearRunnerCache(w http.Response...
    method GetRunnerTags (line 60) | func (c *ProjectRunnerControllerImpl) GetRunnerTags(w http.ResponseWri...

FILE: pro/api/projects/terraform_inventory.go
  type terraformInventoryController (line 10) | type terraformInventoryController struct
    method GetTerraformInventoryAliases (line 16) | func (c *terraformInventoryController) GetTerraformInventoryAliases(w ...
    method AddTerraformInventoryAlias (line 20) | func (c *terraformInventoryController) AddTerraformInventoryAlias(w ht...
    method GetTerraformInventoryAlias (line 24) | func (c *terraformInventoryController) GetTerraformInventoryAlias(w ht...
    method DeleteTerraformInventoryAlias (line 28) | func (c *terraformInventoryController) DeleteTerraformInventoryAlias(w...
    method SetTerraformInventoryAliasAccessKey (line 32) | func (c *terraformInventoryController) SetTerraformInventoryAliasAcces...
    method GetTerraformInventoryStates (line 36) | func (c *terraformInventoryController) GetTerraformInventoryStates(w h...
    method GetTerraformInventoryLatestState (line 40) | func (c *terraformInventoryController) GetTerraformInventoryLatestStat...
    method GetTerraformInventoryState (line 44) | func (c *terraformInventoryController) GetTerraformInventoryState(w ht...
    method DeleteTerraformInventoryState (line 48) | func (c *terraformInventoryController) DeleteTerraformInventoryState(w...
  function NewTerraformInventoryController (line 12) | func NewTerraformInventoryController(terraformRepo db.TerraformStore) pr...

FILE: pro/api/roles.go
  type RolesController (line 10) | type RolesController struct
    method GetGlobalRole (line 20) | func (c *RolesController) GetGlobalRole(w http.ResponseWriter, r *http...
    method GetRoles (line 24) | func (c *RolesController) GetRoles(w http.ResponseWriter, r *http.Requ...
    method AddRole (line 28) | func (c *RolesController) AddRole(w http.ResponseWriter, r *http.Reque...
    method UpdateRole (line 32) | func (c *RolesController) UpdateRole(w http.ResponseWriter, r *http.Re...
    method DeleteRole (line 36) | func (c *RolesController) DeleteRole(w http.ResponseWriter, r *http.Re...
    method GetProjectRoles (line 41) | func (c *RolesController) GetProjectRoles(w http.ResponseWriter, r *ht...
    method GetProjectAndGlobalRoles (line 45) | func (c *RolesController) GetProjectAndGlobalRoles(w http.ResponseWrit...
    method AddProjectRole (line 49) | func (c *RolesController) AddProjectRole(w http.ResponseWriter, r *htt...
    method GetProjectRole (line 53) | func (c *RolesController) GetProjectRole(w http.ResponseWriter, r *htt...
    method UpdateProjectRole (line 57) | func (c *RolesController) UpdateProjectRole(w http.ResponseWriter, r *...
    method DeleteProjectRole (line 61) | func (c *RolesController) DeleteProjectRole(w http.ResponseWriter, r *...
  function NewRolesController (line 14) | func NewRolesController(roleRepo db.RoleRepository) *RolesController {

FILE: pro/api/subscriptions.go
  function NewSubscriptionController (line 10) | func NewSubscriptionController(
  type subscriptionControllerImpl (line 19) | type subscriptionControllerImpl struct
    method Delete (line 22) | func (ctrl *subscriptionControllerImpl) Delete(w http.ResponseWriter, ...
    method Activate (line 26) | func (ctrl *subscriptionControllerImpl) Activate(w http.ResponseWriter...
    method GetSubscription (line 30) | func (ctrl *subscriptionControllerImpl) GetSubscription(w http.Respons...
    method Refresh (line 34) | func (ctrl *subscriptionControllerImpl) Refresh(w http.ResponseWriter,...

FILE: pro/api/terraform.go
  type TerraformController (line 9) | type TerraformController struct
    method TerraformInventoryAliasMiddleware (line 23) | func (c *TerraformController) TerraformInventoryAliasMiddleware(next h...
    method GetTerraformState (line 29) | func (c *TerraformController) GetTerraformState(w http.ResponseWriter,...
    method AddTerraformState (line 33) | func (c *TerraformController) AddTerraformState(w http.ResponseWriter,...
    method LockTerraformState (line 37) | func (c *TerraformController) LockTerraformState(w http.ResponseWriter...
    method UnlockTerraformState (line 41) | func (c *TerraformController) UnlockTerraformState(w http.ResponseWrit...
  function NewTerraformController (line 13) | func NewTerraformController(

FILE: pro/db/factory/factory.go
  function NewTerraformStore (line 8) | func NewTerraformStore(store db.Store) db.TerraformStore {
  function NewAnsibleTaskRepository (line 12) | func NewAnsibleTaskRepository(store db.Store) db.AnsibleTaskRepository {

FILE: pro/db/sql/ansible_task.go
  type AnsibleTaskStoreImpl (line 8) | type AnsibleTaskStoreImpl struct
    method CreateAnsibleTaskHost (line 15) | func (d *AnsibleTaskStoreImpl) CreateAnsibleTaskHost(host db.AnsibleTa...
    method CreateAnsibleTaskError (line 19) | func (d *AnsibleTaskStoreImpl) CreateAnsibleTaskError(error db.Ansible...
    method GetAnsibleTaskHosts (line 23) | func (d *AnsibleTaskStoreImpl) GetAnsibleTaskHosts(projectID int, task...
    method GetAnsibleTaskErrors (line 27) | func (d *AnsibleTaskStoreImpl) GetAnsibleTaskErrors(projectID int, tas...
  function NewAnsibleTask (line 11) | func NewAnsibleTask(connection *sql.SqlDbConnection) db.AnsibleTaskRepos...

FILE: pro/db/sql/terraform_inventory.go
  type TerraformStoreImpl (line 7) | type TerraformStoreImpl struct
    method CreateTerraformInventoryAlias (line 10) | func (d *TerraformStoreImpl) CreateTerraformInventoryAlias(alias db.Te...
    method UpdateTerraformInventoryAlias (line 14) | func (d *TerraformStoreImpl) UpdateTerraformInventoryAlias(alias db.Te...
    method GetTerraformInventoryAliasByAlias (line 18) | func (d *TerraformStoreImpl) GetTerraformInventoryAliasByAlias(alias s...
    method GetTerraformInventoryAlias (line 22) | func (d *TerraformStoreImpl) GetTerraformInventoryAlias(projectID, inv...
    method GetTerraformInventoryAliases (line 26) | func (d *TerraformStoreImpl) GetTerraformInventoryAliases(projectID, i...
    method DeleteTerraformInventoryAlias (line 30) | func (d *TerraformStoreImpl) DeleteTerraformInventoryAlias(projectID i...
    method GetTerraformInventoryStates (line 34) | func (d *TerraformStoreImpl) GetTerraformInventoryStates(projectID, in...
    method CreateTerraformInventoryState (line 38) | func (d *TerraformStoreImpl) CreateTerraformInventoryState(state db.Te...
    method DeleteTerraformInventoryState (line 42) | func (d *TerraformStoreImpl) DeleteTerraformInventoryState(projectID i...
    method GetTerraformInventoryState (line 46) | func (d *TerraformStoreImpl) GetTerraformInventoryState(projectID int,...
    method GetTerraformStateCount (line 50) | func (d *TerraformStoreImpl) GetTerraformStateCount() (n int, err erro...

FILE: pro/pkg/features/features.go
  function GetFeatures (line 7) | func GetFeatures(user *db.User, plan string) map[string]bool {

FILE: pro/pkg/stage_parsers/next_step.go
  function MoveToNextStage (line 8) | func MoveToNextStage(

FILE: pro/services/ha/ha.go
  type NodeRegistry (line 13) | type NodeRegistry interface
  type OrphanCleaner (line 22) | type OrphanCleaner interface
  function NewNodeRegistry (line 29) | func NewNodeRegistry() NodeRegistry                             { return...
  function NewScheduleDeduplicator (line 30) | func NewScheduleDeduplicator() schedules.ScheduleDeduplicator   { return...
  function NewWSBroadcaster (line 31) | func NewWSBroadcaster() sockets.Broadcaster                     { return...
  function NewOrphanCleaner (line 32) | func NewOrphanCleaner(_ db.Store) OrphanCleaner                 { return...

FILE: pro/services/server/access_key_serializer_dvls.go
  type DvlsStorageTokenDeserializer (line 7) | type DvlsStorageTokenDeserializer interface
  type DvlsAccessKeyDeserializer (line 11) | type DvlsAccessKeyDeserializer struct
    method DeleteSecret (line 22) | func (d *DvlsAccessKeyDeserializer) DeleteSecret(key *db.AccessKey) er...
    method SerializeSecret (line 26) | func (d *DvlsAccessKeyDeserializer) SerializeSecret(key *db.AccessKey)...
    method DeserializeSecret (line 30) | func (d *DvlsAccessKeyDeserializer) DeserializeSecret(key *db.AccessKe...
  function NewDvlsAccessKeyDeserializer (line 14) | func NewDvlsAccessKeyDeserializer(

FILE: pro/services/server/access_key_serializer_vault.go
  type VaultStorageTokenDeserializer (line 7) | type VaultStorageTokenDeserializer interface
  type VaultAccessKeyDeserializer (line 11) | type VaultAccessKeyDeserializer struct
    method DeleteSecret (line 22) | func (d *VaultAccessKeyDeserializer) DeleteSecret(key *db.AccessKey) e...
    method SerializeSecret (line 26) | func (d *VaultAccessKeyDeserializer) SerializeSecret(key *db.AccessKey...
    method DeserializeSecret (line 30) | func (d *VaultAccessKeyDeserializer) DeserializeSecret(key *db.AccessK...
  function NewVaultAccessKeyDeserializer (line 14) | func NewVaultAccessKeyDeserializer(

FILE: pro/services/server/log_write_svc.go
  type LogWriteServiceImpl (line 7) | type LogWriteServiceImpl struct
    method WriteEventLog (line 15) | func (l *LogWriteServiceImpl) WriteEventLog(event pro_interfaces.Event...
    method WriteTaskLog (line 19) | func (l *LogWriteServiceImpl) WriteTaskLog(task pro_interfaces.TaskLog...
    method WriteResult (line 22) | func (l *LogWriteServiceImpl) WriteResult(task any) error {
  function NewLogWriteService (line 11) | func NewLogWriteService() pro_interfaces.LogWriteService {

FILE: pro/services/server/secret_storage_svc.go
  function GetSecretStorages (line 5) | func GetSecretStorages(repo db.SecretStorageRepository, projectID int) (...
  function SyncDvlsSecrets (line 10) | func SyncDvlsSecrets(

FILE: pro/services/server/subscription_svc.go
  function NewSubscriptionService (line 8) | func NewSubscriptionService(userRepo db.UserManager, optionsRepo db.Opti...
  type SubscriptionServiceImpl (line 12) | type SubscriptionServiceImpl struct
    method GetToken (line 15) | func (s *SubscriptionServiceImpl) GetToken() (res pro_interfaces.Subsc...
    method HasActiveSubscription (line 20) | func (s *SubscriptionServiceImpl) HasActiveSubscription() bool {
    method CanAddProUser (line 24) | func (s *SubscriptionServiceImpl) CanAddProUser() (ok bool, err error) {
    method StartValidationCron (line 28) | func (s *SubscriptionServiceImpl) StartValidationCron() {
    method CanAddRole (line 32) | func (s *SubscriptionServiceImpl) CanAddRole() (ok bool, err error) {
    method CanAddRunner (line 36) | func (s *SubscriptionServiceImpl) CanAddRunner() (ok bool, err error) {
    method CanAddTerraformHTTPBackend (line 40) | func (s *SubscriptionServiceImpl) CanAddTerraformHTTPBackend() (ok boo...

FILE: pro/services/tasks/task_state_store_factory.go
  function NewTaskStateStore (line 7) | func NewTaskStateStore() tasks.TaskStateStore {

FILE: pro_interfaces/log_write_svc.go
  type LogWriteService (line 5) | type LogWriteService interface
  type EventLogRecord (line 11) | type EventLogRecord struct
  type TaskLogRecord (line 19) | type TaskLogRecord struct

FILE: pro_interfaces/project_runner_ctl.go
  type ProjectRunnerController (line 5) | type ProjectRunnerController interface

FILE: pro_interfaces/subscription_ctl.go
  type SubscriptionController (line 5) | type SubscriptionController interface

FILE: pro_interfaces/subscription_svc.go
  type SubscriptionToken (line 5) | type SubscriptionToken struct
    method Validate (line 16) | func (t *SubscriptionToken) Validate() error {
  type SubscriptionService (line 20) | type SubscriptionService interface

FILE: pro_interfaces/terraform_inventory_ctl.go
  type TerraformInventoryController (line 7) | type TerraformInventoryController interface

FILE: services/export/AccessKey.go
  type AccessKeyExporter (line 9) | type AccessKeyExporter struct
    method load (line 13) | func (e *AccessKeyExporter) load(store db.Store, exporter DataExporter...
    method restore (line 35) | func (e *AccessKeyExporter) restore(store db.Store, exporter DataExpor...
    method restoreValue (line 39) | func (e *AccessKeyExporter) restoreValue(val EntityObject[db.AccessKey...
    method getName (line 74) | func (e *AccessKeyExporter) getName() string {
    method exportDependsOn (line 78) | func (e *AccessKeyExporter) exportDependsOn() []string {
    method importDependsOn (line 82) | func (e *AccessKeyExporter) importDependsOn() []string {

FILE: services/export/Environment.go
  type EnvironmentExporter (line 9) | type EnvironmentExporter struct
    method load (line 13) | func (e *EnvironmentExporter) load(store db.Store, exporter DataExport...
    method restore (line 33) | func (e *EnvironmentExporter) restore(store db.Store, exporter DataExp...
    method restoreValue (line 37) | func (e *EnvironmentExporter) restoreValue(val EntityObject[db.Environ...
    method getName (line 58) | func (e *EnvironmentExporter) getName() string {
    method exportDependsOn (line 62) | func (e *EnvironmentExporter) exportDependsOn() []string {
    method importDependsOn (line 66) | func (e *EnvironmentExporter) importDependsOn() []string {

FILE: services/export/Event.go
  type EventExporter (line 11) | type EventExporter struct
    method load (line 15) | func (e *EventExporter) load(store db.Store, exporter DataExporter, pr...
    method restore (line 47) | func (e *EventExporter) restore(store db.Store, exporter DataExporter,...
    method restoreValue (line 51) | func (e *EventExporter) restoreValue(val EntityObject[db.Event], store...
    method restoreEventObject (line 127) | func (e *EventExporter) restoreEventObject(event *db.Event, exporter D...
    method exportDependsOn (line 144) | func (e *EventExporter) exportDependsOn() []string {
    method importDependsOn (line 148) | func (e *EventExporter) importDependsOn() []string {
    method getName (line 152) | func (e *EventExporter) getName() string {
  function eventObjectTypeToEntityName (line 83) | func eventObjectTypeToEntityName(t db.EventObjectType) (string, bool) {
  function getScope (line 116) | func getScope(objectType, scope string) string {

FILE: services/export/Exporter.go
  constant User (line 12) | User                    = "User"
  constant Project (line 13) | Project                 = "Project"
  constant AccessKey (line 14) | AccessKey               = "AccessKey"
  constant Environment (line 15) | Environment             = "Environment"
  constant Template (line 16) | Template                = "Template"
  constant TemplateVault (line 17) | TemplateVault           = "TemplateVault"
  constant TemplateRole (line 18) | TemplateRole            = "TemplateRole"
  constant SecretStorage (line 19) | SecretStorage           = "SecretStorage"
  constant Inventory (line 20) | Inventory               = "Inventory"
  constant Repository (line 21) | Repository              = "Repository"
  constant View (line 22) | View                    = "View"
  constant Role (line 23) | Role                    = "Role"
  constant TaskParams (line 24) | TaskParams              = "TaskParams"
  constant Integration (line 25) | Integration             = "Integration"
  constant IntegrationAlias (line 26) | IntegrationAlias        = "IntegrationAlias"
  constant IntegrationExtractValue (line 27) | IntegrationExtractValue = "IntegrationExtractValue"
  constant IntegrationMatcher (line 28) | IntegrationMatcher      = "IntegrationMatcher"
  constant Schedule (line 29) | Schedule                = "Schedule"
  constant Task (line 30) | Task                    = "Task"
  constant TaskStage (line 31) | TaskStage               = "TaskStage"
  constant TaskStageResult (line 32) | TaskStageResult         = "TaskStageResult"
  constant TaskOutput (line 33) | TaskOutput              = "TaskOutput"
  constant ProjectUser (line 34) | ProjectUser             = "ProjectUser"
  constant Option (line 35) | Option                  = "Option"
  constant Event (line 36) | Event                   = "Event"
  constant Runner (line 37) | Runner                  = "Runner"
  function NewKeyFromInt (line 42) | func NewKeyFromInt(key int) EntityKey {
  type KeyMapper (line 46) | type KeyMapper interface
  type DataExporter (line 60) | type DataExporter interface
  type Progress (line 70) | type Progress interface
  type ErrorHandler (line 74) | type ErrorHandler interface
  type TypeExporter (line 78) | type TypeExporter interface
  type EntityType (line 103) | type EntityType interface
  type TypeKeyMapper (line 107) | type TypeKeyMapper struct
    method getNewKeyInt (line 112) | func (d *TypeKeyMapper) getNewKeyInt(name string, scope string, oldKey...
    method getNewKeyIntRef (line 127) | func (d *TypeKeyMapper) getNewKeyIntRef(name string, scope string, old...
    method getNewKey (line 150) | func (d *TypeKeyMapper) getNewKey(name string, scope string, oldKey En...
    method mapKeys (line 160) | func (d *TypeKeyMapper) mapKeys(name string, scope string, oldKey Enti...
    method ignoreKeyNotFound (line 181) | func (d *TypeKeyMapper) ignoreKeyNotFound() bool {
  type EntityObject (line 185) | type EntityObject struct
  type ValueExporter (line 190) | type ValueExporter interface
  type ValueMap (line 196) | type ValueMap struct
  method getLoadedKeys (line 203) | func (t *ValueMap[T]) getLoadedKeys(scope string) ([]EntityKey, error) {
  method getLoadedKeysInt (line 219) | func (t *ValueMap[T]) getLoadedKeysInt(scope string) ([]int, error) {
  method getLoadedValues (line 235) | func (t *ValueMap[T]) getLoadedValues(scope string) ([]EntityType, error) {
  method appendValues (line 245) | func (t *ValueMap[T]) appendValues(values []T, scope string) error {
  method appendValuesAndCheck (line 249) | func (t *ValueMap[T]) appendValuesAndCheck(values []T, scope string, che...
  method exportDependsOn (line 267) | func (t *ValueMap[T]) exportDependsOn() []string {
  method importDependsOn (line 271) | func (t *ValueMap[T]) importDependsOn() []string {
  method onError (line 275) | func (t *ValueMap[T]) onError(err string) {
  method getErrors (line 283) | func (t *ValueMap[T]) getErrors() []string {
  method clear (line 287) | func (t *ValueMap[T]) clear() {
  method setUniqueKeys (line 293) | func (t *ValueMap[T]) setUniqueKeys(uniqueKeys bool) {
  method restoreValues (line 297) | func (t *ValueMap[T]) restoreValues(store db.Store, exporter DataExporte...
  type ExporterChain (line 314) | type ExporterChain struct
    method getTypeExporter (line 319) | func (p *ExporterChain) getTypeExporter(name string) TypeExporter {
    method getLoadedKeys (line 323) | func (p *ExporterChain) getLoadedKeys(name string, scope string) ([]En...
    method getLoadedKeysInt (line 332) | func (p *ExporterChain) getLoadedKeysInt(name string, scope string) ([...
    method Load (line 472) | func (p *ExporterChain) Load(store db.Store) (err error) {
    method Restore (line 503) | func (p *ExporterChain) Restore(store db.Store, errLogSize int) error {
  function getSortedKeys (line 355) | func getSortedKeys(exporters map[string]TypeExporter, dependsOn func(t T...
  function getUniqueKeys (line 399) | func getUniqueKeys(exporters map[string]TypeExporter) map[string]bool {
  function InitProjectExporters (line 409) | func InitProjectExporters(mapper KeyMapper, skipTaskOutput bool, mergeEx...
  function NewKeyMapper (line 450) | func NewKeyMapper() *TypeKeyMapper {
  type ProgressBar (line 454) | type ProgressBar struct
    method update (line 460) | func (p *ProgressBar) update(progress float32, count int64) {
    method updateForce (line 466) | func (p *ProgressBar) updateForce(progress float32, count int64) {

FILE: services/export/Integration.go
  type IntegrationExporter (line 9) | type IntegrationExporter struct
    method load (line 13) | func (e *IntegrationExporter) load(store db.Store, exporter DataExport...
    method restore (line 34) | func (e *IntegrationExporter) restore(store db.Store, exporter DataExp...
    method restoreValue (line 38) | func (e *IntegrationExporter) restoreValue(val EntityObject[db.Integra...
    method getName (line 78) | func (e *IntegrationExporter) getName() string {
    method exportDependsOn (line 82) | func (e *IntegrationExporter) exportDependsOn() []string {
    method importDependsOn (line 86) | func (e *IntegrationExporter) importDependsOn() []string {

FILE: services/export/IntegrationAliases.go
  type IntegrationAliasExporter (line 9) | type IntegrationAliasExporter struct
    method load (line 13) | func (e *IntegrationAliasExporter) load(store db.Store, exporter DataE...
    method restore (line 51) | func (e *IntegrationAliasExporter) restore(store db.Store, exporter Da...
    method restoreValue (line 55) | func (e *IntegrationAliasExporter) restoreValue(val EntityObject[db.In...
    method getName (line 78) | func (e *IntegrationAliasExporter) getName() string {
    method exportDependsOn (line 82) | func (e *IntegrationAliasExporter) exportDependsOn() []string {
    method importDependsOn (line 86) | func (e *IntegrationAliasExporter) importDependsOn() []string {

FILE: services/export/IntegrationExtractValue.go
  type IntegrationExtractValueExporter (line 9) | type IntegrationExtractValueExporter struct
    method load (line 13) | func (e *IntegrationExtractValueExporter) load(store db.Store, exporte...
    method restore (line 45) | func (e *IntegrationExtractValueExporter) restore(store db.Store, expo...
    method restoreValue (line 49) | func (e *IntegrationExtractValueExporter) restoreValue(val EntityObjec...
    method getName (line 66) | func (e *IntegrationExtractValueExporter) getName() string {
    method exportDependsOn (line 70) | func (e *IntegrationExtractValueExporter) exportDependsOn() []string {
    method importDependsOn (line 74) | func (e *IntegrationExtractValueExporter) importDependsOn() []string {

FILE: services/export/IntegrationMatcher.go
  type IntegrationMatcherExporter (line 9) | type IntegrationMatcherExporter struct
    method load (line 13) | func (e *IntegrationMatcherExporter) load(store db.Store, exporter Dat...
    method restore (line 45) | func (e *IntegrationMatcherExporter) restore(store db.Store, exporter ...
    method restoreValue (line 49) | func (e *IntegrationMatcherExporter) restoreValue(val EntityObject[db....
    method getName (line 66) | func (e *IntegrationMatcherExporter) getName() string {
    method exportDependsOn (line 70) | func (e *IntegrationMatcherExporter) exportDependsOn() []string {
    method importDependsOn (line 74) | func (e *IntegrationMatcherExporter) importDependsOn() []string {

FILE: services/export/Inventory.go
  type InventoryExporter (line 9) | type InventoryExporter struct
    method load (line 13) | func (e *InventoryExporter) load(store db.Store, exporter DataExporter...
    method restore (line 33) | func (e *InventoryExporter) restore(store db.Store, exporter DataExpor...
    method restoreValue (line 37) | func (e *InventoryExporter) restoreValue(val EntityObject[db.Inventory...
    method getName (line 75) | func (e *InventoryExporter) getName() string {
    method exportDependsOn (line 79) | func (e *InventoryExporter) exportDependsOn() []string {
    method importDependsOn (line 83) | func (e *InventoryExporter) importDependsOn() []string {

FILE: services/export/Option.go
  type OptionExporter (line 7) | type OptionExporter struct
    method load (line 11) | func (e *OptionExporter) load(store db.Store, exporter DataExporter, p...
    method restore (line 38) | func (e *OptionExporter) restore(store db.Store, exporter DataExporter...
    method restoreValue (line 42) | func (e *OptionExporter) restoreValue(val EntityObject[db.Option], sto...
    method exportDependsOn (line 46) | func (e *OptionExporter) exportDependsOn() []string {
    method importDependsOn (line 50) | func (e *OptionExporter) importDependsOn() []string {
    method getName (line 54) | func (e *OptionExporter) getName() string {
  function getOption (line 25) | func getOption(opts map[string]string) []db.Option {

FILE: services/export/Project.go
  type ProjectExporter (line 5) | type ProjectExporter struct
    method load (line 9) | func (e *ProjectExporter) load(store db.Store, exporter DataExporter, ...
    method restore (line 38) | func (e *ProjectExporter) restore(store db.Store, exporter DataExporte...
    method restoreValue (line 42) | func (e *ProjectExporter) restoreValue(val EntityObject[db.Project], s...
    method exportDependsOn (line 54) | func (e *ProjectExporter) exportDependsOn() []string {
    method getName (line 58) | func (e *ProjectExporter) getName() string {

FILE: services/export/ProjectUser.go
  type ProjectUserExporter (line 9) | type ProjectUserExporter struct
    method load (line 13) | func (e *ProjectUserExporter) load(store db.Store, exporter DataExport...
    method restore (line 49) | func (e *ProjectUserExporter) restore(store db.Store, exporter DataExp...
    method restoreValue (line 53) | func (e *ProjectUserExporter) restoreValue(val EntityObject[db.Project...
    method exportDependsOn (line 74) | func (e *ProjectUserExporter) exportDependsOn() []string {
    method importDependsOn (line 78) | func (e *ProjectUserExporter) importDependsOn() []string {
    method getName (line 82) | func (e *ProjectUserExporter) getName() string {
  function getUsers (line 35) | func getUsers(vals []db.UserWithProjectRole, projId int) []db.ProjectUser {

FILE: services/export/Repository.go
  type RepositoryExporter (line 9) | type RepositoryExporter struct
    method load (line 13) | func (e *RepositoryExporter) load(store db.Store, exporter DataExporte...
    method restore (line 35) | func (e *RepositoryExporter) restore(store db.Store, exporter DataExpo...
    method restoreValue (line 39) | func (e *RepositoryExporter) restoreValue(val EntityObject[db.Reposito...
    method exportDependsOn (line 61) | func (e *RepositoryExporter) exportDependsOn() []string {
    method importDependsOn (line 65) | func (e *RepositoryExporter) importDependsOn() []string {
    method getName (line 69) | func (e *RepositoryExporter) getName() string {

FILE: services/export/Role.go
  type RoleExporter (line 9) | type RoleExporter struct
    method load (line 13) | func (e *RoleExporter) load(store db.Store, exporter DataExporter, pro...
    method restore (line 39) | func (e *RoleExporter) restore(store db.Store, exporter DataExporter, ...
    method restoreValue (line 43) | func (e *RoleExporter) restoreValue(val EntityObject[db.Role], store d...
    method exportDependsOn (line 60) | func (e *RoleExporter) exportDependsOn() []string {
    method importDependsOn (line 64) | func (e *RoleExporter) importDependsOn() []string {
    method getName (line 68) | func (e *RoleExporter) getName() string {

FILE: services/export/Runner.go
  type RunnerExporter (line 7) | type RunnerExporter struct
    method load (line 11) | func (e *RunnerExporter) load(store db.Store, exporter DataExporter, p...
    method restore (line 25) | func (e *RunnerExporter) restore(store db.Store, exporter DataExporter...
    method restoreValue (line 29) | func (e *RunnerExporter) restoreValue(val EntityObject[db.Runner], sto...
    method exportDependsOn (line 45) | func (e *RunnerExporter) exportDependsOn() []string {
    method importDependsOn (line 49) | func (e *RunnerExporter) importDependsOn() []string {
    method getName (line 53) | func (e *RunnerExporter) getName() string {

FILE: services/export/Schedule.go
  type ScheduleExporter (line 9) | type ScheduleExporter struct
    method load (line 13) | func (e *ScheduleExporter) load(store db.Store, exporter DataExporter,...
    method restore (line 44) | func (e *ScheduleExporter) restore(store db.Store, exporter DataExport...
    method restoreValue (line 48) | func (e *ScheduleExporter) restoreValue(val EntityObject[db.Schedule],...
    method getName (line 86) | func (e *ScheduleExporter) getName() string {
    method exportDependsOn (line 90) | func (e *ScheduleExporter) exportDependsOn() []string {
    method importDependsOn (line 94) | func (e *ScheduleExporter) importDependsOn() []string {
  function getSchedules (line 35) | func getSchedules(vals []db.ScheduleWithTpl) []db.Schedule {

FILE: services/export/SecretStorage.go
  type SecretStorageExporter (line 9) | type SecretStorageExporter struct
    method load (line 13) | func (e *SecretStorageExporter) load(store db.Store, exporter DataExpo...
    method restore (line 35) | func (e *SecretStorageExporter) restore(store db.Store, exporter DataE...
    method restoreValue (line 39) | func (e *SecretStorageExporter) restoreValue(val EntityObject[db.Secre...
    method exportDependsOn (line 52) | func (e *SecretStorageExporter) exportDependsOn() []string {
    method importDependsOn (line 56) | func (e *SecretStorageExporter) importDependsOn() []string {
    method getName (line 60) | func (e *SecretStorageExporter) getName() string {

FILE: services/export/Task.go
  type TaskExporter (line 10) | type TaskExporter struct
    method load (line 14) | func (e *TaskExporter) load(store db.Store, exporter DataExporter, pro...
    method restore (line 41) | func (e *TaskExporter) restore(store db.Store, exporter DataExporter, ...
    method restoreValue (line 45) | func (e *TaskExporter) restoreValue(val EntityObject[db.Task], store d...
    method getName (line 91) | func (e *TaskExporter) getName() string {
    method exportDependsOn (line 95) | func (e *TaskExporter) exportDependsOn() []string {
    method importDependsOn (line 99) | func (e *TaskExporter) importDependsOn() []string {

FILE: services/export/TaskOutput.go
  type TaskOutputExporter (line 9) | type TaskOutputExporter struct
    method load (line 13) | func (e *TaskOutputExporter) load(store db.Store, exporter DataExporte...
    method restore (line 77) | func (e *TaskOutputExporter) restore(store db.Store, exporter DataExpo...
    method getName (line 121) | func (e *TaskOutputExporter) getName() string {
    method exportDependsOn (line 125) | func (e *TaskOutputExporter) exportDependsOn() []string {
    method importDependsOn (line 129) | func (e *TaskOutputExporter) importDependsOn() []string {
  function taskCount (line 56) | func taskCount(exporter DataExporter) (int, error) {

FILE: services/export/TaskStage.go
  type TaskStageExporter (line 9) | type TaskStageExporter struct
    method load (line 13) | func (e *TaskStageExporter) load(store db.Store, exporter DataExporter...
    method restore (line 62) | func (e *TaskStageExporter) restore(store db.Store, exporter DataExpor...
    method restoreValue (line 66) | func (e *TaskStageExporter) restoreValue(val EntityObject[db.TaskStage...
    method getName (line 82) | func (e *TaskStageExporter) getName() string {
    method exportDependsOn (line 86) | func (e *TaskStageExporter) exportDependsOn() []string {
    method importDependsOn (line 90) | func (e *TaskStageExporter) importDependsOn() []string {
  function getStages (line 46) | func getStages(vals []db.TaskStageWithResult) []db.TaskStage {

FILE: services/export/TaskStageResult.go
  type TaskStageResultExporter (line 11) | type TaskStageResultExporter struct
    method load (line 15) | func (e *TaskStageResultExporter) load(store db.Store, exporter DataEx...
    method restore (line 62) | func (e *TaskStageResultExporter) restore(store db.Store, exporter Dat...
    method restoreValue (line 66) | func (e *TaskStageResultExporter) restoreValue(val EntityObject[db.Tas...
    method getName (line 84) | func (e *TaskStageResultExporter) getName() string {
    method exportDependsOn (line 88) | func (e *TaskStageResultExporter) exportDependsOn() []string {
    method importDependsOn (line 92) | func (e *TaskStageResultExporter) importDependsOn() []string {
  function getStageResults (line 48) | func getStageResults(vals []db.TaskStageWithResult) []db.TaskStageResult {

FILE: services/export/Template.go
  type TemplateExporter (line 9) | type TemplateExporter struct
    method load (line 13) | func (e *TemplateExporter) load(store db.Store, exporter DataExporter,...
    method restore (line 35) | func (e *TemplateExporter) restore(store db.Store, exporter DataExport...
    method restoreValue (line 39) | func (e *TemplateExporter) restoreValue(val EntityObject[db.Template],...
    method getName (line 82) | func (e *TemplateExporter) getName() string {
    method exportDependsOn (line 86) | func (e *TemplateExporter) exportDependsOn() []string {
    method importDependsOn (line 90) | func (e *TemplateExporter) importDependsOn() []string {

FILE: services/export/TemplateRoles.go
  type TemplateRoleExporter (line 9) | type TemplateRoleExporter struct
    method load (line 13) | func (e *TemplateRoleExporter) load(store db.Store, exporter DataExpor...
    method restore (line 45) | func (e *TemplateRoleExporter) restore(store db.Store, exporter DataEx...
    method restoreValue (line 49) | func (e *TemplateRoleExporter) restoreValue(val EntityObject[db.Templa...
    method getName (line 75) | func (e *TemplateRoleExporter) getName() string {
    method importDependsOn (line 79) | func (e *TemplateRoleExporter) importDependsOn() []string {
    method exportDependsOn (line 83) | func (e *TemplateRoleExporter) exportDependsOn() []string {

FILE: services/export/TemplateVault.go
  type TemplateVaultExporter (line 9) | type TemplateVaultExporter struct
    method load (line 13) | func (e *TemplateVaultExporter) load(store db.Store, exporter DataExpo...
    method restore (line 46) | func (e *TemplateVaultExporter) restore(store db.Store, exporter DataE...
    method restoreValue (line 50) | func (e *TemplateVaultExporter) restoreValue(val EntityObject[db.Templ...
    method getName (line 76) | func (e *TemplateVaultExporter) getName() string {
    method importDependsOn (line 80) | func (e *TemplateVaultExporter) importDependsOn() []string {
    method exportDependsOn (line 84) | func (e *TemplateVaultExporter) exportDependsOn() []string {

FILE
Condensed preview — 722 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (7,200K chars).
[
  {
    "path": ".codacy.yml",
    "chars": 32,
    "preview": "---\nexclude_paths:\n  - .dredd/**"
  },
  {
    "path": ".cursorignore",
    "chars": 11,
    "preview": "/tests/e2e/"
  },
  {
    "path": ".devcontainer/config-runner.json",
    "chars": 130,
    "preview": "{\n    \"web_host\": \"http://localhost:3000\",\n    \"runner\": {\n        \"token_file\": \"/home/codespace/.semaphore-runner-toke"
  },
  {
    "path": ".devcontainer/config.json",
    "chars": 308,
    "preview": "{\n   \"bolt\": {\n       \"host\": \"/workspaces/semaphore/database.boltdb\",\n       \"options\": {\n           \"sessionConnection"
  },
  {
    "path": ".devcontainer/devcontainer.json",
    "chars": 240,
    "preview": "{\n  \"image\": \"mcr.microsoft.com/devcontainers/universal:4\",\n  \"features\": {\n    \"ghcr.io/devcontainers/features/go:1\": {"
  },
  {
    "path": ".devcontainer/postCreateCommand.sh",
    "chars": 429,
    "preview": "#!/bin/sh\n\ngo install github.com/go-task/task/v3/cmd/task@latest\n\n(cd ./web && npm install)\n\npython3 -m venv .venv\n\n./.v"
  },
  {
    "path": ".dockerignore",
    "chars": 26,
    "preview": "web/node_modules/\nvendor/\n"
  },
  {
    "path": ".dredd/dredd.docker.yml",
    "chars": 674,
    "preview": "dry-run: null\nhookfiles: ./.dredd/compiled_hooks\nlanguage: go\nserver-wait: 5\ninit: false\ncustom: {}\nnames: false\nonly: ["
  },
  {
    "path": ".dredd/dredd.local.yml",
    "chars": 677,
    "preview": "dry-run: null\nhookfiles: ./.dredd/compiled_hooks\nlanguage: go\nserver-wait: 5\ninit: false\ncustom: {}\nnames: false\nonly: ["
  },
  {
    "path": ".dredd/dredd.testing.yml",
    "chars": 712,
    "preview": "dry-run: null\nhookfiles: ./.dredd/compiled_hooks\nlanguage: go\nserver: ./.dredd/server-wrapper.sh\nserver-wait: 5\ninit: fa"
  },
  {
    "path": ".dredd/dredd.windows.yml",
    "chars": 681,
    "preview": "dry-run: null\nhookfiles: ./.dredd/compiled_hooks.exe\nlanguage: go\nserver-wait: 5\ninit: false\ncustom: {}\nnames: false\nonl"
  },
  {
    "path": ".dredd/hooks/capabilities.go",
    "chars": 8688,
    "preview": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n\ttrans \""
  },
  {
    "path": ".dredd/hooks/helpers.go",
    "chars": 7335,
    "preview": "package main\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n\n\t\"github.com/go-gorp/g"
  },
  {
    "path": ".dredd/hooks/main.go",
    "chars": 11806,
    "preview": "package main\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/snikch/goodman/hooks\"\n\ttrans \"github.com/snikch/goodman/trans"
  },
  {
    "path": ".dredd/server-wrapper.sh",
    "chars": 101,
    "preview": "#!/bin/sh\n\nexport SEMAPHORE_MAX_TASKS_PER_TEMPLATE=300\n./semaphore server --config .dredd/config.json"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 641,
    "preview": "# These are supported funding model platforms\n\ngithub: semaphoreui\n#patreon: semaphoreui\n#ko_fi: fiftin\nopen_collective:"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation.yml",
    "chars": 1616,
    "preview": "---\n\nname: Documentation\ndescription: You have a found missing or invalid documentation\ntitle: \"Docs: \"\nlabels: ['docume"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 2707,
    "preview": "---\n\nname: Feature request\ndescription: You would like to have a new feature implemented\ntitle: \"Feature: \"\nlabels: ['fe"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/problem.yml",
    "chars": 4811,
    "preview": "---\n\nname: Problem\ndescription: You have encountered problems when using Semaphore\ntitle: \"Problem: \"\nlabels: ['problem'"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/question.yml",
    "chars": 1436,
    "preview": "---\n\nname: Question\ndescription: You have a question on how to use Semaphore\ntitle: \"Question: \"\nlabels: ['question', 't"
  },
  {
    "path": ".github/copilot-instructions.md",
    "chars": 6445,
    "preview": "# Semaphore UI Development Instructions\n\n**Always reference these instructions first and fallback to search or bash comm"
  },
  {
    "path": ".github/workflows/community_beta.yml",
    "chars": 3746,
    "preview": "name: Community Beta\n\n'on':\n  push:\n    tags:\n      - v*-beta*\n\npermissions:\n  contents: write\n\njobs:\n  prerelease:\n    "
  },
  {
    "path": ".github/workflows/community_release.yml",
    "chars": 6151,
    "preview": "name: Community Release\n\n'on':\n  push:\n    tags:\n      - 'v[0-9]+.[0-9]+.[0-9]+'\n      - v*-rc*\n\npermissions:\n  contents"
  },
  {
    "path": ".github/workflows/dev.yml",
    "chars": 14866,
    "preview": "name: Dev\n\n'on':\n  push:\n    branches:\n      - develop\n      - 2-*-stable\n  pull_request:\n    branches:\n      - develop\n"
  },
  {
    "path": ".github/workflows/pro_selfhosted_beta.yml",
    "chars": 8515,
    "preview": "name: Pro Self-Hosted Release\n\n'on':\n  push:\n    tags:\n      - v*-beta*\n      - v*-rc*\n\npermissions:\n  contents: write\n\n"
  },
  {
    "path": ".github/workflows/pro_selfhosted_release.yml",
    "chars": 8600,
    "preview": "name: Pro Self-Hosted Release\n\n'on':\n  push:\n    tags:\n      - 'v[0-9]+.[0-9]+.[0-9]+'\n\npermissions:\n  contents: write\n\n"
  },
  {
    "path": ".gitignore",
    "chars": 736,
    "preview": "gin-bin\nbuild/\n/test/mcp/*/artifacts/\n/certs/\nweb/public/js/bundle.js\nweb/public/css/*.*\nweb/public/html/**/*.*\nweb/publ"
  },
  {
    "path": ".golangci.yml",
    "chars": 343,
    "preview": "version: \"2\"\n\nrun:\n  timeout: \"240s\"\n  # TODO: remove following line to make golangci return non-zero as lint were not p"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 2134,
    "preview": "version: 2\ndist: bin\n\nbefore:\n  hooks:\n    - task build:fe\n\nbuilds:\n  - binary: semaphore\n    env:\n      - CGO_ENABLED=0"
  },
  {
    "path": ".postman/api",
    "chars": 271,
    "preview": "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\napis[] = {\"apiId\":\"4023cf7c-aabb-4d5a-a742-72dadbd4924a\""
  },
  {
    "path": ".postman/api_4023cf7c-aabb-4d5a-a742-72dadbd4924a",
    "chars": 1020,
    "preview": "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\nconfigVersion = 1.1.0\ntype = apiEntityData\n\n[config]\nid "
  },
  {
    "path": ".postman/api_5306c424-9fc0-4923-be37-fbda305ca8de",
    "chars": 455,
    "preview": "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\nconfigVersion = 1.1.0\ntype = apiEntityData\n\n[config]\nid "
  },
  {
    "path": ".postman/api_9a8524cc-4892-4b54-a6b3-1ef18d907626",
    "chars": 561,
    "preview": "# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY\nconfigVersion = 1.1.0\ntype = apiEntityData\n\n[config]\nid "
  },
  {
    "path": ".postman/postman/collections/Semaphore API.json",
    "chars": 271582,
    "preview": "{\n\t\"info\": {\n\t\t\"_postman_id\": \"3d96a8d7-604d-47ec-832c-2876f64dbc1f\",\n\t\t\"name\": \"Semaphore API\",\n\t\t\"description\": \"Semap"
  },
  {
    "path": ".vscode/launch.json",
    "chars": 2168,
    "preview": "{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"Launch Server\",\n            \"type\": \"go"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3235,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 3925,
    "preview": "## Pull Requests\n\nWhen creating a pull-request you should:\n\n- __Open an issue first:__ Confirm that the change or featur"
  },
  {
    "path": "LICENSE",
    "chars": 1120,
    "preview": "The MIT License (MIT)\n\nCopyright (c) 2021 Denis Gukov\nCopyright (c) 2014-2021 Castaway Labs LLC\n\nPermission is hereby gr"
  },
  {
    "path": "README.md",
    "chars": 5125,
    "preview": "# Semaphore UI\n\nModern UI for Ansible, Terraform/OpenTofu/Terragrunt, PowerShell and other DevOps tools.\n\n[![roadmap](ht"
  },
  {
    "path": "SECURITY.md",
    "chars": 1052,
    "preview": "# Security Policy\n\n## Supported Versions\n\n\n| Version | Supported          |\n| ------- | ------------------ |\n| 2.14.x  |"
  },
  {
    "path": "TERRAFORM_ARGS_IMPROVEMENT.md",
    "chars": 6788,
    "preview": "# Terraform Multi-Stage Arguments Support\n\n## Overview\n\nEnhanced the argument handling system to support stage-specific "
  },
  {
    "path": "Taskfile.yml",
    "chars": 9920,
    "preview": "version: \"3\"\n\nvars:\n  DOCKER_ORG: semaphoreui\n  DOCKER_SERVER: semaphore\n  DOCKER_RUNNER: runner\n  DOCKER_CMD: docker\n\nt"
  },
  {
    "path": "api/api_test.go",
    "chars": 505,
    "preview": "package api\n\nimport (\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n)\n\nfunc TestA"
  },
  {
    "path": "api/apps.go",
    "chars": 3659,
    "preview": "package api\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/sem"
  },
  {
    "path": "api/apps_test.go",
    "chars": 780,
    "preview": "package api\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/pkg/conv\"\n\t\"testing\"\n)\n\nfunc TestStructToMap(t *testing."
  },
  {
    "path": "api/auth.go",
    "chars": 7423,
    "preview": "package api\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/pquerna/otp\"\n\t\"github.com/semaphoreui/semap"
  },
  {
    "path": "api/cache.go",
    "chars": 694,
    "preview": "package api\n\nimport (\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.co"
  },
  {
    "path": "api/debug/gc.go",
    "chars": 153,
    "preview": "package debug\n\nimport (\n\t\"net/http\"\n\t\"runtime\"\n)\n\nfunc GC(w http.ResponseWriter, r *http.Request) {\n\truntime.GC()\n\tw.Wri"
  },
  {
    "path": "api/debug/pprof.go",
    "chars": 928,
    "preview": "package debug\n\nimport (\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n\t\"runtime/pprof\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphor"
  },
  {
    "path": "api/events.go",
    "chars": 1082,
    "preview": "package api\n\nimport (\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"net/http\""
  },
  {
    "path": "api/helpers/context.go",
    "chars": 668,
    "preview": "package helpers\n\nimport (\n\t\"context\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc GetFromContext(r *http."
  },
  {
    "path": "api/helpers/event_log.go",
    "chars": 1473,
    "preview": "package helpers\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/semaphoreui/semaphore/pro_interfaces\"\n\tlog"
  },
  {
    "path": "api/helpers/helpers.go",
    "chars": 621,
    "preview": "package helpers\n\nimport (\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc Store("
  },
  {
    "path": "api/helpers/helpers_test.go",
    "chars": 889,
    "preview": "package helpers\n\nimport (\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/gorilla/mux\"\n)\n\n// Set"
  },
  {
    "path": "api/helpers/query_params.go",
    "chars": 1191,
    "preview": "package helpers\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"net/url\"\n\t\"slices\"\n\t\"strconv\"\n)\n\nfunc QueryParamsForP"
  },
  {
    "path": "api/helpers/route_params.go",
    "chars": 1131,
    "preview": "package helpers\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"strconv\"\n\n\t\"github.com/gorilla/mux\"\n)\n\n// GetStrParam fetches a parameter"
  },
  {
    "path": "api/helpers/write_response.go",
    "chars": 1459,
    "preview": "package helpers\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"net/http\"\n\t\"runtime/debug\"\n\n\t\"github.com/semaphoreui/semaphore/db"
  },
  {
    "path": "api/integration.go",
    "chars": 10390,
    "preview": "package api\n\nimport (\n\t\"crypto/hmac\"\n\t\"crypto/sha256\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings\"\n\n\t"
  },
  {
    "path": "api/integration_test.go",
    "chars": 18419,
    "preview": "package api\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/stretchr/testify/a"
  },
  {
    "path": "api/login.go",
    "chars": 19446,
    "preview": "package api\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"crypto/rand\"\n\t\"crypto/tls\"\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"f"
  },
  {
    "path": "api/login_test.go",
    "chars": 5158,
    "preview": "package api\n\nimport (\n\t\"encoding/base64\"\n\t\"encoding/json\"\n\t\"net/http\"\n\t\"net/http/httptest\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github."
  },
  {
    "path": "api/options.go",
    "chars": 1230,
    "preview": "package api\n\nimport (\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"net/http\""
  },
  {
    "path": "api/projects/backup_restore.go",
    "chars": 1441,
    "preview": "package projects\n\nimport (\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/se"
  },
  {
    "path": "api/projects/environment.go",
    "chars": 8187,
    "preview": "package projects\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/se"
  },
  {
    "path": "api/projects/integration.go",
    "chars": 4397,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\tlog \"github.com/sirupsen/logrus\"\n\n\t\"github.com/semaphoreui/semaphore/api"
  },
  {
    "path": "api/projects/integration_alias.go",
    "chars": 2140,
    "preview": "package projects\n\nimport (\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"gith"
  },
  {
    "path": "api/projects/integration_extract_value.go",
    "chars": 4877,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/"
  },
  {
    "path": "api/projects/integration_matcher.go",
    "chars": 4588,
    "preview": "package projects\n\nimport (\n\t//\t\"strconv\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.co"
  },
  {
    "path": "api/projects/inventory.go",
    "chars": 6064,
    "preview": "package projects\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/se"
  },
  {
    "path": "api/projects/inventory_test.go",
    "chars": 667,
    "preview": "package projects\n\nimport (\n\t\"runtime\"\n\t\"testing\"\n)\n\nfunc TestIsValidInventoryPath(t *testing.T) {\n\tif !IsValidInventoryP"
  },
  {
    "path": "api/projects/keys.go",
    "chars": 4993,
    "preview": "package projects\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/services/server\"\n\n\t\"github.c"
  },
  {
    "path": "api/projects/project.go",
    "chars": 5191,
    "preview": "package projects\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/gorilla/mux\"\n\t\"github.com/semaphoreui/semaphore/api/helpe"
  },
  {
    "path": "api/projects/projects.go",
    "chars": 8864,
    "preview": "package projects\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/services/server\"\n\n\t\"github.com/semaphoreui/se"
  },
  {
    "path": "api/projects/repository.go",
    "chars": 5828,
    "preview": "package projects\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/sem"
  },
  {
    "path": "api/projects/schedules.go",
    "chars": 6828,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/sema"
  },
  {
    "path": "api/projects/secret_storages.go",
    "chars": 5968,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/"
  },
  {
    "path": "api/projects/tasks.go",
    "chars": 12420,
    "preview": "package projects\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/semaphoreui/"
  },
  {
    "path": "api/projects/templates.go",
    "chars": 11488,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/util\"\n\n\t\"github.com/semaphoreui/semaph"
  },
  {
    "path": "api/projects/users.go",
    "chars": 5616,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/"
  },
  {
    "path": "api/projects/views.go",
    "chars": 4543,
    "preview": "package projects\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/"
  },
  {
    "path": "api/router.go",
    "chars": 33540,
    "preview": "package api\n\nimport (\n\t\"bytes\"\n\t\"embed\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"path\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/semaphoreui/se"
  },
  {
    "path": "api/runners/runners.go",
    "chars": 8495,
    "preview": "package runners\n\nimport (\n\t\"bytes\"\n\t\"crypto/rand\"\n\t\"crypto/rsa\"\n\t\"crypto/x509\"\n\t\"encoding/json\"\n\t\"encoding/pem\"\n\t\"fmt\"\n\t"
  },
  {
    "path": "api/runners.go",
    "chars": 3927,
    "preview": "package api\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/semapho"
  },
  {
    "path": "api/sockets/handler.go",
    "chars": 4290,
    "preview": "package sockets\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/semaphore/db\"\n"
  },
  {
    "path": "api/sockets/pool.go",
    "chars": 2571,
    "preview": "package sockets\n\nimport log \"github.com/sirupsen/logrus\"\n\n// Broadcaster provides cross-node WebSocket message delivery "
  },
  {
    "path": "api/system_info.go",
    "chars": 2456,
    "preview": "package api\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/api/helpers\"\n\t\"github.com/semaphoreui/se"
  },
  {
    "path": "api/tasks/tasks.go",
    "chars": 2577,
    "preview": "package tasks\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/semaphoreui/semaphore/pkg/task_logger\"\n\n\t\"github.com/semaphoreui/semap"
  },
  {
    "path": "api/user.go",
    "chars": 2452,
    "preview": "package api\n\nimport (\n\t\"crypto/rand\"\n\t\"encoding/base64\"\n\t\"io\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/gorilla/mux\"\n\t\"github"
  },
  {
    "path": "api/users.go",
    "chars": 8420,
    "preview": "package api\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/pquerna/otp\"\n\t\"github.com/pquerna/otp/totp\"\n\t\"github.com/semaphoreui/"
  },
  {
    "path": "api-docs.yml",
    "chars": 66306,
    "preview": "---\nswagger: '2.0'\ninfo:\n  title: Semaphore API\n  description: |\n    Semaphore API provides endpoints for managing and i"
  },
  {
    "path": "cli/cmd/migrate.go",
    "chars": 3470,
    "preview": "package cmd\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/semaphoreui/semaphore/db/bolt\"\n\t\"github.com/semaphoreui/semap"
  },
  {
    "path": "cli/cmd/project.go",
    "chars": 306,
    "preview": "package cmd\n\nimport (\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\trootCmd.AddCommand(projectCmd)\n}\n\nvar projectCm"
  },
  {
    "path": "cli/cmd/project_export.go",
    "chars": 2575,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\tprojectService \"github.com/semaphoreui/semaphore/services/project\"\n\t\"git"
  },
  {
    "path": "cli/cmd/project_import.go",
    "chars": 3862,
    "preview": "package cmd\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io/fs\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/sema"
  },
  {
    "path": "cli/cmd/root.go",
    "chars": 8192,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/gorilla/handlers\"\n\t\"github.com/semaph"
  },
  {
    "path": "cli/cmd/runner.go",
    "chars": 463,
    "preview": "package cmd\n\nimport (\n\t\"github.com/semaphoreui/semaphore/pkg/ssh\"\n\t\"github.com/semaphoreui/semaphore/services/runners\"\n\t"
  },
  {
    "path": "cli/cmd/runner_register.go",
    "chars": 1137,
    "preview": "package cmd\n\nimport (\n\t\"io\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar "
  },
  {
    "path": "cli/cmd/runner_setup.go",
    "chars": 1209,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/cli/setup\"\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"gi"
  },
  {
    "path": "cli/cmd/runner_start.go",
    "chars": 1043,
    "preview": "package cmd\n\nimport (\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"github.com/spf13/cobra\"\n)\n\nvar runnerStartArgs"
  },
  {
    "path": "cli/cmd/runner_unregister.go",
    "chars": 535,
    "preview": "package cmd\n\nimport (\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\trunnerCmd.Add"
  },
  {
    "path": "cli/cmd/server.go",
    "chars": 556,
    "preview": "package cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n\t\"net/http\"\n\t\"strings\"\n)\n\nfunc init() {\n\trootCmd.AddCommand(serverCmd)\n}"
  },
  {
    "path": "cli/cmd/setup.go",
    "chars": 2442,
    "preview": "package cmd\n\nimport (\n\t\"bufio\"\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/semaphore/cli/setup\"\n\t\"github.com/semap"
  },
  {
    "path": "cli/cmd/syslog.go",
    "chars": 2843,
    "preview": "//go:build !windows\n// +build !windows\n\npackage cmd\n\nimport (\n\t\"fmt\"\n\t\"log/syslog\"\n\t\"net\"\n\t\"os\"\n\t\"strings\"\n\t\"sync\"\n\t\"tim"
  },
  {
    "path": "cli/cmd/syslog_windows.go",
    "chars": 423,
    "preview": "//go:build windows\n// +build windows\n\npackage cmd\n\nimport (\n\t\"github.com/semaphoreui/semaphore/util\"\n\tlog \"github.com/si"
  },
  {
    "path": "cli/cmd/token.go",
    "chars": 12,
    "preview": "package cmd\n"
  },
  {
    "path": "cli/cmd/user.go",
    "chars": 459,
    "preview": "package cmd\n\nimport (\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n)\n\ntype userArgs struct {\n\tlogin    string\n\tname     string\n\temai"
  },
  {
    "path": "cli/cmd/user_add.go",
    "chars": 2038,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/spf13/cobra\"\n\t\"os\"\n)\n\nfunc init() {\n\tus"
  },
  {
    "path": "cli/cmd/user_change.go",
    "chars": 2461,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/spf13/cobra\"\n\t\"os\"\n)\n\nfunc init() {\n\tfo"
  },
  {
    "path": "cli/cmd/user_delete.go",
    "chars": 1065,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/spf13/cobra\"\n\t\"os\"\n)\n\nfunc init() {\n\tuserDeleteCmd.PersistentFlags().StringVar"
  },
  {
    "path": "cli/cmd/user_get.go",
    "chars": 1348,
    "preview": "package cmd\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/spf13/cobra\"\n\t\"os\"\n)\n\nfunc in"
  },
  {
    "path": "cli/cmd/user_list.go",
    "chars": 490,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\tuserCmd."
  },
  {
    "path": "cli/cmd/user_totp.go",
    "chars": 3165,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"github.com/mdp/qrterminal/v3\"\n\t\"github.com/pquerna/otp/totp\"\n\t\"github.com/semaphoreui/sem"
  },
  {
    "path": "cli/cmd/vault.go",
    "chars": 392,
    "preview": "package cmd\n\nimport (\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n)\n\ntype vaultArgs struct {\n\toldKey string\n}\n\nvar targetVaultArgs "
  },
  {
    "path": "cli/cmd/vault_rekey.go",
    "chars": 773,
    "preview": "package cmd\n\nimport (\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\tvaultRekeyCmd.PersistentFlags().StringVar(&targetVault"
  },
  {
    "path": "cli/cmd/version.go",
    "chars": 327,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\trootC"
  },
  {
    "path": "cli/main.go",
    "chars": 101,
    "preview": "package main\n\nimport (\n\t\"github.com/semaphoreui/semaphore/cli/cmd\"\n)\n\nfunc main() {\n\tcmd.Execute()\n}\n"
  },
  {
    "path": "cli/setup/setup.go",
    "chars": 8328,
    "preview": "package setup\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\n\tlog \"github.com/sirupsen/logrus\"\n\n\t\"github.com/semaph"
  },
  {
    "path": "db/APIToken.go",
    "chars": 289,
    "preview": "package db\n\nimport \"time\"\n\n// APIToken is given to a user to allow API access\ntype APIToken struct {\n\tID      string    "
  },
  {
    "path": "db/AccessKey.go",
    "chars": 4633,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n)\n\ntype AccessKeyType string\ntype AccessKeyOwner string\n\ntype AccessKeySourceStorageType str"
  },
  {
    "path": "db/Alias.go",
    "chars": 129,
    "preview": "package db\n\ntype Alias struct {\n\tID        int\n\tAlias     string\n\tProjectID int\n}\n\ntype Aliasable interface {\n\tToAlias()"
  },
  {
    "path": "db/BackupEntity.go",
    "chars": 1407,
    "preview": "package db\n\ntype BackupEntity interface {\n\tGetID() int\n\tGetName() string\n}\n\ntype BackupSluggedEntity interface {\n\tGetSlu"
  },
  {
    "path": "db/Environment.go",
    "chars": 2974,
    "preview": "package db\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n)\n\ntype EnvironmentSecretOperation string\n\nconst (\n\tEnvironmentSecretCre"
  },
  {
    "path": "db/Environment_test.go",
    "chars": 1959,
    "preview": "package db\n\nimport (\n\t\"github.com/stretchr/testify/assert\"\n\t\"testing\"\n)\n\nfunc Test_EnvironmentValidate_EmptyName_Returns"
  },
  {
    "path": "db/Event.go",
    "chars": 3422,
    "preview": "package db\n\nimport (\n\tlog \"github.com/sirupsen/logrus\"\n\t\"time\"\n)\n\n// Event represents information generated by ansible o"
  },
  {
    "path": "db/ExportEntityType.go",
    "chars": 1921,
    "preview": "package db\n\nimport (\n\t\"strconv\"\n)\n\nfunc NewKeyFromInt(key int) string {\n\treturn strconv.Itoa(key)\n}\n\nfunc (e TemplateVau"
  },
  {
    "path": "db/Integration.go",
    "chars": 6453,
    "preview": "package db\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n)\n\ntype IntegrationAuthMethod string\n\nconst (\n\tIntegrationAuthNone      = \"\"\n"
  },
  {
    "path": "db/Inventory.go",
    "chars": 2193,
    "preview": "package db\n\ntype InventoryType string\n\nconst (\n\tInventoryStatic     InventoryType = \"static\"\n\tInventoryStaticYaml Invent"
  },
  {
    "path": "db/Migration.go",
    "chars": 5514,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n\t\"math\"\n\t\"slices\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n"
  },
  {
    "path": "db/Option.go",
    "chars": 336,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n\t\"regexp\"\n)\n\ntype Option struct {\n\tKey   string `db:\"key\" json:\"key\"`\n\tValue string `db:\"val"
  },
  {
    "path": "db/Project.go",
    "chars": 749,
    "preview": "package db\n\nimport (\n\t\"time\"\n)\n\n// Project is the top level structure in Semaphore\ntype Project struct {\n\tID            "
  },
  {
    "path": "db/ProjectInvite.go",
    "chars": 1618,
    "preview": "package db\n\nimport (\n\t\"time\"\n)\n\ntype ProjectInviteStatus string\n\nconst (\n\tProjectInvitePending  ProjectInviteStatus = \"p"
  },
  {
    "path": "db/ProjectInvite_test.go",
    "chars": 4100,
    "preview": "package db\n\nimport (\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestProjectInviteStatus_IsValid(t *testing.T) {\n\ttests := []struct {\n\t\ts"
  },
  {
    "path": "db/ProjectStats.go",
    "chars": 41,
    "preview": "package db\n\ntype ProjectStats struct {\n}\n"
  },
  {
    "path": "db/ProjectUser.go",
    "chars": 1315,
    "preview": "package db\n\ntype ProjectUserRole string\n\nconst (\n\tProjectOwner      ProjectUserRole = \"owner\"\n\tProjectManager    Project"
  },
  {
    "path": "db/ProjectUser_test.go",
    "chars": 240,
    "preview": "package db\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestProjectUsers_RoleCan(t *testing.T) {\n"
  },
  {
    "path": "db/Repository.go",
    "chars": 3629,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n\t\"path\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/semaphoreui/semaphore/util\"\n)\n\ntype Re"
  },
  {
    "path": "db/Repository_test.go",
    "chars": 1690,
    "preview": "package db\n\nimport (\n\t\"math/rand\"\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n\n\t\"github.com/semaphoreui/semaphore/util\"\n\t\"github.com/stretc"
  },
  {
    "path": "db/Role.go",
    "chars": 822,
    "preview": "package db\n\ntype Role struct {\n\tSlug        string                `db:\"slug\" json:\"slug\" backup:\"-\"`\n\tName        string"
  },
  {
    "path": "db/Runner.go",
    "chars": 867,
    "preview": "package db\n\nimport \"time\"\n\ntype RunnerState string\n\ntype Runner struct {\n\tID                int        `db:\"id\" json:\"id"
  },
  {
    "path": "db/Schedule.go",
    "chars": 1057,
    "preview": "package db\n\nimport \"time\"\n\nconst (\n\tScheduleTypeCron  = \"\"\n\tScheduleTypeRunAt = \"run_at\"\n)\n\ntype Schedule struct {\n\tID  "
  },
  {
    "path": "db/SecretStorage.go",
    "chars": 880,
    "preview": "package db\n\ntype SecretStorageType string\n\nconst (\n\tSecretStorageTypeLocal SecretStorageType = \"local\"\n\tSecretStorageTyp"
  },
  {
    "path": "db/Session.go",
    "chars": 913,
    "preview": "package db\n\nimport \"time\"\n\ntype SessionVerificationMethod int\n\nconst (\n\tSessionVerificationNone SessionVerificationMetho"
  },
  {
    "path": "db/Store.go",
    "chars": 28302,
    "preview": "package db\n\nimport (\n\t\"database/sql/driver\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"reflect\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/semap"
  },
  {
    "path": "db/Store_test.go",
    "chars": 583,
    "preview": "package db\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestObjectToJSON(t *testing.T) {\n\tv := &S"
  },
  {
    "path": "db/Task.go",
    "chars": 6865,
    "preview": "package db\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n\n\t"
  },
  {
    "path": "db/TaskParams.go",
    "chars": 1086,
    "preview": "package db\n\ntype TaskParams struct {\n\tID        int `db:\"id\" json:\"-\" backup:\"-\"`\n\tProjectID int `db:\"project_id\" json:\""
  },
  {
    "path": "db/Template.go",
    "chars": 7778,
    "preview": "package db\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/semaphoreui/semaphore/pkg/common_errors\"\n\tlog \"github.com/sirupsen/l"
  },
  {
    "path": "db/TemplateVault.go",
    "chars": 1064,
    "preview": "package db\n\ntype TemplateVaultType string\n\nconst (\n\tTemplateVaultPassword TemplateVaultType = \"password\"\n\tTemplateVaultS"
  },
  {
    "path": "db/Template_alias.go",
    "chars": 82,
    "preview": "package db\n\nfunc (t TemplateApp) NeedTaskAlias() bool {\n\treturn t.IsTerraform()\n}\n"
  },
  {
    "path": "db/TerraformInventoryAlias.go",
    "chars": 686,
    "preview": "package db\n\nimport \"reflect\"\n\ntype TerraformInventoryAlias struct {\n\tProjectID   int    `db:\"project_id\" json:\"project_i"
  },
  {
    "path": "db/TerraformInventoryState_pro.go",
    "chars": 737,
    "preview": "package db\n\nimport (\n\t\"reflect\"\n\t\"time\"\n)\n\ntype TerraformInventoryState struct {\n\tID          int       `db:\"id\" json:\"i"
  },
  {
    "path": "db/TerraformInventoryStore_pro.go",
    "chars": 1021,
    "preview": "package db\n\ntype TerraformStore interface {\n\tCreateTerraformInventoryAlias(alias TerraformInventoryAlias) (TerraformInve"
  },
  {
    "path": "db/User.go",
    "chars": 2094,
    "preview": "package db\n\nimport (\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n)\n\n// User is the model for an entity which has"
  },
  {
    "path": "db/View.go",
    "chars": 891,
    "preview": "package db\n\ntype ViewType string\n\nconst (\n\tViewTypeAll    ViewType = \"all\"\n\tViewTypeCustom ViewType = \"\"\n)\n\ntype View st"
  },
  {
    "path": "db/ansible.go",
    "chars": 1052,
    "preview": "package db\n\nimport \"time\"\n\ntype AnsibleTaskHost struct {\n\tID          int       `json:\"id\" db:\"id\"`\n\tTaskID      int    "
  },
  {
    "path": "db/bolt/BoltDb.go",
    "chars": 22960,
    "preview": "package bolt\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"reflect\"\n\t\"sort\"\n\t\"strings\"\n\t\"sync\"\n\t\"time\"\n\n\t\"githu"
  },
  {
    "path": "db/bolt/BoltDb_test.go",
    "chars": 6404,
    "preview": "package bolt\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/stretchr/testif"
  },
  {
    "path": "db/bolt/Task_test.go",
    "chars": 1712,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"testing\"\n)\n\nfunc TestTask_GetVersion(t *testing.T) {\n\tVE"
  },
  {
    "path": "db/bolt/access_key.go",
    "chars": 2516,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc (d *BoltDb) GetAccessKey(projectID int, accessKeyI"
  },
  {
    "path": "db/bolt/environment.go",
    "chars": 1628,
    "preview": "package bolt\n\nimport \"github.com/semaphoreui/semaphore/db\"\n\nfunc (d *BoltDb) GetEnvironment(projectID int, environmentID"
  },
  {
    "path": "db/bolt/event.go",
    "chars": 3059,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/semaphoreui/semaphore/pkg/t"
  },
  {
    "path": "db/bolt/global_runner.go",
    "chars": 3169,
    "preview": "package bolt\n\nimport (\n\t\"encoding/base64\"\n\t\"github.com/gorilla/securecookie\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"gi"
  },
  {
    "path": "db/bolt/global_runner_test.go",
    "chars": 1104,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"testing\"\n)\n\nfunc T"
  },
  {
    "path": "db/bolt/integrations.go",
    "chars": 5696,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"go.etcd.io/bbolt\"\n)\n\n/*\nIntegrations\n*/\nfunc (d *BoltDb)"
  },
  {
    "path": "db/bolt/integrations_alias.go",
    "chars": 1959,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"reflect\"\n)\n\nvar integrationAliasProps = db.ObjectProps{\n"
  },
  {
    "path": "db/bolt/inventory.go",
    "chars": 1368,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc (d *BoltDb) GetInventory(projectID int, inventoryI"
  },
  {
    "path": "db/bolt/migration.go",
    "chars": 4589,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"go.etcd.io/bbolt\"\n)\n\nfunc (d *B"
  },
  {
    "path": "db/bolt/migration_2_10_12.go",
    "chars": 513,
    "preview": "package bolt\n\ntype migration_2_10_12 struct {\n\tmigration\n}\n\nfunc (d migration_2_10_12) Apply() error {\n\tprojectIDs, err "
  },
  {
    "path": "db/bolt/migration_2_10_12_test.go",
    "chars": 1076,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_10_12_Apply(t *testing.T)"
  },
  {
    "path": "db/bolt/migration_2_10_16.go",
    "chars": 706,
    "preview": "package bolt\n\ntype migration_2_10_16 struct {\n\tmigration\n}\n\nfunc (d migration_2_10_16) Apply() (err error) {\n\tprojectIDs"
  },
  {
    "path": "db/bolt/migration_2_10_16_test.go",
    "chars": 1632,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_10_16_Apply(t *testing.T)"
  },
  {
    "path": "db/bolt/migration_2_10_24.go",
    "chars": 1011,
    "preview": "package bolt\n\nimport \"fmt\"\n\ntype migration_2_10_24 struct {\n\tmigration\n}\n\nfunc (d migration_2_10_24) Apply() (err error)"
  },
  {
    "path": "db/bolt/migration_2_10_24_test.go",
    "chars": 1951,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_10_24_Apply(t *testing.T)"
  },
  {
    "path": "db/bolt/migration_2_10_33.go",
    "chars": 717,
    "preview": "package bolt\n\ntype migration_2_10_33 struct {\n\tmigration\n}\n\nfunc (d migration_2_10_33) Apply() (err error) {\n\tprojectIDs"
  },
  {
    "path": "db/bolt/migration_2_10_33_test.go",
    "chars": 1582,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_10_33_Apply(t *testing.T)"
  },
  {
    "path": "db/bolt/migration_2_14_7.go",
    "chars": 908,
    "preview": "package bolt\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/pkg/conv\"\n)\n\ntype migration_2_14_7 struct {\n\tmigration\n"
  },
  {
    "path": "db/bolt/migration_2_14_7_test.go",
    "chars": 1537,
    "preview": "package bolt\n\nimport (\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_14_7_Apply(t *testing.T) {\n\tstore := Creat"
  },
  {
    "path": "db/bolt/migration_2_17_0.go",
    "chars": 511,
    "preview": "package bolt\n\nimport \"strconv\"\n\ntype migration_2_17_0 struct {\n\tmigration\n}\n\nfunc (d migration_2_17_0) Apply() (err erro"
  },
  {
    "path": "db/bolt/migration_2_17_0_test.go",
    "chars": 875,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"go.etcd.io/bbolt\"\n)\n\nfunc Te"
  },
  {
    "path": "db/bolt/migration_2_17_2.go",
    "chars": 235,
    "preview": "package bolt\n\ntype migration_2_17_2 struct {\n\tmigration\n}\n\nfunc (d migration_2_17_2) Apply() error {\n\t// No-op migration"
  },
  {
    "path": "db/bolt/migration_2_8_28.go",
    "chars": 841,
    "preview": "package bolt\n\nimport (\n\t\"strings\"\n)\n\ntype migration_2_8_28 struct {\n\tmigration\n}\n\nfunc (d migration_2_8_28) Apply() (err"
  },
  {
    "path": "db/bolt/migration_2_8_28_test.go",
    "chars": 1604,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n\t\"go.etcd.io/bbolt\"\n)\n\nfunc Te"
  },
  {
    "path": "db/bolt/migration_2_8_40.go",
    "chars": 668,
    "preview": "package bolt\n\ntype migration_2_8_40 struct {\n\tmigration\n}\n\nfunc (d migration_2_8_40) Apply() (err error) {\n\tprojectIDs, "
  },
  {
    "path": "db/bolt/migration_2_8_40_test.go",
    "chars": 1570,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_8_40_Apply(t *testing.T) "
  },
  {
    "path": "db/bolt/migration_2_8_91.go",
    "chars": 748,
    "preview": "package bolt\n\ntype migration_2_8_91 struct {\n\tmigration\n}\n\nfunc (d migration_2_8_91) Apply() (err error) {\n\tprojectIDs, "
  },
  {
    "path": "db/bolt/migration_2_8_91_test.go",
    "chars": 1576,
    "preview": "package bolt\n\nimport (\n\t\"encoding/json\"\n\t\"go.etcd.io/bbolt\"\n\t\"testing\"\n)\n\nfunc TestMigration_2_8_91_Apply(t *testing.T) "
  },
  {
    "path": "db/bolt/option.go",
    "chars": 2035,
    "preview": "package bolt\n\nimport (\n\t\"errors\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"go.etcd.io/bbolt\"\n\t\"strings\"\n)\n\nfunc (d *BoltD"
  },
  {
    "path": "db/bolt/option_test.go",
    "chars": 793,
    "preview": "package bolt\n\nimport (\n\t\"testing\"\n)\n\nfunc TestGetOption(t *testing.T) {\n\tstore := CreateTestStore()\n\n\tval, err := store."
  },
  {
    "path": "db/bolt/project.go",
    "chars": 1401,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n)\n\nfunc (d *Bol"
  },
  {
    "path": "db/bolt/project_invite.go",
    "chars": 2320,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc (d *BoltDb) GetProjectInvites(projectID int, param"
  },
  {
    "path": "db/bolt/project_test.go",
    "chars": 1277,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n\t\"testing\"\n)\n\nf"
  },
  {
    "path": "db/bolt/public_alias.go",
    "chars": 1867,
    "preview": "package bolt\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"reflect\"\n)\n\ntype publicAlias struct {\n\t"
  },
  {
    "path": "db/bolt/repository.go",
    "chars": 1420,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc (d *BoltDb) GetRepository(projectID int, repositor"
  },
  {
    "path": "db/bolt/role.go",
    "chars": 2293,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n)\n\nfunc (d *BoltDb) GetGlobalRole(roleID int) (role db.Rol"
  },
  {
    "path": "db/bolt/runner_pro.go",
    "chars": 2264,
    "preview": "package bolt\n\nimport (\n\t\"fmt\"\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"go.etcd.io/bbolt\"\n)\n\nfunc (d *BoltDb) GetRunner(p"
  },
  {
    "path": "db/bolt/runner_pro_test.go",
    "chars": 551,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/stretchr/testify/assert\"\n\t\"testing\"\n)\n\nfunc T"
  },
  {
    "path": "db/bolt/schedule.go",
    "chars": 3289,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"go.etcd.io/bbolt\"\n)\n\nfunc (d *BoltDb) GetSchedules() (sc"
  },
  {
    "path": "db/bolt/secret_storage.go",
    "chars": 842,
    "preview": "package bolt\n\nimport \"github.com/semaphoreui/semaphore/db\"\n\nfunc (d *BoltDb) GetSecretStorages(projectID int) ([]db.Secr"
  },
  {
    "path": "db/bolt/session.go",
    "chars": 3723,
    "preview": "package bolt\n\nimport (\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"github.com/semaphoreui/semaphore/pkg/tz\"\n\t\"reflect\"\n\t\"sl"
  },
  {
    "path": "db/bolt/task.go",
    "chars": 6695,
    "preview": "package bolt\n\nimport (\n\t\"time\"\n\n\t\"github.com/semaphoreui/semaphore/db\"\n\t\"go.etcd.io/bbolt\"\n)\n\nfunc (d *BoltDb) CreateTas"
  }
]

// ... and 522 more files (download for full content)

About this extraction

This page contains the full source code of the semaphoreui/semaphore GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 722 files (6.4 MB), approximately 1.7M tokens, and a symbol index with 10498 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.

Copied to clipboard!