@gitkraken/core-gitlens 0.4.0 → 0.4.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +71 -1
- package/README.md +9 -2
- package/dist/git/cache.d.ts +29 -2
- package/dist/git/cache.d.ts.map +1 -1
- package/dist/git/cache.js +67 -7
- package/dist/git/cache.js.map +1 -1
- package/dist/git/context.d.ts.map +1 -1
- package/dist/git/errors.d.ts +31 -1
- package/dist/git/errors.d.ts.map +1 -1
- package/dist/git/errors.js +29 -0
- package/dist/git/errors.js.map +1 -1
- package/dist/git/models/author.d.ts.map +1 -1
- package/dist/git/models/author.js.map +1 -1
- package/dist/git/models/autolink.d.ts.map +1 -1
- package/dist/git/models/autolink.js.map +1 -1
- package/dist/git/models/blame.d.ts.map +1 -1
- package/dist/git/models/blame.js.map +1 -1
- package/dist/git/models/branch.d.ts.map +1 -1
- package/dist/git/models/branch.js.map +1 -1
- package/dist/git/models/commit.d.ts.map +1 -1
- package/dist/git/models/commit.js +1 -1
- package/dist/git/models/commit.js.map +1 -1
- package/dist/git/models/contributor.d.ts.map +1 -1
- package/dist/git/models/contributor.js.map +1 -1
- package/dist/git/models/defaultBranch.d.ts.map +1 -1
- package/dist/git/models/defaultBranch.js.map +1 -1
- package/dist/git/models/diff.d.ts.map +1 -1
- package/dist/git/models/diff.js.map +1 -1
- package/dist/git/models/file.d.ts.map +1 -1
- package/dist/git/models/file.js.map +1 -1
- package/dist/git/models/fileChange.d.ts.map +1 -1
- package/dist/git/models/fileChange.js.map +1 -1
- package/dist/git/models/fileStatus.d.ts +22 -22
- package/dist/git/models/fileStatus.d.ts.map +1 -1
- package/dist/git/models/fileStatus.js.map +1 -1
- package/dist/git/models/graph.d.ts +122 -1
- package/dist/git/models/graph.d.ts.map +1 -1
- package/dist/git/models/graph.js +4 -0
- package/dist/git/models/graph.js.map +1 -1
- package/dist/git/models/graphSearch.d.ts.map +1 -1
- package/dist/git/models/graphSearch.js.map +1 -1
- package/dist/git/models/graphSession.d.ts +177 -0
- package/dist/git/models/graphSession.d.ts.map +1 -0
- package/dist/git/models/graphSession.js +7 -0
- package/dist/git/models/graphSession.js.map +1 -0
- package/dist/git/models/issue.d.ts +12 -2
- package/dist/git/models/issue.d.ts.map +1 -1
- package/dist/git/models/issue.js +3 -1
- package/dist/git/models/issue.js.map +1 -1
- package/dist/git/models/issueOrPullRequest.d.ts.map +1 -1
- package/dist/git/models/issueOrPullRequest.js.map +1 -1
- package/dist/git/models/lineRange.d.ts.map +1 -1
- package/dist/git/models/lineRange.js.map +1 -1
- package/dist/git/models/log.d.ts.map +1 -1
- package/dist/git/models/log.js.map +1 -1
- package/dist/git/models/mergeConflicts.d.ts.map +1 -1
- package/dist/git/models/mergeConflicts.js.map +1 -1
- package/dist/git/models/patch.d.ts.map +1 -1
- package/dist/git/models/patch.js.map +1 -1
- package/dist/git/models/pausedOperationStatus.d.ts.map +1 -1
- package/dist/git/models/pausedOperationStatus.js.map +1 -1
- package/dist/git/models/pullRequest.d.ts +27 -2
- package/dist/git/models/pullRequest.d.ts.map +1 -1
- package/dist/git/models/pullRequest.js +7 -1
- package/dist/git/models/pullRequest.js.map +1 -1
- package/dist/git/models/rebase.d.ts.map +1 -1
- package/dist/git/models/rebase.js.map +1 -1
- package/dist/git/models/reference.d.ts.map +1 -1
- package/dist/git/models/reference.js.map +1 -1
- package/dist/git/models/reflog.d.ts.map +1 -1
- package/dist/git/models/reflog.js.map +1 -1
- package/dist/git/models/remote.d.ts.map +1 -1
- package/dist/git/models/remote.js.map +1 -1
- package/dist/git/models/remoteProvider.d.ts.map +1 -1
- package/dist/git/models/remoteProvider.js.map +1 -1
- package/dist/git/models/remoteResource.d.ts.map +1 -1
- package/dist/git/models/remoteResource.js.map +1 -1
- package/dist/git/models/repository.d.ts +20 -2
- package/dist/git/models/repository.d.ts.map +1 -1
- package/dist/git/models/repository.js +19 -0
- package/dist/git/models/repository.js.map +1 -1
- package/dist/git/models/repositoryChangeEvent.d.ts.map +1 -1
- package/dist/git/models/repositoryChangeEvent.js.map +1 -1
- package/dist/git/models/repositoryIdentities.d.ts.map +1 -1
- package/dist/git/models/repositoryIdentities.js.map +1 -1
- package/dist/git/models/repositoryMetadata.d.ts.map +1 -1
- package/dist/git/models/repositoryMetadata.js.map +1 -1
- package/dist/git/models/resourceDescriptor.d.ts +16 -0
- package/dist/git/models/resourceDescriptor.d.ts.map +1 -1
- package/dist/git/models/resourceDescriptor.js.map +1 -1
- package/dist/git/models/revision.d.ts.map +1 -1
- package/dist/git/models/revision.js.map +1 -1
- package/dist/git/models/search.d.ts.map +1 -1
- package/dist/git/models/search.js.map +1 -1
- package/dist/git/models/shortlog.d.ts.map +1 -1
- package/dist/git/models/shortlog.js.map +1 -1
- package/dist/git/models/signature.d.ts +14 -0
- package/dist/git/models/signature.d.ts.map +1 -1
- package/dist/git/models/signature.js.map +1 -1
- package/dist/git/models/staging.d.ts.map +1 -1
- package/dist/git/models/staging.js.map +1 -1
- package/dist/git/models/stash.d.ts.map +1 -1
- package/dist/git/models/stash.js.map +1 -1
- package/dist/git/models/status.d.ts.map +1 -1
- package/dist/git/models/status.js.map +1 -1
- package/dist/git/models/statusFile.d.ts.map +1 -1
- package/dist/git/models/statusFile.js.map +1 -1
- package/dist/git/models/tag.d.ts +11 -1
- package/dist/git/models/tag.d.ts.map +1 -1
- package/dist/git/models/tag.js +9 -2
- package/dist/git/models/tag.js.map +1 -1
- package/dist/git/models/tree.d.ts.map +1 -1
- package/dist/git/models/tree.js.map +1 -1
- package/dist/git/models/user.d.ts.map +1 -1
- package/dist/git/models/user.js.map +1 -1
- package/dist/git/models/worktree.d.ts.map +1 -1
- package/dist/git/models/worktree.js.map +1 -1
- package/dist/git/parsers/diffParser.d.ts.map +1 -1
- package/dist/git/parsers/diffParser.js +1 -1
- package/dist/git/parsers/diffParser.js.map +1 -1
- package/dist/git/parsers/rebaseTodoParser.d.ts.map +1 -1
- package/dist/git/parsers/rebaseTodoParser.js.map +1 -1
- package/dist/git/providers/blame.d.ts.map +1 -1
- package/dist/git/providers/blame.js.map +1 -1
- package/dist/git/providers/branches.d.ts +8 -1
- package/dist/git/providers/branches.d.ts.map +1 -1
- package/dist/git/providers/branches.js.map +1 -1
- package/dist/git/providers/commits.d.ts +6 -1
- package/dist/git/providers/commits.d.ts.map +1 -1
- package/dist/git/providers/commits.js.map +1 -1
- package/dist/git/providers/config.d.ts +6 -2
- package/dist/git/providers/config.d.ts.map +1 -1
- package/dist/git/providers/config.js.map +1 -1
- package/dist/git/providers/contributors.d.ts.map +1 -1
- package/dist/git/providers/contributors.js.map +1 -1
- package/dist/git/providers/diff.d.ts.map +1 -1
- package/dist/git/providers/diff.js.map +1 -1
- package/dist/git/providers/graph.d.ts +55 -1
- package/dist/git/providers/graph.d.ts.map +1 -1
- package/dist/git/providers/graph.js.map +1 -1
- package/dist/git/providers/operations.d.ts.map +1 -1
- package/dist/git/providers/operations.js.map +1 -1
- package/dist/git/providers/patch.d.ts.map +1 -1
- package/dist/git/providers/patch.js.map +1 -1
- package/dist/git/providers/pausedOperations.d.ts.map +1 -1
- package/dist/git/providers/pausedOperations.js.map +1 -1
- package/dist/git/providers/provider.d.ts.map +1 -1
- package/dist/git/providers/provider.js.map +1 -1
- package/dist/git/providers/refs.d.ts.map +1 -1
- package/dist/git/providers/refs.js.map +1 -1
- package/dist/git/providers/remotes.d.ts.map +1 -1
- package/dist/git/providers/remotes.js.map +1 -1
- package/dist/git/providers/revision.d.ts.map +1 -1
- package/dist/git/providers/revision.js.map +1 -1
- package/dist/git/providers/shared/remotes.d.ts.map +1 -1
- package/dist/git/providers/shared/remotes.js.map +1 -1
- package/dist/git/providers/staging.d.ts.map +1 -1
- package/dist/git/providers/staging.js.map +1 -1
- package/dist/git/providers/stash.d.ts.map +1 -1
- package/dist/git/providers/stash.js.map +1 -1
- package/dist/git/providers/status.d.ts +1 -0
- package/dist/git/providers/status.d.ts.map +1 -1
- package/dist/git/providers/status.js.map +1 -1
- package/dist/git/providers/tags.d.ts.map +1 -1
- package/dist/git/providers/tags.js.map +1 -1
- package/dist/git/providers/types.d.ts.map +1 -1
- package/dist/git/providers/types.js.map +1 -1
- package/dist/git/providers/worktrees.d.ts +3 -1
- package/dist/git/providers/worktrees.d.ts.map +1 -1
- package/dist/git/providers/worktrees.js.map +1 -1
- package/dist/git/remotes/azure-devops.d.ts.map +1 -1
- package/dist/git/remotes/azure-devops.js +27 -31
- package/dist/git/remotes/azure-devops.js.map +1 -1
- package/dist/git/remotes/bitbucket-server.d.ts.map +1 -1
- package/dist/git/remotes/bitbucket-server.js +21 -23
- package/dist/git/remotes/bitbucket-server.js.map +1 -1
- package/dist/git/remotes/bitbucket.d.ts.map +1 -1
- package/dist/git/remotes/bitbucket.js +21 -23
- package/dist/git/remotes/bitbucket.js.map +1 -1
- package/dist/git/remotes/custom.d.ts.map +1 -1
- package/dist/git/remotes/custom.js.map +1 -1
- package/dist/git/remotes/gerrit.d.ts.map +1 -1
- package/dist/git/remotes/gerrit.js +11 -13
- package/dist/git/remotes/gerrit.js.map +1 -1
- package/dist/git/remotes/gitea.d.ts.map +1 -1
- package/dist/git/remotes/gitea.js +12 -14
- package/dist/git/remotes/gitea.js.map +1 -1
- package/dist/git/remotes/github.d.ts.map +1 -1
- package/dist/git/remotes/github.js +54 -56
- package/dist/git/remotes/github.js.map +1 -1
- package/dist/git/remotes/gitlab.d.ts.map +1 -1
- package/dist/git/remotes/gitlab.js +93 -95
- package/dist/git/remotes/gitlab.js.map +1 -1
- package/dist/git/remotes/google-source.d.ts.map +1 -1
- package/dist/git/remotes/google-source.js.map +1 -1
- package/dist/git/remotes/matcher.d.ts.map +1 -1
- package/dist/git/remotes/matcher.js.map +1 -1
- package/dist/git/run.types.d.ts +62 -3
- package/dist/git/run.types.d.ts.map +1 -1
- package/dist/git/service.d.ts.map +1 -1
- package/dist/git/utils/autolink.utils.d.ts.map +1 -1
- package/dist/git/utils/autolink.utils.js.map +1 -1
- package/dist/git/utils/blame.utils.d.ts.map +1 -1
- package/dist/git/utils/blame.utils.js.map +1 -1
- package/dist/git/utils/branch.utils.d.ts.map +1 -1
- package/dist/git/utils/branch.utils.js +12 -1
- package/dist/git/utils/branch.utils.js.map +1 -1
- package/dist/git/utils/commit.utils.d.ts.map +1 -1
- package/dist/git/utils/commit.utils.js.map +1 -1
- package/dist/git/utils/conflictResolution.utils.d.ts.map +1 -1
- package/dist/git/utils/conflictResolution.utils.js.map +1 -1
- package/dist/git/utils/contributor.utils.d.ts +1 -1
- package/dist/git/utils/contributor.utils.d.ts.map +1 -1
- package/dist/git/utils/contributor.utils.js +1 -2
- package/dist/git/utils/contributor.utils.js.map +1 -1
- package/dist/git/utils/fetch.utils.d.ts.map +1 -1
- package/dist/git/utils/fetch.utils.js.map +1 -1
- package/dist/git/utils/fileStatus.utils.d.ts +7 -0
- package/dist/git/utils/fileStatus.utils.d.ts.map +1 -1
- package/dist/git/utils/fileStatus.utils.js +6 -0
- package/dist/git/utils/fileStatus.utils.js.map +1 -1
- package/dist/git/utils/graph.utils.d.ts +20 -0
- package/dist/git/utils/graph.utils.d.ts.map +1 -0
- package/dist/git/utils/graph.utils.js +40 -0
- package/dist/git/utils/graph.utils.js.map +1 -0
- package/dist/git/utils/issue.utils.d.ts.map +1 -1
- package/dist/git/utils/issue.utils.js +1 -0
- package/dist/git/utils/issue.utils.js.map +1 -1
- package/dist/git/utils/issueOrPullRequest.utils.d.ts.map +1 -1
- package/dist/git/utils/issueOrPullRequest.utils.js.map +1 -1
- package/dist/git/utils/mergeConflicts.utils.d.ts.map +1 -1
- package/dist/git/utils/mergeConflicts.utils.js.map +1 -1
- package/dist/git/utils/pausedOperationStatus.utils.d.ts +13 -13
- package/dist/git/utils/pausedOperationStatus.utils.d.ts.map +1 -1
- package/dist/git/utils/pausedOperationStatus.utils.js.map +1 -1
- package/dist/git/utils/pullRequest.utils.d.ts.map +1 -1
- package/dist/git/utils/pullRequest.utils.js +9 -0
- package/dist/git/utils/pullRequest.utils.js.map +1 -1
- package/dist/git/utils/reachability.utils.d.ts +20 -2
- package/dist/git/utils/reachability.utils.d.ts.map +1 -1
- package/dist/git/utils/reachability.utils.js +68 -7
- package/dist/git/utils/reachability.utils.js.map +1 -1
- package/dist/git/utils/rebase.utils.d.ts.map +1 -1
- package/dist/git/utils/rebase.utils.js.map +1 -1
- package/dist/git/utils/reference.utils.d.ts.map +1 -1
- package/dist/git/utils/reference.utils.js.map +1 -1
- package/dist/git/utils/remote.utils.d.ts.map +1 -1
- package/dist/git/utils/remote.utils.js.map +1 -1
- package/dist/git/utils/repository.utils.d.ts.map +1 -1
- package/dist/git/utils/repository.utils.js.map +1 -1
- package/dist/git/utils/resourceDescriptor.utils.d.ts.map +1 -1
- package/dist/git/utils/resourceDescriptor.utils.js.map +1 -1
- package/dist/git/utils/revision.utils.d.ts.map +1 -1
- package/dist/git/utils/revision.utils.js.map +1 -1
- package/dist/git/utils/search.utils.d.ts.map +1 -1
- package/dist/git/utils/search.utils.js.map +1 -1
- package/dist/git/utils/sorting.d.ts.map +1 -1
- package/dist/git/utils/sorting.js.map +1 -1
- package/dist/git/utils/sshKey.utils.d.ts +7 -0
- package/dist/git/utils/sshKey.utils.d.ts.map +1 -0
- package/dist/git/utils/sshKey.utils.js +25 -0
- package/dist/git/utils/sshKey.utils.js.map +1 -0
- package/dist/git/utils/status.utils.d.ts.map +1 -1
- package/dist/git/utils/status.utils.js.map +1 -1
- package/dist/git/utils/statusFile.utils.d.ts.map +1 -1
- package/dist/git/utils/statusFile.utils.js.map +1 -1
- package/dist/git/utils/tag.utils.d.ts.map +1 -1
- package/dist/git/utils/tag.utils.js.map +1 -1
- package/dist/git/utils/tooltip.utils.d.ts.map +1 -1
- package/dist/git/utils/tooltip.utils.js.map +1 -1
- package/dist/git/utils/uriAuthority.d.ts.map +1 -1
- package/dist/git/utils/uriAuthority.js.map +1 -1
- package/dist/git/utils/user.utils.d.ts.map +1 -1
- package/dist/git/utils/user.utils.js.map +1 -1
- package/dist/git/utils/worktree.utils.d.ts.map +1 -1
- package/dist/git/utils/worktree.utils.js.map +1 -1
- package/dist/git/watching/changeEvent.d.ts.map +1 -1
- package/dist/git/watching/changeEvent.js.map +1 -1
- package/dist/git/watching/classifyChange.d.ts.map +1 -1
- package/dist/git/watching/classifyChange.js.map +1 -1
- package/dist/git/watching/gitIgnoreFilter.d.ts.map +1 -1
- package/dist/git/watching/gitIgnoreFilter.js.map +1 -1
- package/dist/git/watching/initWatcher.d.ts.map +1 -1
- package/dist/git/watching/initWatcher.js.map +1 -1
- package/dist/git/watching/provider.d.ts.map +1 -1
- package/dist/git/watching/provider.js.map +1 -1
- package/dist/git/watching/watchGroup.d.ts.map +1 -1
- package/dist/git/watching/watchGroup.js.map +1 -1
- package/dist/git/watching/watchService.d.ts +4 -0
- package/dist/git/watching/watchService.d.ts.map +1 -1
- package/dist/git/watching/watchService.js +15 -1
- package/dist/git/watching/watchService.js.map +1 -1
- package/dist/git/watching/watchSession.d.ts +7 -0
- package/dist/git/watching/watchSession.d.ts.map +1 -1
- package/dist/git/watching/watchSession.js +14 -2
- package/dist/git/watching/watchSession.js.map +1 -1
- package/dist/git/watching/watcherPatterns.d.ts.map +1 -1
- package/dist/git/watching/watcherPatterns.js.map +1 -1
- package/dist/git-cli/cliGitProvider.d.ts.map +1 -1
- package/dist/git-cli/exec/exec.d.ts.map +1 -1
- package/dist/git-cli/exec/exec.errors.d.ts.map +1 -1
- package/dist/git-cli/exec/exec.errors.js.map +1 -1
- package/dist/git-cli/exec/exec.js.map +1 -1
- package/dist/git-cli/exec/exec.types.d.ts.map +1 -1
- package/dist/git-cli/exec/exec.types.js.map +1 -1
- package/dist/git-cli/exec/features.d.ts.map +1 -1
- package/dist/git-cli/exec/features.js.map +1 -1
- package/dist/git-cli/exec/git.d.ts +19 -27
- package/dist/git-cli/exec/git.d.ts.map +1 -1
- package/dist/git-cli/exec/git.js +126 -34
- package/dist/git-cli/exec/git.js.map +1 -1
- package/dist/git-cli/exec/gitQueue.d.ts.map +1 -1
- package/dist/git-cli/exec/gitQueue.js.map +1 -1
- package/dist/git-cli/exec/locator.d.ts.map +1 -1
- package/dist/git-cli/exec/locator.js.map +1 -1
- package/dist/git-cli/parsers/blameParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/blameParser.js.map +1 -1
- package/dist/git-cli/parsers/indexParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/indexParser.js.map +1 -1
- package/dist/git-cli/parsers/logParser.d.ts +9 -1
- package/dist/git-cli/parsers/logParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/logParser.js +141 -60
- package/dist/git-cli/parsers/logParser.js.map +1 -1
- package/dist/git-cli/parsers/mergeTreeParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/mergeTreeParser.js.map +1 -1
- package/dist/git-cli/parsers/refParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/refParser.js.map +1 -1
- package/dist/git-cli/parsers/reflogParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/reflogParser.js.map +1 -1
- package/dist/git-cli/parsers/remoteParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/remoteParser.js.map +1 -1
- package/dist/git-cli/parsers/shortlogParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/shortlogParser.js.map +1 -1
- package/dist/git-cli/parsers/signatureParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/signatureParser.js.map +1 -1
- package/dist/git-cli/parsers/sshSignatureParser.d.ts +21 -0
- package/dist/git-cli/parsers/sshSignatureParser.d.ts.map +1 -0
- package/dist/git-cli/parsers/sshSignatureParser.js +78 -0
- package/dist/git-cli/parsers/sshSignatureParser.js.map +1 -0
- package/dist/git-cli/parsers/statusParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/statusParser.js.map +1 -1
- package/dist/git-cli/parsers/treeParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/treeParser.js.map +1 -1
- package/dist/git-cli/parsers/worktreeParser.d.ts.map +1 -1
- package/dist/git-cli/parsers/worktreeParser.js +5 -7
- package/dist/git-cli/parsers/worktreeParser.js.map +1 -1
- package/dist/git-cli/providers/blame.d.ts.map +1 -1
- package/dist/git-cli/providers/blame.js.map +1 -1
- package/dist/git-cli/providers/branches.d.ts +1 -0
- package/dist/git-cli/providers/branches.d.ts.map +1 -1
- package/dist/git-cli/providers/branches.js +51 -32
- package/dist/git-cli/providers/branches.js.map +1 -1
- package/dist/git-cli/providers/commitFilesetUtils.d.ts.map +1 -1
- package/dist/git-cli/providers/commitFilesetUtils.js.map +1 -1
- package/dist/git-cli/providers/commits.d.ts +12 -1
- package/dist/git-cli/providers/commits.d.ts.map +1 -1
- package/dist/git-cli/providers/commits.js +89 -8
- package/dist/git-cli/providers/commits.js.map +1 -1
- package/dist/git-cli/providers/config.d.ts.map +1 -1
- package/dist/git-cli/providers/config.js.map +1 -1
- package/dist/git-cli/providers/contributors.d.ts.map +1 -1
- package/dist/git-cli/providers/contributors.js.map +1 -1
- package/dist/git-cli/providers/diff.d.ts.map +1 -1
- package/dist/git-cli/providers/diff.js.map +1 -1
- package/dist/git-cli/providers/graph.d.ts +35 -1
- package/dist/git-cli/providers/graph.d.ts.map +1 -1
- package/dist/git-cli/providers/graph.js +1434 -330
- package/dist/git-cli/providers/graph.js.map +1 -1
- package/dist/git-cli/providers/operations.d.ts.map +1 -1
- package/dist/git-cli/providers/operations.js.map +1 -1
- package/dist/git-cli/providers/patch.d.ts.map +1 -1
- package/dist/git-cli/providers/patch.js.map +1 -1
- package/dist/git-cli/providers/pausedOperations.d.ts.map +1 -1
- package/dist/git-cli/providers/pausedOperations.js +3 -3
- package/dist/git-cli/providers/pausedOperations.js.map +1 -1
- package/dist/git-cli/providers/refs.d.ts.map +1 -1
- package/dist/git-cli/providers/refs.js.map +1 -1
- package/dist/git-cli/providers/remotes.d.ts.map +1 -1
- package/dist/git-cli/providers/remotes.js.map +1 -1
- package/dist/git-cli/providers/revision.d.ts +1 -0
- package/dist/git-cli/providers/revision.d.ts.map +1 -1
- package/dist/git-cli/providers/revision.js +33 -0
- package/dist/git-cli/providers/revision.js.map +1 -1
- package/dist/git-cli/providers/staging.d.ts.map +1 -1
- package/dist/git-cli/providers/staging.js.map +1 -1
- package/dist/git-cli/providers/stash.d.ts.map +1 -1
- package/dist/git-cli/providers/stash.js.map +1 -1
- package/dist/git-cli/providers/status.d.ts +28 -0
- package/dist/git-cli/providers/status.d.ts.map +1 -1
- package/dist/git-cli/providers/status.js +240 -154
- package/dist/git-cli/providers/status.js.map +1 -1
- package/dist/git-cli/providers/tags.d.ts.map +1 -1
- package/dist/git-cli/providers/tags.js +2 -1
- package/dist/git-cli/providers/tags.js.map +1 -1
- package/dist/git-cli/providers/worktrees.d.ts +2 -1
- package/dist/git-cli/providers/worktrees.d.ts.map +1 -1
- package/dist/git-cli/providers/worktrees.js +28 -3
- package/dist/git-cli/providers/worktrees.js.map +1 -1
- package/dist/git-cli/service.d.ts.map +1 -1
- package/dist/git-cli/service.js +8 -0
- package/dist/git-cli/service.js.map +1 -1
- package/dist/ipc/ipcServer.d.ts.map +1 -1
- package/dist/ipc/ipcServer.js +1 -1
- package/dist/ipc/ipcServer.js.map +1 -1
- package/dist/plus/agents/providers/claudeCodeProvider.d.ts +6 -1
- package/dist/plus/agents/providers/claudeCodeProvider.d.ts.map +1 -1
- package/dist/plus/agents/providers/claudeCodeProvider.js +19 -0
- package/dist/plus/agents/providers/claudeCodeProvider.js.map +1 -1
- package/dist/plus/agents/providers/claudeCodeTranscript.d.ts +68 -0
- package/dist/plus/agents/providers/claudeCodeTranscript.d.ts.map +1 -1
- package/dist/plus/agents/providers/claudeCodeTranscript.js +262 -8
- package/dist/plus/agents/providers/claudeCodeTranscript.js.map +1 -1
- package/dist/plus/agents/types.d.ts +36 -2
- package/dist/plus/agents/types.d.ts.map +1 -1
- package/dist/plus/ai/constants.d.ts +1 -2
- package/dist/plus/ai/constants.d.ts.map +1 -1
- package/dist/plus/ai/constants.js +1 -8
- package/dist/plus/ai/constants.js.map +1 -1
- package/dist/plus/ai/errors.d.ts.map +1 -1
- package/dist/plus/ai/errors.js.map +1 -1
- package/dist/plus/ai/models/conversation.d.ts.map +1 -1
- package/dist/plus/ai/models/conversation.js.map +1 -1
- package/dist/plus/ai/models/model.d.ts +2 -1
- package/dist/plus/ai/models/model.d.ts.map +1 -1
- package/dist/plus/ai/models/model.js +50 -1
- package/dist/plus/ai/models/model.js.map +1 -1
- package/dist/plus/ai/models/promptTemplates.d.ts +5 -2
- package/dist/plus/ai/models/promptTemplates.d.ts.map +1 -1
- package/dist/plus/ai/models/promptTemplates.js.map +1 -1
- package/dist/plus/ai/models/provider.d.ts.map +1 -1
- package/dist/plus/ai/models/provider.js.map +1 -1
- package/dist/plus/ai/models/results.d.ts.map +1 -1
- package/dist/plus/ai/models/results.js.map +1 -1
- package/dist/plus/ai/prompts.d.ts +1 -1
- package/dist/plus/ai/prompts.d.ts.map +1 -1
- package/dist/plus/ai/prompts.js +15 -47
- package/dist/plus/ai/prompts.js.map +1 -1
- package/dist/plus/ai/providers/anthropicProvider.d.ts +5 -0
- package/dist/plus/ai/providers/anthropicProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/anthropicProvider.js +40 -3
- package/dist/plus/ai/providers/anthropicProvider.js.map +1 -1
- package/dist/plus/ai/providers/azureProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/azureProvider.js.map +1 -1
- package/dist/plus/ai/providers/context.d.ts.map +1 -1
- package/dist/plus/ai/providers/context.js.map +1 -1
- package/dist/plus/ai/providers/deepSeekProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/deepSeekProvider.js +17 -1
- package/dist/plus/ai/providers/deepSeekProvider.js.map +1 -1
- package/dist/plus/ai/providers/geminiProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/geminiProvider.js +25 -6
- package/dist/plus/ai/providers/geminiProvider.js.map +1 -1
- package/dist/plus/ai/providers/gitkrakenProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/gitkrakenProvider.js +1 -0
- package/dist/plus/ai/providers/gitkrakenProvider.js.map +1 -1
- package/dist/plus/ai/providers/huggingFaceProvider.d.ts +1 -1
- package/dist/plus/ai/providers/huggingFaceProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/huggingFaceProvider.js +21 -18
- package/dist/plus/ai/providers/huggingFaceProvider.js.map +1 -1
- package/dist/plus/ai/providers/mistralProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/mistralProvider.js.map +1 -1
- package/dist/plus/ai/providers/ollamaProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/ollamaProvider.js.map +1 -1
- package/dist/plus/ai/providers/openAICompatibleProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/openAICompatibleProvider.js.map +1 -1
- package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts +10 -1
- package/dist/plus/ai/providers/openAICompatibleProviderBase.d.ts.map +1 -1
- package/dist/plus/ai/providers/openAICompatibleProviderBase.js +9 -1
- package/dist/plus/ai/providers/openAICompatibleProviderBase.js.map +1 -1
- package/dist/plus/ai/providers/openRouterProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/openRouterProvider.js.map +1 -1
- package/dist/plus/ai/providers/openaiProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/openaiProvider.js.map +1 -1
- package/dist/plus/ai/providers/xaiProvider.d.ts.map +1 -1
- package/dist/plus/ai/providers/xaiProvider.js +14 -1
- package/dist/plus/ai/providers/xaiProvider.js.map +1 -1
- package/dist/plus/ai/utils/ai.utils.d.ts.map +1 -1
- package/dist/plus/ai/utils/ai.utils.js +0 -2
- package/dist/plus/ai/utils/ai.utils.js.map +1 -1
- package/dist/plus/ai/utils/results.utils.d.ts +3 -0
- package/dist/plus/ai/utils/results.utils.d.ts.map +1 -1
- package/dist/plus/ai/utils/results.utils.js +26 -0
- package/dist/plus/ai/utils/results.utils.js.map +1 -1
- package/dist/plus/ai/utils/truncation.utils.d.ts +1 -1
- package/dist/plus/ai/utils/truncation.utils.d.ts.map +1 -1
- package/dist/plus/ai/utils/truncation.utils.js.map +1 -1
- package/dist/plus/git-github/api/config.d.ts.map +1 -1
- package/dist/plus/git-github/api/config.js.map +1 -1
- package/dist/plus/git-github/api/github.d.ts +66 -3
- package/dist/plus/git-github/api/github.d.ts.map +1 -1
- package/dist/plus/git-github/api/github.js +345 -74
- package/dist/plus/git-github/api/github.js.map +1 -1
- package/dist/plus/git-github/api/github.utils.d.ts.map +1 -1
- package/dist/plus/git-github/api/github.utils.js.map +1 -1
- package/dist/plus/git-github/api/token.d.ts.map +1 -1
- package/dist/plus/git-github/api/token.js.map +1 -1
- package/dist/plus/git-github/api/tokenUtils.d.ts.map +1 -1
- package/dist/plus/git-github/api/tokenUtils.js.map +1 -1
- package/dist/plus/git-github/api/types.d.ts.map +1 -1
- package/dist/plus/git-github/api/types.js.map +1 -1
- package/dist/plus/git-github/context.d.ts.map +1 -1
- package/dist/plus/git-github/models.d.ts +5 -0
- package/dist/plus/git-github/models.d.ts.map +1 -1
- package/dist/plus/git-github/models.js +27 -2
- package/dist/plus/git-github/models.js.map +1 -1
- package/dist/plus/git-github/providers/github/blame.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/blame.js.map +1 -1
- package/dist/plus/git-github/providers/github/branches.d.ts +2 -1
- package/dist/plus/git-github/providers/github/branches.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/branches.js +7 -3
- package/dist/plus/git-github/providers/github/branches.js.map +1 -1
- package/dist/plus/git-github/providers/github/commits.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/commits.js.map +1 -1
- package/dist/plus/git-github/providers/github/config.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/config.js.map +1 -1
- package/dist/plus/git-github/providers/github/contributors.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/contributors.js.map +1 -1
- package/dist/plus/git-github/providers/github/diff.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/diff.js +2 -2
- package/dist/plus/git-github/providers/github/diff.js.map +1 -1
- package/dist/plus/git-github/providers/github/graph.d.ts +12 -1
- package/dist/plus/git-github/providers/github/graph.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/graph.js +85 -0
- package/dist/plus/git-github/providers/github/graph.js.map +1 -1
- package/dist/plus/git-github/providers/github/refs.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/refs.js.map +1 -1
- package/dist/plus/git-github/providers/github/remotes.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/remotes.js.map +1 -1
- package/dist/plus/git-github/providers/github/revision.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/revision.js.map +1 -1
- package/dist/plus/git-github/providers/github/status.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/status.js.map +1 -1
- package/dist/plus/git-github/providers/github/tags.d.ts.map +1 -1
- package/dist/plus/git-github/providers/github/tags.js +3 -1
- package/dist/plus/git-github/providers/github/tags.js.map +1 -1
- package/dist/plus/git-github/providers/githubGitProvider.d.ts.map +1 -1
- package/dist/plus/git-github/providers/githubGitProvider.js.map +1 -1
- package/dist/plus/git-github/providers/githubProvider.d.ts.map +1 -1
- package/dist/plus/git-github/providers/githubProvider.js.map +1 -1
- package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts +20 -1
- package/dist/plus/integrations/authentication/cloudIntegrationService.d.ts.map +1 -1
- package/dist/plus/integrations/authentication/cloudIntegrationService.js +134 -10
- package/dist/plus/integrations/authentication/cloudIntegrationService.js.map +1 -1
- package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts +52 -5
- package/dist/plus/integrations/authentication/configuredIntegrationService.d.ts.map +1 -1
- package/dist/plus/integrations/authentication/configuredIntegrationService.js +248 -46
- package/dist/plus/integrations/authentication/configuredIntegrationService.js.map +1 -1
- package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts +24 -4
- package/dist/plus/integrations/authentication/integrationAuthenticationProvider.d.ts.map +1 -1
- package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js +58 -26
- package/dist/plus/integrations/authentication/integrationAuthenticationProvider.js.map +1 -1
- package/dist/plus/integrations/authentication/integrationAuthenticationService.d.ts.map +1 -1
- package/dist/plus/integrations/authentication/integrationAuthenticationService.js +7 -3
- package/dist/plus/integrations/authentication/integrationAuthenticationService.js.map +1 -1
- package/dist/plus/integrations/authentication/manualTokenProvider.d.ts +1 -0
- package/dist/plus/integrations/authentication/manualTokenProvider.d.ts.map +1 -1
- package/dist/plus/integrations/authentication/manualTokenProvider.js +9 -5
- package/dist/plus/integrations/authentication/manualTokenProvider.js.map +1 -1
- package/dist/plus/integrations/authentication/models.d.ts +33 -0
- package/dist/plus/integrations/authentication/models.d.ts.map +1 -1
- package/dist/plus/integrations/authentication/models.js.map +1 -1
- package/dist/plus/integrations/collectionMetadata.d.ts +21 -0
- package/dist/plus/integrations/collectionMetadata.d.ts.map +1 -0
- package/dist/plus/integrations/collectionMetadata.js +121 -0
- package/dist/plus/integrations/collectionMetadata.js.map +1 -0
- package/dist/plus/integrations/constants.d.ts +12 -2
- package/dist/plus/integrations/constants.d.ts.map +1 -1
- package/dist/plus/integrations/constants.js +10 -0
- package/dist/plus/integrations/constants.js.map +1 -1
- package/dist/plus/integrations/context.d.ts +10 -6
- package/dist/plus/integrations/context.d.ts.map +1 -1
- package/dist/plus/integrations/errors.d.ts +65 -0
- package/dist/plus/integrations/errors.d.ts.map +1 -1
- package/dist/plus/integrations/errors.js +131 -0
- package/dist/plus/integrations/errors.js.map +1 -1
- package/dist/plus/integrations/index.d.ts +57 -12
- package/dist/plus/integrations/index.d.ts.map +1 -1
- package/dist/plus/integrations/index.js +39 -37
- package/dist/plus/integrations/index.js.map +1 -1
- package/dist/plus/integrations/integrationService.d.ts +293 -12
- package/dist/plus/integrations/integrationService.d.ts.map +1 -1
- package/dist/plus/integrations/integrationService.js +1305 -37
- package/dist/plus/integrations/integrationService.js.map +1 -1
- package/dist/plus/integrations/lite.d.ts +47 -0
- package/dist/plus/integrations/lite.d.ts.map +1 -0
- package/dist/plus/integrations/lite.js +141 -0
- package/dist/plus/integrations/lite.js.map +1 -0
- package/dist/plus/integrations/manager.d.ts +332 -0
- package/dist/plus/integrations/manager.d.ts.map +1 -0
- package/dist/plus/integrations/manager.js +2 -0
- package/dist/plus/integrations/manager.js.map +1 -0
- package/dist/plus/integrations/models/gitHostIntegration.d.ts +269 -10
- package/dist/plus/integrations/models/gitHostIntegration.d.ts.map +1 -1
- package/dist/plus/integrations/models/gitHostIntegration.js +712 -88
- package/dist/plus/integrations/models/gitHostIntegration.js.map +1 -1
- package/dist/plus/integrations/models/integration.d.ts +88 -3
- package/dist/plus/integrations/models/integration.d.ts.map +1 -1
- package/dist/plus/integrations/models/integration.js +192 -21
- package/dist/plus/integrations/models/integration.js.map +1 -1
- package/dist/plus/integrations/models/issuesIntegration.d.ts +87 -7
- package/dist/plus/integrations/models/issuesIntegration.d.ts.map +1 -1
- package/dist/plus/integrations/models/issuesIntegration.js +148 -33
- package/dist/plus/integrations/models/issuesIntegration.js.map +1 -1
- package/dist/plus/integrations/providerFilters.d.ts +12 -0
- package/dist/plus/integrations/providerFilters.d.ts.map +1 -0
- package/dist/plus/integrations/providerFilters.js +14 -0
- package/dist/plus/integrations/providerFilters.js.map +1 -0
- package/dist/plus/integrations/providers/apiClients.d.ts.map +1 -1
- package/dist/plus/integrations/providers/apiClients.js +3 -3
- package/dist/plus/integrations/providers/apiClients.js.map +1 -1
- package/dist/plus/integrations/providers/apiConfig.d.ts +52 -0
- package/dist/plus/integrations/providers/apiConfig.d.ts.map +1 -0
- package/dist/plus/integrations/providers/apiConfig.js +19 -0
- package/dist/plus/integrations/providers/apiConfig.js.map +1 -0
- package/dist/plus/integrations/providers/azure/azure.d.ts +14 -2
- package/dist/plus/integrations/providers/azure/azure.d.ts.map +1 -1
- package/dist/plus/integrations/providers/azure/azure.js +107 -32
- package/dist/plus/integrations/providers/azure/azure.js.map +1 -1
- package/dist/plus/integrations/providers/azure/models.d.ts +16 -0
- package/dist/plus/integrations/providers/azure/models.d.ts.map +1 -1
- package/dist/plus/integrations/providers/azure/models.js +6 -6
- package/dist/plus/integrations/providers/azure/models.js.map +1 -1
- package/dist/plus/integrations/providers/azureDevOps.d.ts +55 -9
- package/dist/plus/integrations/providers/azureDevOps.d.ts.map +1 -1
- package/dist/plus/integrations/providers/azureDevOps.js +572 -79
- package/dist/plus/integrations/providers/azureDevOps.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts +13 -2
- package/dist/plus/integrations/providers/bitbucket/bitbucket.d.ts.map +1 -1
- package/dist/plus/integrations/providers/bitbucket/bitbucket.js +108 -32
- package/dist/plus/integrations/providers/bitbucket/bitbucket.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket/models.d.ts.map +1 -1
- package/dist/plus/integrations/providers/bitbucket/models.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server/models.d.ts +19 -1
- package/dist/plus/integrations/providers/bitbucket-server/models.d.ts.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server/models.js +20 -1
- package/dist/plus/integrations/providers/bitbucket-server/models.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server.d.ts +28 -4
- package/dist/plus/integrations/providers/bitbucket-server.d.ts.map +1 -1
- package/dist/plus/integrations/providers/bitbucket-server.js +110 -6
- package/dist/plus/integrations/providers/bitbucket-server.js.map +1 -1
- package/dist/plus/integrations/providers/bitbucket.d.ts +38 -4
- package/dist/plus/integrations/providers/bitbucket.d.ts.map +1 -1
- package/dist/plus/integrations/providers/bitbucket.js +330 -34
- package/dist/plus/integrations/providers/bitbucket.js.map +1 -1
- package/dist/plus/integrations/providers/github/github.d.ts.map +1 -1
- package/dist/plus/integrations/providers/github/github.js +1 -1
- package/dist/plus/integrations/providers/github/github.js.map +1 -1
- package/dist/plus/integrations/providers/github/github.utils.d.ts.map +1 -1
- package/dist/plus/integrations/providers/github/github.utils.js.map +1 -1
- package/dist/plus/integrations/providers/github/models.d.ts.map +1 -1
- package/dist/plus/integrations/providers/github/models.js.map +1 -1
- package/dist/plus/integrations/providers/github.d.ts +49 -6
- package/dist/plus/integrations/providers/github.d.ts.map +1 -1
- package/dist/plus/integrations/providers/github.js +289 -4
- package/dist/plus/integrations/providers/github.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab/gitlab.d.ts +11 -3
- package/dist/plus/integrations/providers/gitlab/gitlab.d.ts.map +1 -1
- package/dist/plus/integrations/providers/gitlab/gitlab.js +121 -47
- package/dist/plus/integrations/providers/gitlab/gitlab.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts +6 -0
- package/dist/plus/integrations/providers/gitlab/gitlab.utils.d.ts.map +1 -1
- package/dist/plus/integrations/providers/gitlab/gitlab.utils.js +8 -0
- package/dist/plus/integrations/providers/gitlab/gitlab.utils.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab/models.d.ts +10 -0
- package/dist/plus/integrations/providers/gitlab/models.d.ts.map +1 -1
- package/dist/plus/integrations/providers/gitlab/models.js +8 -5
- package/dist/plus/integrations/providers/gitlab/models.js.map +1 -1
- package/dist/plus/integrations/providers/gitlab.d.ts +50 -5
- package/dist/plus/integrations/providers/gitlab.d.ts.map +1 -1
- package/dist/plus/integrations/providers/gitlab.js +274 -8
- package/dist/plus/integrations/providers/gitlab.js.map +1 -1
- package/dist/plus/integrations/providers/jira.d.ts +13 -2
- package/dist/plus/integrations/providers/jira.d.ts.map +1 -1
- package/dist/plus/integrations/providers/jira.js +200 -30
- package/dist/plus/integrations/providers/jira.js.map +1 -1
- package/dist/plus/integrations/providers/linear.d.ts +16 -5
- package/dist/plus/integrations/providers/linear.d.ts.map +1 -1
- package/dist/plus/integrations/providers/linear.js +127 -21
- package/dist/plus/integrations/providers/linear.js.map +1 -1
- package/dist/plus/integrations/providers/models.d.ts +339 -60
- package/dist/plus/integrations/providers/models.d.ts.map +1 -1
- package/dist/plus/integrations/providers/models.js +307 -59
- package/dist/plus/integrations/providers/models.js.map +1 -1
- package/dist/plus/integrations/providers/providersApi.d.ts +144 -11
- package/dist/plus/integrations/providers/providersApi.d.ts.map +1 -1
- package/dist/plus/integrations/providers/providersApi.js +486 -55
- package/dist/plus/integrations/providers/providersApi.js.map +1 -1
- package/dist/plus/integrations/providers/trello.d.ts +47 -0
- package/dist/plus/integrations/providers/trello.d.ts.map +1 -0
- package/dist/plus/integrations/providers/trello.js +141 -0
- package/dist/plus/integrations/providers/trello.js.map +1 -0
- package/dist/plus/integrations/providers/utils/providerPaging.d.ts +29 -0
- package/dist/plus/integrations/providers/utils/providerPaging.d.ts.map +1 -0
- package/dist/plus/integrations/providers/utils/providerPaging.js +154 -0
- package/dist/plus/integrations/providers/utils/providerPaging.js.map +1 -0
- package/dist/plus/integrations/providers/utils.d.ts +21 -0
- package/dist/plus/integrations/providers/utils.d.ts.map +1 -1
- package/dist/plus/integrations/providers/utils.js +57 -6
- package/dist/plus/integrations/providers/utils.js.map +1 -1
- package/dist/plus/integrations/reads/context.d.ts +52 -0
- package/dist/plus/integrations/reads/context.d.ts.map +1 -0
- package/dist/plus/integrations/reads/context.js +2 -0
- package/dist/plus/integrations/reads/context.js.map +1 -0
- package/dist/plus/integrations/reads/cursors.d.ts +66 -0
- package/dist/plus/integrations/reads/cursors.d.ts.map +1 -0
- package/dist/plus/integrations/reads/cursors.js +133 -0
- package/dist/plus/integrations/reads/cursors.js.map +1 -0
- package/dist/plus/integrations/reads/drains.d.ts +60 -0
- package/dist/plus/integrations/reads/drains.d.ts.map +1 -0
- package/dist/plus/integrations/reads/drains.js +255 -0
- package/dist/plus/integrations/reads/drains.js.map +1 -0
- package/dist/plus/integrations/reads/filters.d.ts +81 -0
- package/dist/plus/integrations/reads/filters.d.ts.map +1 -0
- package/dist/plus/integrations/reads/filters.js +87 -0
- package/dist/plus/integrations/reads/filters.js.map +1 -0
- package/dist/plus/integrations/reads/hierarchy.d.ts +17 -0
- package/dist/plus/integrations/reads/hierarchy.d.ts.map +1 -0
- package/dist/plus/integrations/reads/hierarchy.js +348 -0
- package/dist/plus/integrations/reads/hierarchy.js.map +1 -0
- package/dist/plus/integrations/reads/hierarchy.utils.d.ts +53 -0
- package/dist/plus/integrations/reads/hierarchy.utils.d.ts.map +1 -0
- package/dist/plus/integrations/reads/hierarchy.utils.js +85 -0
- package/dist/plus/integrations/reads/hierarchy.utils.js.map +1 -0
- package/dist/plus/integrations/reads/issueTracker.d.ts +19 -0
- package/dist/plus/integrations/reads/issueTracker.d.ts.map +1 -0
- package/dist/plus/integrations/reads/issueTracker.js +346 -0
- package/dist/plus/integrations/reads/issueTracker.js.map +1 -0
- package/dist/plus/integrations/reads/issues.d.ts +34 -0
- package/dist/plus/integrations/reads/issues.d.ts.map +1 -0
- package/dist/plus/integrations/reads/issues.js +244 -0
- package/dist/plus/integrations/reads/issues.js.map +1 -0
- package/dist/plus/integrations/reads/paging.d.ts +136 -0
- package/dist/plus/integrations/reads/paging.d.ts.map +1 -0
- package/dist/plus/integrations/reads/paging.js +221 -0
- package/dist/plus/integrations/reads/paging.js.map +1 -0
- package/dist/plus/integrations/reads/pullRequests.d.ts +32 -0
- package/dist/plus/integrations/reads/pullRequests.d.ts.map +1 -0
- package/dist/plus/integrations/reads/pullRequests.js +151 -0
- package/dist/plus/integrations/reads/pullRequests.js.map +1 -0
- package/dist/plus/integrations/reads/warnings.d.ts +47 -0
- package/dist/plus/integrations/reads/warnings.d.ts.map +1 -0
- package/dist/plus/integrations/reads/warnings.js +81 -0
- package/dist/plus/integrations/reads/warnings.js.map +1 -0
- package/dist/plus/integrations/results.d.ts +189 -0
- package/dist/plus/integrations/results.d.ts.map +1 -0
- package/dist/plus/integrations/results.js +62 -0
- package/dist/plus/integrations/results.js.map +1 -0
- package/dist/plus/integrations/utils/domain.utils.d.ts +5 -0
- package/dist/plus/integrations/utils/domain.utils.d.ts.map +1 -0
- package/dist/plus/integrations/utils/domain.utils.js +27 -0
- package/dist/plus/integrations/utils/domain.utils.js.map +1 -0
- package/dist/plus/integrations/utils/integration.utils.d.ts +27 -1
- package/dist/plus/integrations/utils/integration.utils.d.ts.map +1 -1
- package/dist/plus/integrations/utils/integration.utils.js +86 -15
- package/dist/plus/integrations/utils/integration.utils.js.map +1 -1
- package/dist/utils/array.d.ts.map +1 -1
- package/dist/utils/array.js.map +1 -1
- package/dist/utils/brand.d.ts.map +1 -1
- package/dist/utils/cancellation.d.ts +13 -0
- package/dist/utils/cancellation.d.ts.map +1 -1
- package/dist/utils/cancellation.js +52 -7
- package/dist/utils/cancellation.js.map +1 -1
- package/dist/utils/charCode.d.ts.map +1 -1
- package/dist/utils/coalescedRun.d.ts +16 -0
- package/dist/utils/coalescedRun.d.ts.map +1 -0
- package/dist/utils/coalescedRun.js +43 -0
- package/dist/utils/coalescedRun.js.map +1 -0
- package/dist/utils/color.d.ts.map +1 -1
- package/dist/utils/color.js +3 -3
- package/dist/utils/color.js.map +1 -1
- package/dist/utils/date.d.ts +24 -0
- package/dist/utils/date.d.ts.map +1 -1
- package/dist/utils/date.js +62 -0
- package/dist/utils/date.js.map +1 -1
- package/dist/utils/debounce.js +1 -1
- package/dist/utils/debounce.js.map +1 -1
- package/dist/utils/decorators/debounce.d.ts.map +1 -1
- package/dist/utils/decorators/debounce.js.map +1 -1
- package/dist/utils/decorators/gate.d.ts.map +1 -1
- package/dist/utils/decorators/gate.js +2 -2
- package/dist/utils/decorators/gate.js.map +1 -1
- package/dist/utils/decorators/log.d.ts.map +1 -1
- package/dist/utils/decorators/log.js +5 -5
- package/dist/utils/decorators/log.js.map +1 -1
- package/dist/utils/decorators/memoize.d.ts.map +1 -1
- package/dist/utils/decorators/memoize.js +2 -2
- package/dist/utils/decorators/memoize.js.map +1 -1
- package/dist/utils/decorators/resolver.d.ts.map +1 -1
- package/dist/utils/decorators/resolver.js.map +1 -1
- package/dist/utils/decorators/sequentialize.d.ts.map +1 -1
- package/dist/utils/decorators/sequentialize.js +2 -2
- package/dist/utils/decorators/sequentialize.js.map +1 -1
- package/dist/utils/decorators/serializable.d.ts.map +1 -1
- package/dist/utils/decorators/serializable.js +1 -1
- package/dist/utils/decorators/serializable.js.map +1 -1
- package/dist/utils/dedupedAsyncCache.d.ts.map +1 -1
- package/dist/utils/env/browser/base64.d.ts.map +1 -1
- package/dist/utils/env/browser/base64.js.map +1 -1
- package/dist/utils/env/browser/crypto.d.ts.map +1 -1
- package/dist/utils/env/browser/crypto.js.map +1 -1
- package/dist/utils/env/browser/fs.d.ts.map +1 -1
- package/dist/utils/env/browser/fs.js.map +1 -1
- package/dist/utils/env/browser/hex.d.ts.map +1 -1
- package/dist/utils/env/browser/hex.js.map +1 -1
- package/dist/utils/env/browser/hrtime.d.ts.map +1 -1
- package/dist/utils/env/browser/hrtime.js.map +1 -1
- package/dist/utils/env/browser/logScope.d.ts.map +1 -1
- package/dist/utils/env/browser/logScope.js.map +1 -1
- package/dist/utils/env/browser/md5.d.ts.map +1 -1
- package/dist/utils/env/browser/md5.js.map +1 -1
- package/dist/utils/env/browser/platform.d.ts.map +1 -1
- package/dist/utils/env/browser/platform.js.map +1 -1
- package/dist/utils/env/node/base64.d.ts.map +1 -1
- package/dist/utils/env/node/base64.js.map +1 -1
- package/dist/utils/env/node/crypto.d.ts.map +1 -1
- package/dist/utils/env/node/crypto.js.map +1 -1
- package/dist/utils/env/node/exec.d.ts +9 -1
- package/dist/utils/env/node/exec.d.ts.map +1 -1
- package/dist/utils/env/node/exec.js +11 -4
- package/dist/utils/env/node/exec.js.map +1 -1
- package/dist/utils/env/node/fs.d.ts.map +1 -1
- package/dist/utils/env/node/fs.js.map +1 -1
- package/dist/utils/env/node/hex.d.ts.map +1 -1
- package/dist/utils/env/node/hex.js.map +1 -1
- package/dist/utils/env/node/hrtime.d.ts.map +1 -1
- package/dist/utils/env/node/hrtime.js.map +1 -1
- package/dist/utils/env/node/logScope.d.ts.map +1 -1
- package/dist/utils/env/node/logScope.js.map +1 -1
- package/dist/utils/env/node/platform.d.ts.map +1 -1
- package/dist/utils/env/node/platform.js.map +1 -1
- package/dist/utils/event.d.ts.map +1 -1
- package/dist/utils/event.js +18 -22
- package/dist/utils/event.js.map +1 -1
- package/dist/utils/formatter.d.ts.map +1 -1
- package/dist/utils/formatter.js.map +1 -1
- package/dist/utils/function.d.ts.map +1 -1
- package/dist/utils/function.js +3 -3
- package/dist/utils/function.js.map +1 -1
- package/dist/utils/hash.js.map +1 -1
- package/dist/utils/iterable.d.ts.map +1 -1
- package/dist/utils/iterable.js +2 -6
- package/dist/utils/iterable.js.map +1 -1
- package/dist/utils/lazy.d.ts.map +1 -1
- package/dist/utils/lazy.js.map +1 -1
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +1 -1
- package/dist/utils/logger.js.map +1 -1
- package/dist/utils/logger.scoped.js +1 -1
- package/dist/utils/logger.scoped.js.map +1 -1
- package/dist/utils/lruMap.d.ts.map +1 -1
- package/dist/utils/lruMap.js.map +1 -1
- package/dist/utils/mru.d.ts.map +1 -1
- package/dist/utils/mru.js.map +1 -1
- package/dist/utils/object.js.map +1 -1
- package/dist/utils/paging.d.ts +29 -0
- package/dist/utils/paging.d.ts.map +1 -1
- package/dist/utils/paging.js +18 -0
- package/dist/utils/paging.js.map +1 -1
- package/dist/utils/path.js.map +1 -1
- package/dist/utils/promise.d.ts +10 -0
- package/dist/utils/promise.d.ts.map +1 -1
- package/dist/utils/promise.js +26 -3
- package/dist/utils/promise.js.map +1 -1
- package/dist/utils/promiseCache.d.ts +12 -2
- package/dist/utils/promiseCache.d.ts.map +1 -1
- package/dist/utils/promiseCache.js +80 -50
- package/dist/utils/promiseCache.js.map +1 -1
- package/dist/utils/searchTree.d.ts.map +1 -1
- package/dist/utils/searchTree.js +4 -1
- package/dist/utils/searchTree.js.map +1 -1
- package/dist/utils/stopwatch.d.ts.map +1 -1
- package/dist/utils/string.js +1 -1
- package/dist/utils/string.js.map +1 -1
- package/dist/utils/subscriptionManager.d.ts.map +1 -1
- package/dist/utils/subscriptionManager.js.map +1 -1
- package/dist/utils/trie.d.ts.map +1 -1
- package/dist/utils/trie.js +1 -0
- package/dist/utils/trie.js.map +1 -1
- package/docs/integrations.md +372 -0
- package/docs/kepler-read-api-parity.md +112 -0
- package/package.json +238 -213
- package/src/git/cache.ts +75 -8
- package/src/git/errors.ts +36 -1
- package/src/git/models/commit.ts +1 -1
- package/src/git/models/graph.ts +147 -0
- package/src/git/models/graphSession.ts +205 -0
- package/src/git/models/issue.ts +12 -1
- package/src/git/models/pullRequest.ts +27 -1
- package/src/git/models/repository.ts +24 -1
- package/src/git/models/resourceDescriptor.ts +17 -0
- package/src/git/models/signature.ts +16 -0
- package/src/git/models/tag.ts +6 -1
- package/src/git/parsers/diffParser.ts +1 -1
- package/src/git/providers/branches.ts +6 -1
- package/src/git/providers/commits.ts +6 -1
- package/src/git/providers/config.ts +5 -1
- package/src/git/providers/graph.ts +69 -2
- package/src/git/providers/status.ts +1 -1
- package/src/git/providers/worktrees.ts +3 -1
- package/src/git/remotes/azure-devops.ts +29 -33
- package/src/git/remotes/bitbucket-server.ts +23 -25
- package/src/git/remotes/bitbucket.ts +23 -25
- package/src/git/remotes/gerrit.ts +12 -14
- package/src/git/remotes/gitea.ts +13 -15
- package/src/git/remotes/github.ts +56 -58
- package/src/git/remotes/gitlab.ts +102 -104
- package/src/git/run.types.ts +54 -4
- package/src/git/utils/branch.utils.ts +12 -1
- package/src/git/utils/contributor.utils.ts +1 -1
- package/src/git/utils/fileStatus.utils.ts +7 -0
- package/src/git/utils/graph.utils.ts +46 -0
- package/src/git/utils/issue.utils.ts +1 -0
- package/src/git/utils/pullRequest.utils.ts +9 -0
- package/src/git/utils/reachability.utils.ts +79 -8
- package/src/git/utils/sshKey.utils.ts +30 -0
- package/src/git/watching/watchService.ts +16 -1
- package/src/git/watching/watchSession.ts +20 -2
- package/src/git-cli/exec/git.ts +144 -42
- package/src/git-cli/parsers/logParser.ts +83 -1
- package/src/git-cli/parsers/sshSignatureParser.ts +85 -0
- package/src/git-cli/parsers/worktreeParser.ts +5 -7
- package/src/git-cli/providers/branches.ts +60 -38
- package/src/git-cli/providers/commits.ts +102 -9
- package/src/git-cli/providers/graph.ts +1771 -393
- package/src/git-cli/providers/pausedOperations.ts +3 -3
- package/src/git-cli/providers/revision.ts +42 -0
- package/src/git-cli/providers/status.ts +333 -178
- package/src/git-cli/providers/tags.ts +2 -0
- package/src/git-cli/providers/worktrees.ts +40 -4
- package/src/git-cli/service.ts +9 -0
- package/src/ipc/ipcServer.ts +1 -1
- package/src/plus/agents/providers/claudeCodeProvider.ts +25 -0
- package/src/plus/agents/providers/claudeCodeTranscript.ts +320 -8
- package/src/plus/agents/types.ts +34 -0
- package/src/plus/ai/constants.ts +1 -9
- package/src/plus/ai/models/model.ts +53 -2
- package/src/plus/ai/models/promptTemplates.ts +9 -2
- package/src/plus/ai/prompts.ts +16 -48
- package/src/plus/ai/providers/anthropicProvider.ts +45 -3
- package/src/plus/ai/providers/deepSeekProvider.ts +17 -1
- package/src/plus/ai/providers/geminiProvider.ts +25 -6
- package/src/plus/ai/providers/gitkrakenProvider.ts +2 -0
- package/src/plus/ai/providers/huggingFaceProvider.ts +28 -21
- package/src/plus/ai/providers/openAICompatibleProviderBase.ts +16 -1
- package/src/plus/ai/providers/xaiProvider.ts +14 -1
- package/src/plus/ai/utils/ai.utils.ts +0 -2
- package/src/plus/ai/utils/results.utils.ts +32 -0
- package/src/plus/ai/utils/truncation.utils.ts +0 -1
- package/src/plus/git-github/api/github.ts +484 -104
- package/src/plus/git-github/models.ts +33 -0
- package/src/plus/git-github/providers/github/branches.ts +6 -3
- package/src/plus/git-github/providers/github/diff.ts +1 -1
- package/src/plus/git-github/providers/github/graph.ts +131 -0
- package/src/plus/git-github/providers/github/tags.ts +2 -0
- package/src/plus/integrations/authentication/cloudIntegrationService.ts +189 -17
- package/src/plus/integrations/authentication/configuredIntegrationService.ts +287 -50
- package/src/plus/integrations/authentication/integrationAuthenticationProvider.ts +105 -31
- package/src/plus/integrations/authentication/integrationAuthenticationService.ts +7 -3
- package/src/plus/integrations/authentication/manualTokenProvider.ts +12 -5
- package/src/plus/integrations/authentication/models.ts +35 -1
- package/src/plus/integrations/collectionMetadata.ts +143 -0
- package/src/plus/integrations/constants.ts +21 -0
- package/src/plus/integrations/context.ts +8 -9
- package/src/plus/integrations/errors.ts +149 -0
- package/src/plus/integrations/index.ts +148 -51
- package/src/plus/integrations/integrationService.ts +1714 -49
- package/src/plus/integrations/lite.ts +233 -0
- package/src/plus/integrations/manager.ts +359 -0
- package/src/plus/integrations/models/gitHostIntegration.ts +1014 -121
- package/src/plus/integrations/models/integration.ts +293 -24
- package/src/plus/integrations/models/issuesIntegration.ts +178 -38
- package/src/plus/integrations/providerFilters.ts +12 -0
- package/src/plus/integrations/providers/apiClients.ts +8 -11
- package/src/plus/integrations/providers/apiConfig.ts +71 -0
- package/src/plus/integrations/providers/azure/azure.ts +164 -33
- package/src/plus/integrations/providers/azure/models.ts +19 -6
- package/src/plus/integrations/providers/azureDevOps.ts +766 -101
- package/src/plus/integrations/providers/bitbucket/bitbucket.ts +164 -34
- package/src/plus/integrations/providers/bitbucket-server/models.ts +32 -1
- package/src/plus/integrations/providers/bitbucket-server.ts +173 -8
- package/src/plus/integrations/providers/bitbucket.ts +489 -45
- package/src/plus/integrations/providers/github/github.ts +2 -2
- package/src/plus/integrations/providers/github/github.utils.ts +1 -1
- package/src/plus/integrations/providers/github.ts +390 -6
- package/src/plus/integrations/providers/gitlab/gitlab.ts +170 -60
- package/src/plus/integrations/providers/gitlab/gitlab.utils.ts +9 -0
- package/src/plus/integrations/providers/gitlab/models.ts +19 -5
- package/src/plus/integrations/providers/gitlab.ts +369 -10
- package/src/plus/integrations/providers/jira.ts +247 -42
- package/src/plus/integrations/providers/linear.ts +154 -27
- package/src/plus/integrations/providers/models.ts +583 -75
- package/src/plus/integrations/providers/providersApi.ts +849 -86
- package/src/plus/integrations/providers/trello.ts +205 -0
- package/src/plus/integrations/providers/utils/providerPaging.ts +177 -0
- package/src/plus/integrations/providers/utils.ts +68 -8
- package/src/plus/integrations/reads/context.ts +75 -0
- package/src/plus/integrations/reads/cursors.ts +224 -0
- package/src/plus/integrations/reads/drains.ts +343 -0
- package/src/plus/integrations/reads/filters.ts +124 -0
- package/src/plus/integrations/reads/hierarchy.ts +493 -0
- package/src/plus/integrations/reads/hierarchy.utils.ts +106 -0
- package/src/plus/integrations/reads/issueTracker.ts +480 -0
- package/src/plus/integrations/reads/issues.ts +407 -0
- package/src/plus/integrations/reads/paging.ts +277 -0
- package/src/plus/integrations/reads/pullRequests.ts +267 -0
- package/src/plus/integrations/reads/warnings.ts +170 -0
- package/src/plus/integrations/results.ts +275 -0
- package/src/plus/integrations/utils/domain.utils.ts +26 -0
- package/src/plus/integrations/utils/integration.utils.ts +93 -16
- package/src/utils/brand.ts +0 -2
- package/src/utils/cancellation.ts +56 -7
- package/src/utils/coalescedRun.ts +45 -0
- package/src/utils/color.ts +3 -3
- package/src/utils/date.ts +72 -0
- package/src/utils/debounce.ts +1 -1
- package/src/utils/decorators/gate.ts +2 -2
- package/src/utils/decorators/log.ts +5 -5
- package/src/utils/decorators/memoize.ts +2 -2
- package/src/utils/decorators/sequentialize.ts +2 -2
- package/src/utils/decorators/serializable.ts +1 -1
- package/src/utils/env/node/exec.ts +20 -5
- package/src/utils/event.ts +19 -25
- package/src/utils/function.ts +3 -3
- package/src/utils/iterable.ts +2 -6
- package/src/utils/logger.scoped.ts +1 -1
- package/src/utils/logger.ts +1 -1
- package/src/utils/paging.ts +46 -0
- package/src/utils/promise.ts +33 -3
- package/src/utils/promiseCache.ts +81 -51
- package/src/utils/searchTree.ts +4 -2
- package/src/utils/string.ts +1 -1
- package/src/utils/trie.ts +1 -0
- package/dist/plus/ai/providers/githubModelsProvider.d.ts +0 -19
- package/dist/plus/ai/providers/githubModelsProvider.d.ts.map +0 -1
- package/dist/plus/ai/providers/githubModelsProvider.js +0 -51
- package/dist/plus/ai/providers/githubModelsProvider.js.map +0 -1
- package/src/plus/ai/providers/githubModelsProvider.ts +0 -92
|
@@ -1,7 +1,9 @@
|
|
|
1
|
+
import type { CollectionMetadata, CollectionScopeFailure } from '@gitkraken/provider-apis';
|
|
1
2
|
import type { Account, UnidentifiedAuthor } from '../../../git/models/author.js';
|
|
2
3
|
import type { DefaultBranch } from '../../../git/models/defaultBranch.js';
|
|
4
|
+
import type { IssueShape, IssueStateFilter } from '../../../git/models/issue.js';
|
|
3
5
|
import type { IssueOrPullRequestState as PullRequestState } from '../../../git/models/issueOrPullRequest.js';
|
|
4
|
-
import type { PullRequest, PullRequestMergeMethod } from '../../../git/models/pullRequest.js';
|
|
6
|
+
import type { PullRequest, PullRequestMergeMethod, PullRequestStateFilter } from '../../../git/models/pullRequest.js';
|
|
5
7
|
import type { RepositoryMetadata } from '../../../git/models/repositoryMetadata.js';
|
|
6
8
|
import type { ResourceDescriptor } from '../../../git/models/resourceDescriptor.js';
|
|
7
9
|
import type { PullRequestUrlIdentity } from '../../../git/utils/pullRequest.utils.js';
|
|
@@ -12,24 +14,96 @@ import { Logger } from '../../../utils/logger.js';
|
|
|
12
14
|
import { getScopedLogger } from '../../../utils/logger.scoped.js';
|
|
13
15
|
import type { PagedResult } from '../../../utils/paging.js';
|
|
14
16
|
import type { ProviderAuthenticationSession } from '../authentication/models.js';
|
|
17
|
+
import { toTokenWithInfo } from '../authentication/models.js';
|
|
18
|
+
import { toCollectionScopeFailure } from '../collectionMetadata.js';
|
|
15
19
|
import type { IntegrationIds } from '../constants.js';
|
|
16
|
-
import { GitCloudHostIntegrationId } from '../constants.js';
|
|
20
|
+
import { GitCloudHostIntegrationId, GitSelfManagedHostIntegrationId } from '../constants.js';
|
|
21
|
+
import { toError } from '../errors.js';
|
|
17
22
|
import type {
|
|
18
23
|
GetIssuesOptions,
|
|
19
24
|
GetPullRequestsOptions,
|
|
20
25
|
PagedProjectInput,
|
|
21
26
|
PagedRepoInput,
|
|
22
27
|
ProviderAccount,
|
|
28
|
+
ProviderApiPagedResult,
|
|
29
|
+
ProviderHierarchyResult,
|
|
23
30
|
ProviderIssue,
|
|
31
|
+
ProviderOrganization,
|
|
24
32
|
ProviderPullRequest,
|
|
25
33
|
ProviderRepoInput,
|
|
26
34
|
ProviderReposInput,
|
|
27
35
|
ProviderRepository,
|
|
28
36
|
} from '../providers/models.js';
|
|
29
|
-
import {
|
|
37
|
+
import {
|
|
38
|
+
IssueFilter,
|
|
39
|
+
PagingMode,
|
|
40
|
+
PullRequestFilter,
|
|
41
|
+
toIssueShape,
|
|
42
|
+
toProviderIssueStates,
|
|
43
|
+
toProviderPullRequestStates,
|
|
44
|
+
} from '../providers/models.js';
|
|
45
|
+
import type { ProvidersApi } from '../providers/providersApi.js';
|
|
46
|
+
import { mergeCollectionMetadata } from '../providers/utils/providerPaging.js';
|
|
30
47
|
import type { IntegrationResult, IntegrationType } from './integration.js';
|
|
31
48
|
import { IntegrationBase } from './integration.js';
|
|
32
49
|
|
|
50
|
+
function isAzureDevOpsProvider(
|
|
51
|
+
providerId: IntegrationIds,
|
|
52
|
+
): providerId is GitCloudHostIntegrationId.AzureDevOps | GitSelfManagedHostIntegrationId.AzureDevOpsServer {
|
|
53
|
+
return (
|
|
54
|
+
providerId === GitCloudHostIntegrationId.AzureDevOps ||
|
|
55
|
+
providerId === GitSelfManagedHostIntegrationId.AzureDevOpsServer
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
function normalizeSelfManagedBaseUrl(domain: string | undefined, protocol: string | undefined): string | undefined {
|
|
60
|
+
const value = domain?.trim();
|
|
61
|
+
if (!value) return undefined;
|
|
62
|
+
|
|
63
|
+
if (/^[a-z][a-z\d+\-.]*:\/\//i.test(value)) {
|
|
64
|
+
try {
|
|
65
|
+
const url = new URL(value);
|
|
66
|
+
return `${url.protocol}//${url.host}${url.pathname.replace(/\/+$/, '')}`;
|
|
67
|
+
} catch {
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
const scheme = protocol ?? 'https:';
|
|
73
|
+
try {
|
|
74
|
+
const url = new URL(`${scheme}//${value}`);
|
|
75
|
+
return `${url.protocol}//${url.host}${url.pathname.replace(/\/+$/, '')}`;
|
|
76
|
+
} catch {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function getSelfManagedApiBaseUrl(
|
|
82
|
+
providerId: IntegrationIds,
|
|
83
|
+
domain: string | undefined,
|
|
84
|
+
protocol: string | undefined,
|
|
85
|
+
): string | undefined {
|
|
86
|
+
const baseUrl = normalizeSelfManagedBaseUrl(domain, protocol);
|
|
87
|
+
if (baseUrl == null) return undefined;
|
|
88
|
+
|
|
89
|
+
switch (providerId) {
|
|
90
|
+
case GitSelfManagedHostIntegrationId.CloudGitHubEnterprise:
|
|
91
|
+
return `${baseUrl.replace(/\/api(?:\/v\d+)?$/, '')}/api/v3`;
|
|
92
|
+
case GitSelfManagedHostIntegrationId.CloudGitLabSelfHosted:
|
|
93
|
+
return baseUrl.replace(/\/api(?:\/v\d+)?$/, '');
|
|
94
|
+
case GitSelfManagedHostIntegrationId.BitbucketServer:
|
|
95
|
+
return `${baseUrl.replace(/\/rest\/api\/1\.0$/, '')}/rest/api/1.0`;
|
|
96
|
+
case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
|
|
97
|
+
return baseUrl;
|
|
98
|
+
default:
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export type SearchMyPullRequestsOptions = {
|
|
104
|
+
includeReviewRequested?: boolean;
|
|
105
|
+
};
|
|
106
|
+
|
|
33
107
|
export abstract class GitHostIntegration<
|
|
34
108
|
ID extends IntegrationIds = IntegrationIds,
|
|
35
109
|
T extends ResourceDescriptor = ResourceDescriptor,
|
|
@@ -63,6 +137,40 @@ export abstract class GitHostIntegration<
|
|
|
63
137
|
options?: { avatarSize?: number },
|
|
64
138
|
): Promise<Account | undefined>;
|
|
65
139
|
|
|
140
|
+
/**
|
|
141
|
+
* Returns the SSH signing keys (full OpenSSH-format `<type> <key> [comment]` strings) registered by the accounts
|
|
142
|
+
* matching the given emails on this integration, for building an `allowed_signers` file. Keyed by lowercased email;
|
|
143
|
+
* emails with no match (and unsupported integrations) are absent. Batching the lookups is left to the integration.
|
|
144
|
+
*/
|
|
145
|
+
@gate()
|
|
146
|
+
@trace()
|
|
147
|
+
async getSshSigningKeysForEmails(repo: T, emails: string[]): Promise<Map<string, string[]>> {
|
|
148
|
+
const scope = getScopedLogger();
|
|
149
|
+
|
|
150
|
+
const connected = this.maybeConnected ?? (await this.isConnected());
|
|
151
|
+
if (!connected) return new Map();
|
|
152
|
+
|
|
153
|
+
await this.refreshSessionIfExpired(scope);
|
|
154
|
+
|
|
155
|
+
try {
|
|
156
|
+
const keys = await this.getProviderSshSigningKeysForEmails(this._session!, repo, emails);
|
|
157
|
+
this.resetRequestExceptionCount('getSshSigningKeysForEmails');
|
|
158
|
+
return keys;
|
|
159
|
+
} catch (ex) {
|
|
160
|
+
this.handleProviderException('getSshSigningKeysForEmails', ex, { scope: scope });
|
|
161
|
+
return new Map();
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/** Override in integrations that expose users' SSH signing keys. Defaults to none. */
|
|
166
|
+
protected getProviderSshSigningKeysForEmails(
|
|
167
|
+
_session: ProviderAuthenticationSession,
|
|
168
|
+
_repo: T,
|
|
169
|
+
_emails: string[],
|
|
170
|
+
): Promise<Map<string, string[]>> {
|
|
171
|
+
return Promise.resolve(new Map<string, string[]>());
|
|
172
|
+
}
|
|
173
|
+
|
|
66
174
|
@gate()
|
|
67
175
|
@trace()
|
|
68
176
|
async getAccountForCommit(
|
|
@@ -126,7 +234,12 @@ export abstract class GitHostIntegration<
|
|
|
126
234
|
return defaultBranch;
|
|
127
235
|
}
|
|
128
236
|
|
|
129
|
-
getRepoInfo?(repo: {
|
|
237
|
+
getRepoInfo?(repo: {
|
|
238
|
+
owner: string;
|
|
239
|
+
name: string;
|
|
240
|
+
project?: string;
|
|
241
|
+
connectionId?: string;
|
|
242
|
+
}): Promise<ProviderRepository | undefined>;
|
|
130
243
|
|
|
131
244
|
protected abstract getProviderDefaultBranch(
|
|
132
245
|
{ accessToken }: ProviderAuthenticationSession,
|
|
@@ -176,6 +289,209 @@ export abstract class GitHostIntegration<
|
|
|
176
289
|
cancellation?: AbortSignal,
|
|
177
290
|
): Promise<RepositoryMetadata | undefined>;
|
|
178
291
|
|
|
292
|
+
/**
|
|
293
|
+
* Lists the organizations (orgs/workspaces/groups) the current user belongs to on this host.
|
|
294
|
+
* `truncated === true` means the defensive page-drain backstop stopped before the upstream listing
|
|
295
|
+
* was exhausted.
|
|
296
|
+
*/
|
|
297
|
+
async getOrganizationsForUser(): Promise<ProviderHierarchyResult<ProviderOrganization> | undefined> {
|
|
298
|
+
return (await this.getOrganizationsForUserResult())?.value;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Whether this git host implements generic org discovery. False for providers that register no
|
|
303
|
+
* {@link getProviderOrganizationsForUser} hook (e.g. Bitbucket Data Center) — the facade uses this to
|
|
304
|
+
* report `unsupported` instead of a silent empty list, which is indistinguishable from "has no orgs".
|
|
305
|
+
*/
|
|
306
|
+
get supportsOrganizationDiscovery(): boolean {
|
|
307
|
+
return this.getProviderOrganizationsForUser != null;
|
|
308
|
+
}
|
|
309
|
+
|
|
310
|
+
/** Whether this git host implements generic repository discovery ({@link getProviderRepositoriesForOrg}). */
|
|
311
|
+
get supportsRepositoryDiscovery(): boolean {
|
|
312
|
+
return this.getProviderRepositoriesForOrg != null;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* Whether this git host has a project tier between org and repo ({@link getProviderProjectsForOrg}). Only
|
|
317
|
+
* Azure DevOps does; the facade uses this to skip the read entirely rather than call a core that returns
|
|
318
|
+
* `undefined` for a session-less reason and be misread as a broken connection.
|
|
319
|
+
*/
|
|
320
|
+
get supportsProjectDiscovery(): boolean {
|
|
321
|
+
return this.getProviderProjectsForOrg != null;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Whether this git host implements the account-wide user-affiliated repository read
|
|
326
|
+
* ({@link getProviderRepositoriesForUser}) — the org-less `gk provider repos <provider>` equivalent.
|
|
327
|
+
*/
|
|
328
|
+
get supportsUserRepositoryDiscovery(): boolean {
|
|
329
|
+
return this.getProviderRepositoriesForUser != null;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
/**
|
|
333
|
+
* Whether this git host exposes issues on the ProviderBackend surface. Most git hosts do; a host with no
|
|
334
|
+
* usable issue tracker overrides this to false — Bitbucket Cloud (deprecated in favor of dedicated issue
|
|
335
|
+
* integrations like Jira) and Bitbucket Data Center (never had one) — so the facade reports issues as
|
|
336
|
+
* unsupported instead of serving a partial/deprecated source or failing inside a provider client that
|
|
337
|
+
* registers no issue function at all.
|
|
338
|
+
*
|
|
339
|
+
* Keep this in sync with {@link ProviderMetadata.supportedIssueFilters}: a provider that declares no issue
|
|
340
|
+
* filters and no issue read is answering the same capability question twice, and the two must agree.
|
|
341
|
+
*/
|
|
342
|
+
get supportsIssues(): boolean {
|
|
343
|
+
return true;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
/**
|
|
347
|
+
* Result-returning core of {@link getOrganizationsForUser}. Resolves the session for `connectionId`
|
|
348
|
+
* (or the primary connection when omitted, honoring multi-account reads) and recovers a thrown error
|
|
349
|
+
* into `{ error }` so callers can surface it as a warning instead of swallowing it to `undefined`.
|
|
350
|
+
*/
|
|
351
|
+
@trace()
|
|
352
|
+
async getOrganizationsForUserResult(
|
|
353
|
+
connectionId?: string,
|
|
354
|
+
): Promise<IntegrationResult<ProviderHierarchyResult<ProviderOrganization> | undefined>> {
|
|
355
|
+
const scope = getScopedLogger();
|
|
356
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
357
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
358
|
+
if (session == null) return undefined;
|
|
359
|
+
|
|
360
|
+
const start = performance.now();
|
|
361
|
+
try {
|
|
362
|
+
const result = await this.getProviderOrganizationsForUser?.(session);
|
|
363
|
+
this.resetRequestExceptionCount('getOrganizationsForUser');
|
|
364
|
+
return { value: result, duration: performance.now() - start };
|
|
365
|
+
} catch (ex) {
|
|
366
|
+
this.handleProviderException('getOrganizationsForUser', ex, { scope: scope });
|
|
367
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
protected getProviderOrganizationsForUser?(
|
|
372
|
+
session: ProviderAuthenticationSession,
|
|
373
|
+
): Promise<ProviderHierarchyResult<ProviderOrganization> | undefined>;
|
|
374
|
+
|
|
375
|
+
/**
|
|
376
|
+
* Result-returning list of the projects a git host exposes beneath its orgs, unified into the
|
|
377
|
+
* {@link ProviderOrganization} shape. Only Azure DevOps has a project tier between org and repo; other
|
|
378
|
+
* git hosts have none and leave {@link getProviderProjectsForOrg} undefined, so this returns `undefined`
|
|
379
|
+
* for them (the ProviderBackend facade then treats them as having no projects). With `org`, scopes to
|
|
380
|
+
* that org's projects; without, returns projects across every org the user can see.
|
|
381
|
+
*/
|
|
382
|
+
@trace()
|
|
383
|
+
async getProjectsForOrgResult(
|
|
384
|
+
org?: string,
|
|
385
|
+
connectionId?: string,
|
|
386
|
+
): Promise<IntegrationResult<ProviderHierarchyResult<ProviderOrganization> | undefined>> {
|
|
387
|
+
const scope = getScopedLogger();
|
|
388
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
389
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
390
|
+
if (session == null) return undefined;
|
|
391
|
+
|
|
392
|
+
if (this.getProviderProjectsForOrg == null) {
|
|
393
|
+
return undefined;
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
const start = performance.now();
|
|
397
|
+
try {
|
|
398
|
+
const result = await this.getProviderProjectsForOrg(session, org);
|
|
399
|
+
this.resetRequestExceptionCount('getProjectsForOrg');
|
|
400
|
+
return { value: result, duration: performance.now() - start };
|
|
401
|
+
} catch (ex) {
|
|
402
|
+
this.handleProviderException('getProjectsForOrg', ex, { scope: scope });
|
|
403
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
protected getProviderProjectsForOrg?(
|
|
408
|
+
session: ProviderAuthenticationSession,
|
|
409
|
+
org?: string,
|
|
410
|
+
): Promise<ProviderHierarchyResult<ProviderOrganization> | undefined>;
|
|
411
|
+
|
|
412
|
+
/**
|
|
413
|
+
* Lists repositories under the given organization (org/workspace/group) one page at a time — follow
|
|
414
|
+
* `paging.cursor` to page, or drain with the integrations provider paging helper.
|
|
415
|
+
* `options.project` is only meaningful for Azure DevOps, whose repos are scoped by `org` + `project`;
|
|
416
|
+
* every other host ignores it. (Azure without a project can't page its cross-project merge, so it
|
|
417
|
+
* returns all matches in a single page.) `truncated === true` means the defensive page-drain
|
|
418
|
+
* backstop stopped before the upstream listing was exhausted.
|
|
419
|
+
*/
|
|
420
|
+
async getRepositoriesForOrg(
|
|
421
|
+
org: string,
|
|
422
|
+
options?: { project?: string; cursor?: string },
|
|
423
|
+
): Promise<ProviderHierarchyResult<ProviderRepository> | undefined> {
|
|
424
|
+
return (await this.getRepositoriesForOrgResult(org, options))?.value;
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Result-returning core of {@link getRepositoriesForOrg}. Resolves the session for `connectionId`
|
|
429
|
+
* (or the primary connection when omitted) and recovers a thrown error into `{ error }` for warnings.
|
|
430
|
+
*/
|
|
431
|
+
@trace()
|
|
432
|
+
async getRepositoriesForOrgResult(
|
|
433
|
+
org: string,
|
|
434
|
+
options?: { project?: string; cursor?: string; connectionId?: string },
|
|
435
|
+
): Promise<IntegrationResult<ProviderHierarchyResult<ProviderRepository> | undefined>> {
|
|
436
|
+
const scope = getScopedLogger();
|
|
437
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
438
|
+
const session = await this.resolveReadSession(options?.connectionId, scope);
|
|
439
|
+
if (session == null) return undefined;
|
|
440
|
+
|
|
441
|
+
const start = performance.now();
|
|
442
|
+
try {
|
|
443
|
+
const result = await this.getProviderRepositoriesForOrg?.(session, org, options);
|
|
444
|
+
this.resetRequestExceptionCount('getRepositoriesForOrg');
|
|
445
|
+
return { value: result, duration: performance.now() - start };
|
|
446
|
+
} catch (ex) {
|
|
447
|
+
this.handleProviderException('getRepositoriesForOrg', ex, { scope: scope });
|
|
448
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
449
|
+
}
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
protected getProviderRepositoriesForOrg?(
|
|
453
|
+
session: ProviderAuthenticationSession,
|
|
454
|
+
org: string,
|
|
455
|
+
options?: { project?: string; cursor?: string },
|
|
456
|
+
): Promise<ProviderHierarchyResult<ProviderRepository> | undefined>;
|
|
457
|
+
|
|
458
|
+
/**
|
|
459
|
+
* Result-returning account-wide, user-affiliated repository read (the org-less
|
|
460
|
+
* `gk provider repos <provider>` equivalent): repositories the user owns, collaborates on, or can
|
|
461
|
+
* access through org membership — NOT every repo of every org. Optional: providers without a native
|
|
462
|
+
* user-affiliated listing (Bitbucket workspaces, Azure orgs, which require an org/workspace scope)
|
|
463
|
+
* leave the hook undefined and the facade reports the read as unsupported so callers fan out per org.
|
|
464
|
+
*/
|
|
465
|
+
@trace()
|
|
466
|
+
async getRepositoriesForUserResult(options?: {
|
|
467
|
+
cursor?: string;
|
|
468
|
+
connectionId?: string;
|
|
469
|
+
}): Promise<IntegrationResult<ProviderHierarchyResult<ProviderRepository> | undefined>> {
|
|
470
|
+
const scope = getScopedLogger();
|
|
471
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
472
|
+
const session = await this.resolveReadSession(options?.connectionId, scope);
|
|
473
|
+
if (session == null) return undefined;
|
|
474
|
+
|
|
475
|
+
if (this.getProviderRepositoriesForUser == null) {
|
|
476
|
+
return undefined;
|
|
477
|
+
}
|
|
478
|
+
|
|
479
|
+
const start = performance.now();
|
|
480
|
+
try {
|
|
481
|
+
const result = await this.getProviderRepositoriesForUser(session, options);
|
|
482
|
+
this.resetRequestExceptionCount('getRepositoriesForUser');
|
|
483
|
+
return { value: result, duration: performance.now() - start };
|
|
484
|
+
} catch (ex) {
|
|
485
|
+
this.handleProviderException('getRepositoriesForUser', ex, { scope: scope });
|
|
486
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
487
|
+
}
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
protected getProviderRepositoriesForUser?(
|
|
491
|
+
session: ProviderAuthenticationSession,
|
|
492
|
+
options?: { cursor?: string },
|
|
493
|
+
): Promise<ProviderHierarchyResult<ProviderRepository> | undefined>;
|
|
494
|
+
|
|
179
495
|
async mergePullRequest(pr: PullRequest, options?: { mergeMethod?: PullRequestMergeMethod }): Promise<boolean> {
|
|
180
496
|
const scope = getScopedLogger();
|
|
181
497
|
|
|
@@ -283,30 +599,122 @@ export abstract class GitHostIntegration<
|
|
|
283
599
|
rev: string,
|
|
284
600
|
): Promise<PullRequest | undefined>;
|
|
285
601
|
|
|
602
|
+
/**
|
|
603
|
+
* Memoized identity lookups backing filter resolution. Keyed by the session's token fingerprint plus the
|
|
604
|
+
* scope of the lookup (base URL, and the Azure organization for the per-instance variant), so a different
|
|
605
|
+
* account, host, or org never reuses an entry and a rotated token simply misses.
|
|
606
|
+
*
|
|
607
|
+
* Not cleared when the token changes: one integration instance serves every connection of its provider
|
|
608
|
+
* (multi-account), so clearing on a fingerprint change would make two accounts reading in alternation
|
|
609
|
+
* evict each other and defeat the memo. Entries are bounded by tokens x hosts x orgs seen — a handful for
|
|
610
|
+
* the life of the integration.
|
|
611
|
+
*/
|
|
612
|
+
private readonly _filterAccounts = new Map<string, Promise<ProviderAccount | undefined>>();
|
|
613
|
+
|
|
614
|
+
/**
|
|
615
|
+
* Resolves the account a repo-scoped read turns `IssueFilter`/`PullRequestFilter` into a provider
|
|
616
|
+
* login/id with, memoized per token+scope.
|
|
617
|
+
*
|
|
618
|
+
* Every FILTERED read needs this, and `ProvidersApi.getCurrentUser` is a bare round trip — unlike
|
|
619
|
+
* {@link IntegrationBase.getCurrentAccount}, which the host caches. So a consumer that fans ONE page out
|
|
620
|
+
* into several filtered reads paid one identity request PER read, all resolving the same account: a
|
|
621
|
+
* per-user-facet fan-out (author + assignee + review-requested) doubled its request count, and paid it
|
|
622
|
+
* again on every page turn.
|
|
623
|
+
*
|
|
624
|
+
* The promise is memoized rather than the value, so concurrent facets share one in-flight request instead
|
|
625
|
+
* of racing. A rejection is evicted so the next read retries rather than caching a failure — matching how
|
|
626
|
+
* `getCurrentAccount` invalidates on error.
|
|
627
|
+
*/
|
|
628
|
+
private getFilterAccount(
|
|
629
|
+
api: ProvidersApi,
|
|
630
|
+
session: ProviderAuthenticationSession,
|
|
631
|
+
customUrl: string | undefined,
|
|
632
|
+
organization?: string,
|
|
633
|
+
): Promise<ProviderAccount | undefined> {
|
|
634
|
+
const key = `${this.getSessionFingerprint(session)}:${customUrl ?? ''}:${organization ?? ''}`;
|
|
635
|
+
|
|
636
|
+
let pending = this._filterAccounts.get(key);
|
|
637
|
+
if (pending == null) {
|
|
638
|
+
const tokenWithInfo = toTokenWithInfo(this.authProvider.id, session);
|
|
639
|
+
pending = (
|
|
640
|
+
organization != null
|
|
641
|
+
? api.getCurrentUserForInstance(tokenWithInfo, organization, { baseUrl: customUrl })
|
|
642
|
+
: api.getCurrentUser(tokenWithInfo, { baseUrl: customUrl })
|
|
643
|
+
).catch((ex: unknown) => {
|
|
644
|
+
this._filterAccounts.delete(key);
|
|
645
|
+
throw ex;
|
|
646
|
+
});
|
|
647
|
+
this._filterAccounts.set(key, pending);
|
|
648
|
+
}
|
|
649
|
+
|
|
650
|
+
return pending;
|
|
651
|
+
}
|
|
652
|
+
|
|
286
653
|
async getMyIssuesForRepos(
|
|
287
654
|
reposOrRepoIds: ProviderReposInput,
|
|
288
|
-
options?: {
|
|
655
|
+
options?: {
|
|
656
|
+
filters?: IssueFilter[];
|
|
657
|
+
cursor?: string;
|
|
658
|
+
customUrl?: string;
|
|
659
|
+
page?: number;
|
|
660
|
+
pageSize?: number;
|
|
661
|
+
/** When true, don't constrain to the current user's assigned issues even if the Assignee filter is set. */
|
|
662
|
+
includeAllAssignees?: boolean;
|
|
663
|
+
/** Issue states to include; when omitted the provider returns its default (open only). */
|
|
664
|
+
state?: IssueStateFilter;
|
|
665
|
+
},
|
|
666
|
+
connectionId?: string,
|
|
289
667
|
): Promise<PagedResult<ProviderIssue> | undefined> {
|
|
668
|
+
return (await this.getMyIssuesForReposResult(reposOrRepoIds, options, connectionId))?.value;
|
|
669
|
+
}
|
|
670
|
+
|
|
671
|
+
/**
|
|
672
|
+
* Result-returning core of {@link getMyIssuesForRepos}. Resolves the session for `connectionId`
|
|
673
|
+
* (or the primary connection when omitted, so multi-account reads use the right token) and recovers
|
|
674
|
+
* thrown errors and validation failures into `{ error }` so callers can surface them as warnings
|
|
675
|
+
* rather than swallowing them to `undefined`.
|
|
676
|
+
*/
|
|
677
|
+
async getMyIssuesForReposResult(
|
|
678
|
+
reposOrRepoIds: ProviderReposInput,
|
|
679
|
+
options?: {
|
|
680
|
+
filters?: IssueFilter[];
|
|
681
|
+
cursor?: string;
|
|
682
|
+
customUrl?: string;
|
|
683
|
+
page?: number;
|
|
684
|
+
pageSize?: number;
|
|
685
|
+
includeAllAssignees?: boolean;
|
|
686
|
+
state?: IssueStateFilter;
|
|
687
|
+
},
|
|
688
|
+
connectionId?: string,
|
|
689
|
+
): Promise<IntegrationResult<(PagedResult<ProviderIssue> & { metadata?: CollectionMetadata }) | undefined>> {
|
|
290
690
|
const scope = getScopedLogger();
|
|
291
691
|
const providerId = this.authProvider.id;
|
|
292
|
-
const
|
|
293
|
-
|
|
692
|
+
const states = toProviderIssueStates(options?.state);
|
|
693
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary. The session
|
|
694
|
+
// is resolved here for connectivity/bail; the connection's token is applied per API call below.
|
|
695
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
696
|
+
if (session == null) return undefined;
|
|
294
697
|
|
|
295
|
-
|
|
698
|
+
const start = performance.now();
|
|
699
|
+
const customUrl =
|
|
700
|
+
options?.customUrl ?? getSelfManagedApiBaseUrl(providerId, session.domain || this.domain, session.protocol);
|
|
296
701
|
|
|
297
702
|
const api = await this.getProvidersApi();
|
|
298
703
|
if (
|
|
299
704
|
providerId !== GitCloudHostIntegrationId.GitLab &&
|
|
300
705
|
(api.isRepoIdsInput(reposOrRepoIds) ||
|
|
301
|
-
(providerId
|
|
706
|
+
(isAzureDevOpsProvider(providerId) &&
|
|
302
707
|
!reposOrRepoIds.every(repo => repo.project != null && repo.namespace != null)))
|
|
303
708
|
) {
|
|
304
709
|
Logger.warn(`Unsupported input for provider ${providerId}`, 'getIssuesForRepos');
|
|
305
|
-
return
|
|
710
|
+
return {
|
|
711
|
+
error: new Error(`Unsupported input for provider ${providerId}`),
|
|
712
|
+
duration: performance.now() - start,
|
|
713
|
+
};
|
|
306
714
|
}
|
|
307
715
|
|
|
308
716
|
let getIssuesOptions: GetIssuesOptions | undefined;
|
|
309
|
-
if (providerId
|
|
717
|
+
if (isAzureDevOpsProvider(providerId)) {
|
|
310
718
|
const organizations = new Set<string>();
|
|
311
719
|
const projects = new Set<string>();
|
|
312
720
|
for (const repo of reposOrRepoIds as ProviderRepoInput[]) {
|
|
@@ -316,10 +724,16 @@ export abstract class GitHostIntegration<
|
|
|
316
724
|
|
|
317
725
|
if (organizations.size > 1) {
|
|
318
726
|
Logger.warn(`Multiple organizations not supported for provider ${providerId}`, 'getIssuesForRepos');
|
|
319
|
-
return
|
|
727
|
+
return {
|
|
728
|
+
error: new Error(`Multiple organizations not supported for provider ${providerId}`),
|
|
729
|
+
duration: performance.now() - start,
|
|
730
|
+
};
|
|
320
731
|
} else if (organizations.size === 0) {
|
|
321
732
|
Logger.warn(`No organizations found for provider ${providerId}`, 'getIssuesForRepos');
|
|
322
|
-
return
|
|
733
|
+
return {
|
|
734
|
+
error: new Error(`No organizations found for provider ${providerId}`),
|
|
735
|
+
duration: performance.now() - start,
|
|
736
|
+
};
|
|
323
737
|
}
|
|
324
738
|
|
|
325
739
|
const organization: string = first(organizations.values())!;
|
|
@@ -327,37 +741,49 @@ export abstract class GitHostIntegration<
|
|
|
327
741
|
if (options?.filters != null) {
|
|
328
742
|
if (!api.providerSupportsIssueFilters(providerId, options.filters)) {
|
|
329
743
|
Logger.warn(`Unsupported filters for provider ${providerId}`, 'getIssuesForRepos');
|
|
330
|
-
return
|
|
744
|
+
return {
|
|
745
|
+
error: new Error(`Unsupported filters for provider ${providerId}`),
|
|
746
|
+
duration: performance.now() - start,
|
|
747
|
+
};
|
|
331
748
|
}
|
|
332
749
|
|
|
333
750
|
let userAccount: ProviderAccount | undefined;
|
|
334
751
|
try {
|
|
335
|
-
userAccount = await
|
|
752
|
+
userAccount = await this.getFilterAccount(api, session, customUrl, organization);
|
|
336
753
|
} catch (ex) {
|
|
337
754
|
Logger.error(ex, 'getIssuesForRepos');
|
|
338
|
-
return
|
|
755
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
339
756
|
}
|
|
340
757
|
|
|
341
758
|
if (userAccount == null) {
|
|
342
759
|
Logger.warn(`Unable to get current user for ${providerId}`, 'getIssuesForRepos');
|
|
343
|
-
return
|
|
760
|
+
return {
|
|
761
|
+
error: new Error(`Unable to get current user for ${providerId}`),
|
|
762
|
+
duration: performance.now() - start,
|
|
763
|
+
};
|
|
344
764
|
}
|
|
345
765
|
|
|
346
766
|
const userFilterProperty = userAccount.name;
|
|
347
767
|
|
|
348
768
|
if (userFilterProperty == null) {
|
|
349
769
|
Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getIssuesForRepos');
|
|
350
|
-
return
|
|
770
|
+
return {
|
|
771
|
+
error: new Error(`Unable to get user property for filter for ${providerId}`),
|
|
772
|
+
duration: performance.now() - start,
|
|
773
|
+
};
|
|
351
774
|
}
|
|
352
775
|
|
|
353
776
|
getIssuesOptions = {
|
|
354
777
|
authorLogin: options.filters.includes(IssueFilter.Author) ? userFilterProperty : undefined,
|
|
355
|
-
assigneeLogins:
|
|
778
|
+
assigneeLogins:
|
|
779
|
+
!options.includeAllAssignees && options.filters.includes(IssueFilter.Assignee)
|
|
780
|
+
? [userFilterProperty]
|
|
781
|
+
: undefined,
|
|
356
782
|
mentionLogin: options.filters.includes(IssueFilter.Mention) ? userFilterProperty : undefined,
|
|
357
783
|
};
|
|
358
784
|
}
|
|
359
785
|
|
|
360
|
-
const cursorInfo =
|
|
786
|
+
const cursorInfo = this.parseCursorInfo<PagedProjectInput>(options?.cursor);
|
|
361
787
|
const cursors: PagedProjectInput[] = cursorInfo.cursors ?? [];
|
|
362
788
|
let projectInputs: PagedProjectInput[] = Array.from(projects.values(), project => ({
|
|
363
789
|
namespace: organization,
|
|
@@ -369,73 +795,144 @@ export abstract class GitHostIntegration<
|
|
|
369
795
|
}
|
|
370
796
|
|
|
371
797
|
try {
|
|
372
|
-
const cursor: { cursors: PagedProjectInput[] } = { cursors: [] };
|
|
798
|
+
const cursor: { cursors: PagedProjectInput[]; page?: number } = { cursors: [] };
|
|
373
799
|
let hasMore = false;
|
|
800
|
+
let truncated = false;
|
|
801
|
+
let metadata: CollectionMetadata | undefined;
|
|
374
802
|
const data: ProviderIssue[] = [];
|
|
375
|
-
|
|
803
|
+
// `allSettled`, not `Promise.all`: one project's read rejecting must not discard every sibling
|
|
804
|
+
// project's already-fetched issues and cursors. A rejected project is recorded as a structured
|
|
805
|
+
// failure so the facade can warn and set `fetchFailed` instead of reporting a partial project set
|
|
806
|
+
// as complete.
|
|
807
|
+
const settled = await Promise.allSettled(
|
|
376
808
|
projectInputs.map(async projectInput => {
|
|
377
809
|
const results = await api.getIssuesForAzureProject(
|
|
378
|
-
|
|
810
|
+
toTokenWithInfo(providerId, session),
|
|
379
811
|
projectInput.namespace,
|
|
380
812
|
projectInput.project,
|
|
381
813
|
{
|
|
382
814
|
...getIssuesOptions,
|
|
383
815
|
cursor: projectInput.cursor,
|
|
816
|
+
baseUrl: customUrl,
|
|
817
|
+
// Continuation is driven by the per-project cursor; only apply an explicit page on the
|
|
818
|
+
// first request so it can't clobber a continuation cursor on later pages.
|
|
819
|
+
page: projectInput.cursor == null ? options?.page : undefined,
|
|
820
|
+
pageSize: options?.pageSize,
|
|
821
|
+
states: states,
|
|
384
822
|
},
|
|
385
823
|
);
|
|
386
|
-
|
|
387
|
-
if (results.paging?.more) {
|
|
388
|
-
hasMore = true;
|
|
389
|
-
cursor.cursors.push({
|
|
390
|
-
namespace: projectInput.namespace,
|
|
391
|
-
project: projectInput.project,
|
|
392
|
-
cursor: results.paging.cursor,
|
|
393
|
-
});
|
|
394
|
-
}
|
|
824
|
+
return { projectInput: projectInput, results: results };
|
|
395
825
|
}),
|
|
396
826
|
);
|
|
397
827
|
|
|
828
|
+
for (let i = 0; i < settled.length; i++) {
|
|
829
|
+
const outcome = settled[i];
|
|
830
|
+
const projectInput = projectInputs[i];
|
|
831
|
+
if (outcome.status !== 'fulfilled') {
|
|
832
|
+
truncated = true;
|
|
833
|
+
const failure = toCollectionScopeFailure(
|
|
834
|
+
{
|
|
835
|
+
providerId: providerId,
|
|
836
|
+
resourceId: projectInput.namespace,
|
|
837
|
+
projectId: projectInput.project,
|
|
838
|
+
},
|
|
839
|
+
outcome.reason,
|
|
840
|
+
);
|
|
841
|
+
metadata = mergeCollectionMetadata(metadata, {
|
|
842
|
+
completeness: 'partial',
|
|
843
|
+
failures: [failure],
|
|
844
|
+
});
|
|
845
|
+
continue;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
const { projectInput: _projectInput, results } = outcome.value;
|
|
849
|
+
data.push(...results.values);
|
|
850
|
+
if (results.paging?.more) {
|
|
851
|
+
hasMore = true;
|
|
852
|
+
cursor.cursors.push({
|
|
853
|
+
namespace: projectInput.namespace,
|
|
854
|
+
project: projectInput.project,
|
|
855
|
+
cursor: results.paging.cursor,
|
|
856
|
+
});
|
|
857
|
+
}
|
|
858
|
+
}
|
|
859
|
+
|
|
860
|
+
// Keep the requested page number in the composite cursor so the facade can report the real
|
|
861
|
+
// currentPage when the consumer continues using only the cursor.
|
|
862
|
+
if (options?.page != null) {
|
|
863
|
+
cursor.page = options.page;
|
|
864
|
+
}
|
|
865
|
+
|
|
398
866
|
return {
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
867
|
+
value: {
|
|
868
|
+
values: data,
|
|
869
|
+
paging: {
|
|
870
|
+
more: hasMore,
|
|
871
|
+
cursor: JSON.stringify(cursor),
|
|
872
|
+
truncated: truncated || undefined,
|
|
873
|
+
// Echo the requested numbered page so the facade reports the real currentPage for
|
|
874
|
+
// numbered-page hosts (GitLab/Bitbucket/Azure), not a synthesized 1. Cursor-only hosts
|
|
875
|
+
// leave `page` undefined via their own reads.
|
|
876
|
+
page: options?.page,
|
|
877
|
+
},
|
|
878
|
+
metadata: metadata,
|
|
403
879
|
},
|
|
880
|
+
duration: performance.now() - start,
|
|
404
881
|
};
|
|
405
882
|
} catch (ex) {
|
|
406
883
|
Logger.error(ex, 'getIssuesForRepos');
|
|
407
|
-
return
|
|
884
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
408
885
|
}
|
|
409
886
|
}
|
|
410
887
|
if (options?.filters != null) {
|
|
888
|
+
// Validate the requested filters against what this provider actually supports — same guard the Azure
|
|
889
|
+
// branch above applies. Without it an unsupported filter (e.g. GitLab has no Mention endpoint) would
|
|
890
|
+
// resolve to no filter property being set and silently degrade to an unfiltered, project-wide read.
|
|
891
|
+
if (!api.providerSupportsIssueFilters(providerId, options.filters)) {
|
|
892
|
+
Logger.warn(`Unsupported filters for provider ${providerId}`, 'getIssuesForRepos');
|
|
893
|
+
return {
|
|
894
|
+
error: new Error(`Unsupported filters for provider ${providerId}`),
|
|
895
|
+
duration: performance.now() - start,
|
|
896
|
+
};
|
|
897
|
+
}
|
|
898
|
+
|
|
411
899
|
let userAccount: ProviderAccount | undefined;
|
|
412
900
|
try {
|
|
413
|
-
userAccount = await
|
|
901
|
+
userAccount = await this.getFilterAccount(api, session, customUrl);
|
|
414
902
|
} catch (ex) {
|
|
415
903
|
Logger.error(ex, 'getIssuesForRepos');
|
|
416
|
-
return
|
|
904
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
417
905
|
}
|
|
418
906
|
|
|
419
907
|
if (userAccount == null) {
|
|
420
908
|
Logger.warn(`Unable to get current user for ${providerId}`, 'getIssuesForRepos');
|
|
421
|
-
return
|
|
909
|
+
return {
|
|
910
|
+
error: new Error(`Unable to get current user for ${providerId}`),
|
|
911
|
+
duration: performance.now() - start,
|
|
912
|
+
};
|
|
422
913
|
}
|
|
423
914
|
|
|
424
915
|
const userFilterProperty = userAccount.username;
|
|
425
916
|
if (userFilterProperty == null) {
|
|
426
917
|
Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getIssuesForRepos');
|
|
427
|
-
return
|
|
918
|
+
return {
|
|
919
|
+
error: new Error(`Unable to get user property for filter for ${providerId}`),
|
|
920
|
+
duration: performance.now() - start,
|
|
921
|
+
};
|
|
428
922
|
}
|
|
429
923
|
|
|
430
924
|
getIssuesOptions = {
|
|
431
925
|
authorLogin: options.filters.includes(IssueFilter.Author) ? userFilterProperty : undefined,
|
|
432
|
-
assigneeLogins:
|
|
926
|
+
assigneeLogins:
|
|
927
|
+
!options.includeAllAssignees && options.filters.includes(IssueFilter.Assignee)
|
|
928
|
+
? [userFilterProperty]
|
|
929
|
+
: undefined,
|
|
433
930
|
mentionLogin: options.filters.includes(IssueFilter.Mention) ? userFilterProperty : undefined,
|
|
434
931
|
};
|
|
435
932
|
}
|
|
436
933
|
|
|
437
934
|
if (api.getProviderIssuesPagingMode(providerId) === PagingMode.Repo && !api.isRepoIdsInput(reposOrRepoIds)) {
|
|
438
|
-
const cursorInfo =
|
|
935
|
+
const cursorInfo = this.parseCursorInfo<PagedRepoInput>(options?.cursor);
|
|
439
936
|
const cursors: PagedRepoInput[] = cursorInfo.cursors ?? [];
|
|
440
937
|
let repoInputs: PagedRepoInput[] = reposOrRepoIds.map(repo => ({ repo: repo, cursor: undefined }));
|
|
441
938
|
if (cursors.length > 0) {
|
|
@@ -443,80 +940,209 @@ export abstract class GitHostIntegration<
|
|
|
443
940
|
}
|
|
444
941
|
|
|
445
942
|
try {
|
|
446
|
-
const cursor: { cursors: PagedRepoInput[] } = { cursors: [] };
|
|
943
|
+
const cursor: { cursors: PagedRepoInput[]; page?: number } = { cursors: [] };
|
|
447
944
|
let hasMore = false;
|
|
945
|
+
let truncated = false;
|
|
946
|
+
let metadata: CollectionMetadata | undefined;
|
|
448
947
|
const data: ProviderIssue[] = [];
|
|
449
|
-
|
|
948
|
+
// `allSettled`, not `Promise.all`: one repo's read rejecting must not discard every sibling repo's
|
|
949
|
+
// already-fetched issues and cursors. A rejected repo is recorded as a structured failure so the
|
|
950
|
+
// facade can warn and set `fetchFailed` instead of reporting a partial repo set as complete.
|
|
951
|
+
const settled = await Promise.allSettled(
|
|
450
952
|
repoInputs.map(async repoInput => {
|
|
451
|
-
const results = await api.getIssuesForRepo(
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
953
|
+
const results = await api.getIssuesForRepo(
|
|
954
|
+
toTokenWithInfo(providerId, session),
|
|
955
|
+
repoInput.repo,
|
|
956
|
+
{
|
|
957
|
+
...getIssuesOptions,
|
|
958
|
+
cursor: repoInput.cursor,
|
|
959
|
+
baseUrl: customUrl,
|
|
960
|
+
// Continuation is driven by the per-repo cursor; only apply an explicit page on the
|
|
961
|
+
// first request so it can't clobber a continuation cursor on later pages.
|
|
962
|
+
page: repoInput.cursor == null ? options?.page : undefined,
|
|
963
|
+
pageSize: options?.pageSize,
|
|
964
|
+
states: states,
|
|
965
|
+
},
|
|
966
|
+
);
|
|
967
|
+
return { repoInput: repoInput, results: results };
|
|
461
968
|
}),
|
|
462
969
|
);
|
|
463
970
|
|
|
971
|
+
for (let i = 0; i < settled.length; i++) {
|
|
972
|
+
const outcome = settled[i];
|
|
973
|
+
const repoInput = repoInputs[i];
|
|
974
|
+
if (outcome.status !== 'fulfilled') {
|
|
975
|
+
truncated = true;
|
|
976
|
+
const failure = toCollectionScopeFailure(
|
|
977
|
+
{
|
|
978
|
+
providerId: providerId,
|
|
979
|
+
repositoryId: `${repoInput.repo.namespace}/${repoInput.repo.name}`,
|
|
980
|
+
},
|
|
981
|
+
outcome.reason,
|
|
982
|
+
);
|
|
983
|
+
metadata = mergeCollectionMetadata(metadata, {
|
|
984
|
+
completeness: 'partial',
|
|
985
|
+
failures: [failure],
|
|
986
|
+
});
|
|
987
|
+
continue;
|
|
988
|
+
}
|
|
989
|
+
|
|
990
|
+
const { repoInput: _repoInput, results } = outcome.value;
|
|
991
|
+
data.push(...results.values);
|
|
992
|
+
if (results.paging?.more) {
|
|
993
|
+
hasMore = true;
|
|
994
|
+
cursor.cursors.push({ repo: repoInput.repo, cursor: results.paging.cursor });
|
|
995
|
+
}
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
if (options?.page != null) {
|
|
999
|
+
cursor.page = options.page;
|
|
1000
|
+
}
|
|
1001
|
+
|
|
464
1002
|
return {
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
1003
|
+
value: {
|
|
1004
|
+
values: data,
|
|
1005
|
+
paging: {
|
|
1006
|
+
more: hasMore,
|
|
1007
|
+
cursor: JSON.stringify(cursor),
|
|
1008
|
+
truncated: truncated || undefined,
|
|
1009
|
+
// Echo the requested numbered page so the facade reports the real currentPage for
|
|
1010
|
+
// numbered-page hosts (GitLab/Bitbucket/Azure), not a synthesized 1. Cursor-only hosts
|
|
1011
|
+
// leave `page` undefined via their own reads.
|
|
1012
|
+
page: options?.page,
|
|
1013
|
+
},
|
|
1014
|
+
metadata: metadata,
|
|
469
1015
|
},
|
|
1016
|
+
duration: performance.now() - start,
|
|
470
1017
|
};
|
|
471
1018
|
} catch (ex) {
|
|
472
1019
|
Logger.error(ex, 'getIssuesForRepos');
|
|
473
|
-
return
|
|
1020
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
474
1021
|
}
|
|
475
1022
|
}
|
|
476
1023
|
|
|
477
1024
|
try {
|
|
478
|
-
|
|
1025
|
+
const result = await api.getIssuesForRepos(toTokenWithInfo(providerId, session), reposOrRepoIds, {
|
|
479
1026
|
...getIssuesOptions,
|
|
480
1027
|
cursor: options?.cursor,
|
|
481
|
-
baseUrl:
|
|
1028
|
+
baseUrl: customUrl,
|
|
1029
|
+
page: options?.page,
|
|
1030
|
+
pageSize: options?.pageSize,
|
|
1031
|
+
states: states,
|
|
482
1032
|
});
|
|
1033
|
+
return { value: result, duration: performance.now() - start };
|
|
483
1034
|
} catch (ex) {
|
|
484
1035
|
Logger.error(ex, 'getIssuesForRepos');
|
|
485
|
-
return
|
|
1036
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
486
1037
|
}
|
|
487
1038
|
}
|
|
488
1039
|
|
|
1040
|
+
/**
|
|
1041
|
+
* Repo-scoped "my issues" read returning the normalized {@link IssueShape} the ProviderBackend facade
|
|
1042
|
+
* consumes (`listIssuesPage({ repos })`, `broadenIssues`). Maps {@link getMyIssuesForReposResult} — the raw
|
|
1043
|
+
* provider-apis path — to IssueShape.
|
|
1044
|
+
*
|
|
1045
|
+
* It's the seam rather than an inline map so a provider whose only issue client already yields normalized
|
|
1046
|
+
* shapes, and isn't wired into the raw path, can override it and serve these reads without a
|
|
1047
|
+
* `ProviderIssue` round-trip. No provider does today: the one candidate (Bitbucket Cloud's legacy
|
|
1048
|
+
* `getUsersIssuesForRepo`) reports `supportsIssues: false`, so the facade never reaches this for it.
|
|
1049
|
+
*/
|
|
1050
|
+
async getMyIssuesForReposAsShapesResult(
|
|
1051
|
+
reposOrRepoIds: ProviderReposInput,
|
|
1052
|
+
options?: {
|
|
1053
|
+
filters?: IssueFilter[];
|
|
1054
|
+
cursor?: string;
|
|
1055
|
+
customUrl?: string;
|
|
1056
|
+
page?: number;
|
|
1057
|
+
pageSize?: number;
|
|
1058
|
+
includeAllAssignees?: boolean;
|
|
1059
|
+
state?: IssueStateFilter;
|
|
1060
|
+
},
|
|
1061
|
+
connectionId?: string,
|
|
1062
|
+
): Promise<IntegrationResult<(PagedResult<IssueShape> & { metadata?: CollectionMetadata }) | undefined>> {
|
|
1063
|
+
const result = await this.getMyIssuesForReposResult(reposOrRepoIds, options, connectionId);
|
|
1064
|
+
if (result == null) return undefined;
|
|
1065
|
+
if (result.error != null) return { error: result.error, duration: result.duration };
|
|
1066
|
+
if (result.value == null) return { value: undefined, duration: result.duration };
|
|
1067
|
+
|
|
1068
|
+
const values = result.value.values
|
|
1069
|
+
.map(issue => toIssueShape(issue, this))
|
|
1070
|
+
.filter((issue): issue is IssueShape => issue != null);
|
|
1071
|
+
return { value: { ...result.value, values: values }, duration: result.duration };
|
|
1072
|
+
}
|
|
1073
|
+
|
|
489
1074
|
async getMyPullRequestsForRepos(
|
|
490
1075
|
reposOrRepoIds: ProviderReposInput,
|
|
491
|
-
options?: {
|
|
492
|
-
|
|
1076
|
+
options?: {
|
|
1077
|
+
filters?: PullRequestFilter[];
|
|
1078
|
+
cursor?: string;
|
|
1079
|
+
customUrl?: string;
|
|
1080
|
+
page?: number;
|
|
1081
|
+
pageSize?: number;
|
|
1082
|
+
/** PR states to include; when omitted the provider returns its default (open only). */
|
|
1083
|
+
state?: PullRequestStateFilter | PullRequestStateFilter[];
|
|
1084
|
+
},
|
|
1085
|
+
connectionId?: string,
|
|
1086
|
+
): Promise<ProviderApiPagedResult<ProviderPullRequest> | undefined> {
|
|
1087
|
+
return (await this.getMyPullRequestsForReposResult(reposOrRepoIds, options, connectionId))?.value;
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
/**
|
|
1091
|
+
* Result-returning core of {@link getMyPullRequestsForRepos}. Resolves the session for `connectionId`
|
|
1092
|
+
* (or the primary connection when omitted, so multi-account reads use the right token) and recovers
|
|
1093
|
+
* thrown errors and validation failures into `{ error }` so callers can surface them as warnings
|
|
1094
|
+
* rather than swallowing them to `undefined`.
|
|
1095
|
+
*/
|
|
1096
|
+
async getMyPullRequestsForReposResult(
|
|
1097
|
+
reposOrRepoIds: ProviderReposInput,
|
|
1098
|
+
options?: {
|
|
1099
|
+
filters?: PullRequestFilter[];
|
|
1100
|
+
cursor?: string;
|
|
1101
|
+
customUrl?: string;
|
|
1102
|
+
page?: number;
|
|
1103
|
+
pageSize?: number;
|
|
1104
|
+
state?: PullRequestStateFilter | PullRequestStateFilter[];
|
|
1105
|
+
},
|
|
1106
|
+
connectionId?: string,
|
|
1107
|
+
): Promise<IntegrationResult<ProviderApiPagedResult<ProviderPullRequest> | undefined>> {
|
|
493
1108
|
const scope = getScopedLogger();
|
|
494
1109
|
const providerId = this.authProvider.id;
|
|
495
|
-
const
|
|
496
|
-
|
|
1110
|
+
const states = toProviderPullRequestStates(options?.state);
|
|
1111
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary. The session
|
|
1112
|
+
// is resolved here for connectivity/bail; the connection's token is applied per API call below.
|
|
1113
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
1114
|
+
if (session == null) return undefined;
|
|
497
1115
|
|
|
498
|
-
|
|
1116
|
+
const start = performance.now();
|
|
1117
|
+
const customUrl =
|
|
1118
|
+
options?.customUrl ?? getSelfManagedApiBaseUrl(providerId, session.domain || this.domain, session.protocol);
|
|
499
1119
|
|
|
500
1120
|
const api = await this.getProvidersApi();
|
|
501
1121
|
if (
|
|
502
1122
|
providerId !== GitCloudHostIntegrationId.GitLab &&
|
|
503
1123
|
(api.isRepoIdsInput(reposOrRepoIds) ||
|
|
504
|
-
(providerId
|
|
1124
|
+
(isAzureDevOpsProvider(providerId) &&
|
|
505
1125
|
!reposOrRepoIds.every(repo => repo.project != null && repo.namespace != null)))
|
|
506
1126
|
) {
|
|
507
1127
|
Logger.warn(`Unsupported input for provider ${providerId}`);
|
|
508
|
-
return
|
|
1128
|
+
return {
|
|
1129
|
+
error: new Error(`Unsupported input for provider ${providerId}`),
|
|
1130
|
+
duration: performance.now() - start,
|
|
1131
|
+
};
|
|
509
1132
|
}
|
|
510
1133
|
|
|
511
1134
|
let getPullRequestsOptions: GetPullRequestsOptions | undefined;
|
|
512
1135
|
if (options?.filters != null) {
|
|
513
1136
|
if (!api.providerSupportsPullRequestFilters(providerId, options.filters)) {
|
|
514
1137
|
Logger.warn(`Unsupported filters for provider ${providerId}`, 'getPullRequestsForRepos');
|
|
515
|
-
return
|
|
1138
|
+
return {
|
|
1139
|
+
error: new Error(`Unsupported filters for provider ${providerId}`),
|
|
1140
|
+
duration: performance.now() - start,
|
|
1141
|
+
};
|
|
516
1142
|
}
|
|
517
1143
|
|
|
518
1144
|
let userAccount: ProviderAccount | undefined;
|
|
519
|
-
if (providerId
|
|
1145
|
+
if (isAzureDevOpsProvider(providerId)) {
|
|
520
1146
|
const organizations = new Set<string>();
|
|
521
1147
|
for (const repo of reposOrRepoIds as ProviderRepoInput[]) {
|
|
522
1148
|
organizations.add(repo.namespace);
|
|
@@ -527,37 +1153,47 @@ export abstract class GitHostIntegration<
|
|
|
527
1153
|
`Multiple organizations not supported for provider ${providerId}`,
|
|
528
1154
|
'getPullRequestsForRepos',
|
|
529
1155
|
);
|
|
530
|
-
return
|
|
1156
|
+
return {
|
|
1157
|
+
error: new Error(`Multiple organizations not supported for provider ${providerId}`),
|
|
1158
|
+
duration: performance.now() - start,
|
|
1159
|
+
};
|
|
531
1160
|
} else if (organizations.size === 0) {
|
|
532
1161
|
Logger.warn(`No organizations found for provider ${providerId}`, 'getPullRequestsForRepos');
|
|
533
|
-
return
|
|
1162
|
+
return {
|
|
1163
|
+
error: new Error(`No organizations found for provider ${providerId}`),
|
|
1164
|
+
duration: performance.now() - start,
|
|
1165
|
+
};
|
|
534
1166
|
}
|
|
535
1167
|
|
|
536
1168
|
const organization: string = first(organizations.values())!;
|
|
537
1169
|
try {
|
|
538
|
-
userAccount = await
|
|
1170
|
+
userAccount = await this.getFilterAccount(api, session, customUrl, organization);
|
|
539
1171
|
} catch (ex) {
|
|
540
1172
|
Logger.error(ex, 'getPullRequestsForRepos');
|
|
541
|
-
return
|
|
1173
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
542
1174
|
}
|
|
543
1175
|
} else {
|
|
544
1176
|
try {
|
|
545
|
-
userAccount = await
|
|
1177
|
+
userAccount = await this.getFilterAccount(api, session, customUrl);
|
|
546
1178
|
} catch (ex) {
|
|
547
1179
|
Logger.error(ex, 'getPullRequestsForRepos');
|
|
548
|
-
return
|
|
1180
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
549
1181
|
}
|
|
550
1182
|
}
|
|
551
1183
|
|
|
552
1184
|
if (userAccount == null) {
|
|
553
1185
|
Logger.warn(`Unable to get current user for ${providerId}`, 'getPullRequestsForRepos');
|
|
554
|
-
return
|
|
1186
|
+
return {
|
|
1187
|
+
error: new Error(`Unable to get current user for ${providerId}`),
|
|
1188
|
+
duration: performance.now() - start,
|
|
1189
|
+
};
|
|
555
1190
|
}
|
|
556
1191
|
|
|
557
1192
|
let userFilterProperty: string | null;
|
|
558
1193
|
switch (providerId) {
|
|
559
1194
|
case GitCloudHostIntegrationId.Bitbucket:
|
|
560
1195
|
case GitCloudHostIntegrationId.AzureDevOps:
|
|
1196
|
+
case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
|
|
561
1197
|
userFilterProperty = userAccount.id;
|
|
562
1198
|
break;
|
|
563
1199
|
default:
|
|
@@ -567,15 +1203,41 @@ export abstract class GitHostIntegration<
|
|
|
567
1203
|
|
|
568
1204
|
if (userFilterProperty == null) {
|
|
569
1205
|
Logger.warn(`Unable to get user property for filter for ${providerId}`, 'getPullRequestsForRepos');
|
|
570
|
-
return
|
|
1206
|
+
return {
|
|
1207
|
+
error: new Error(`Unable to get user property for filter for ${providerId}`),
|
|
1208
|
+
duration: performance.now() - start,
|
|
1209
|
+
};
|
|
1210
|
+
}
|
|
1211
|
+
|
|
1212
|
+
// Route the "review requested from me" filter to the field each provider actually reads:
|
|
1213
|
+
// GitHub/GitLab expect a login (reviewRequestedLogin), Bitbucket/Azure an account id (reviewerId),
|
|
1214
|
+
// and Bitbucket Server a login (reviewerLogin). `userFilterProperty` is already the account id for
|
|
1215
|
+
// Bitbucket/Azure and the username for the rest.
|
|
1216
|
+
let reviewRequestedLogin: string | undefined;
|
|
1217
|
+
let reviewerId: string | undefined;
|
|
1218
|
+
let reviewerLogin: string | undefined;
|
|
1219
|
+
if (options.filters.includes(PullRequestFilter.ReviewRequested)) {
|
|
1220
|
+
switch (providerId) {
|
|
1221
|
+
case GitCloudHostIntegrationId.Bitbucket:
|
|
1222
|
+
case GitCloudHostIntegrationId.AzureDevOps:
|
|
1223
|
+
case GitSelfManagedHostIntegrationId.AzureDevOpsServer:
|
|
1224
|
+
reviewerId = userFilterProperty;
|
|
1225
|
+
break;
|
|
1226
|
+
case GitSelfManagedHostIntegrationId.BitbucketServer:
|
|
1227
|
+
reviewerLogin = userFilterProperty;
|
|
1228
|
+
break;
|
|
1229
|
+
default:
|
|
1230
|
+
reviewRequestedLogin = userFilterProperty;
|
|
1231
|
+
break;
|
|
1232
|
+
}
|
|
571
1233
|
}
|
|
572
1234
|
|
|
573
1235
|
getPullRequestsOptions = {
|
|
574
1236
|
authorLogin: options.filters.includes(PullRequestFilter.Author) ? userFilterProperty : undefined,
|
|
575
1237
|
assigneeLogins: options.filters.includes(PullRequestFilter.Assignee) ? [userFilterProperty] : undefined,
|
|
576
|
-
reviewRequestedLogin:
|
|
577
|
-
|
|
578
|
-
|
|
1238
|
+
reviewRequestedLogin: reviewRequestedLogin,
|
|
1239
|
+
reviewerId: reviewerId,
|
|
1240
|
+
reviewerLogin: reviewerLogin,
|
|
579
1241
|
mentionLogin: options.filters.includes(PullRequestFilter.Mention) ? userFilterProperty : undefined,
|
|
580
1242
|
};
|
|
581
1243
|
}
|
|
@@ -584,7 +1246,7 @@ export abstract class GitHostIntegration<
|
|
|
584
1246
|
api.getProviderPullRequestsPagingMode(providerId) === PagingMode.Repo &&
|
|
585
1247
|
!api.isRepoIdsInput(reposOrRepoIds)
|
|
586
1248
|
) {
|
|
587
|
-
const cursorInfo =
|
|
1249
|
+
const cursorInfo = this.parseCursorInfo<PagedRepoInput>(options?.cursor);
|
|
588
1250
|
const cursors: PagedRepoInput[] = cursorInfo.cursors ?? [];
|
|
589
1251
|
let repoInputs: PagedRepoInput[] = reposOrRepoIds.map(repo => ({ repo: repo, cursor: undefined }));
|
|
590
1252
|
if (cursors.length > 0) {
|
|
@@ -592,46 +1254,114 @@ export abstract class GitHostIntegration<
|
|
|
592
1254
|
}
|
|
593
1255
|
|
|
594
1256
|
try {
|
|
595
|
-
const cursor: { cursors: PagedRepoInput[] } = { cursors: [] };
|
|
1257
|
+
const cursor: { cursors: PagedRepoInput[]; page?: number } = { cursors: [] };
|
|
596
1258
|
let hasMore = false;
|
|
1259
|
+
let truncated = false;
|
|
1260
|
+
let metadata: CollectionMetadata | undefined;
|
|
1261
|
+
const failures: CollectionScopeFailure[] = [];
|
|
597
1262
|
const data: ProviderPullRequest[] = [];
|
|
598
|
-
|
|
1263
|
+
// `allSettled`, not `Promise.all`: one repo's read rejecting must not discard every sibling repo's
|
|
1264
|
+
// already-fetched PRs and cursors. A rejected repo becomes a structured `CollectionScopeFailure`
|
|
1265
|
+
// (attributed to that repo) so the facade warns on it + sets `fetchFailed`, while the survivors and
|
|
1266
|
+
// their continuation cursors are still returned.
|
|
1267
|
+
const settled = await Promise.allSettled(
|
|
599
1268
|
repoInputs.map(async repoInput => {
|
|
600
|
-
const results = await api.getPullRequestsForRepo(
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
1269
|
+
const results = await api.getPullRequestsForRepo(
|
|
1270
|
+
toTokenWithInfo(providerId, session),
|
|
1271
|
+
repoInput.repo,
|
|
1272
|
+
{
|
|
1273
|
+
...getPullRequestsOptions,
|
|
1274
|
+
cursor: repoInput.cursor,
|
|
1275
|
+
baseUrl: customUrl,
|
|
1276
|
+
// Continuation is driven by the per-repo cursor; only apply an explicit page on the
|
|
1277
|
+
// first request so it can't clobber a continuation cursor on later pages.
|
|
1278
|
+
page: repoInput.cursor == null ? options?.page : undefined,
|
|
1279
|
+
pageSize: options?.pageSize,
|
|
1280
|
+
states: states,
|
|
1281
|
+
// Azure DevOps only populates clone URLs on request (extra call); no-op elsewhere.
|
|
1282
|
+
includeRemoteInfo: isAzureDevOpsProvider(providerId) ? true : undefined,
|
|
1283
|
+
},
|
|
1284
|
+
);
|
|
1285
|
+
return { repoInput: repoInput, results: results };
|
|
610
1286
|
}),
|
|
611
1287
|
);
|
|
612
1288
|
|
|
1289
|
+
// `allSettled` preserves order, so `settled[i]` is `repoInputs[i]`.
|
|
1290
|
+
settled.forEach((outcome, i) => {
|
|
1291
|
+
if (outcome.status !== 'fulfilled') {
|
|
1292
|
+
const failedRepo = repoInputs[i].repo;
|
|
1293
|
+
failures.push(
|
|
1294
|
+
toCollectionScopeFailure(
|
|
1295
|
+
{ providerId: providerId, repositoryId: `${failedRepo.namespace}/${failedRepo.name}` },
|
|
1296
|
+
outcome.reason,
|
|
1297
|
+
),
|
|
1298
|
+
);
|
|
1299
|
+
return;
|
|
1300
|
+
}
|
|
1301
|
+
|
|
1302
|
+
const { repoInput, results } = outcome.value;
|
|
1303
|
+
data.push(...results.values);
|
|
1304
|
+
// Fan-out across repos: preserve each repo's SDK completeness/failures and its terminal
|
|
1305
|
+
// truncation so a single failed/incomplete repo isn't lost when merged with its siblings.
|
|
1306
|
+
metadata = mergeCollectionMetadata(metadata, results.metadata);
|
|
1307
|
+
if (results.paging?.truncated) {
|
|
1308
|
+
truncated = true;
|
|
1309
|
+
}
|
|
1310
|
+
if (results.paging?.more) {
|
|
1311
|
+
hasMore = true;
|
|
1312
|
+
cursor.cursors.push({ repo: repoInput.repo, cursor: results.paging.cursor });
|
|
1313
|
+
}
|
|
1314
|
+
});
|
|
1315
|
+
|
|
1316
|
+
// Merge the GitLens-side per-repo rejections into the SDK metadata so both flow through the same
|
|
1317
|
+
// warning/fetchFailed assessment downstream.
|
|
1318
|
+
if (failures.length > 0) {
|
|
1319
|
+
metadata = mergeCollectionMetadata(metadata, { completeness: 'partial', failures: failures });
|
|
1320
|
+
}
|
|
1321
|
+
|
|
1322
|
+
// Keep the requested page number in the composite cursor so the facade can report the real
|
|
1323
|
+
// currentPage when the consumer continues using only the cursor.
|
|
1324
|
+
if (options?.page != null) {
|
|
1325
|
+
cursor.page = options.page;
|
|
1326
|
+
}
|
|
1327
|
+
|
|
613
1328
|
return {
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
617
|
-
|
|
1329
|
+
value: {
|
|
1330
|
+
values: data,
|
|
1331
|
+
paging: {
|
|
1332
|
+
more: hasMore,
|
|
1333
|
+
cursor: JSON.stringify(cursor),
|
|
1334
|
+
truncated: truncated || undefined,
|
|
1335
|
+
// Echo the requested numbered page so the facade reports the real currentPage for
|
|
1336
|
+
// numbered-page hosts (GitLab/Bitbucket/Azure), not a synthesized 1. Cursor-only hosts
|
|
1337
|
+
// leave `page` undefined via their own reads.
|
|
1338
|
+
page: options?.page,
|
|
1339
|
+
},
|
|
1340
|
+
metadata: metadata,
|
|
618
1341
|
},
|
|
1342
|
+
duration: performance.now() - start,
|
|
619
1343
|
};
|
|
620
1344
|
} catch (ex) {
|
|
621
1345
|
Logger.error(ex, 'getPullRequestsForRepos');
|
|
622
|
-
return
|
|
1346
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
623
1347
|
}
|
|
624
1348
|
}
|
|
625
1349
|
|
|
626
1350
|
try {
|
|
627
|
-
|
|
1351
|
+
const result = await api.getPullRequestsForRepos(toTokenWithInfo(providerId, session), reposOrRepoIds, {
|
|
628
1352
|
...getPullRequestsOptions,
|
|
629
1353
|
cursor: options?.cursor,
|
|
630
|
-
baseUrl:
|
|
1354
|
+
baseUrl: customUrl,
|
|
1355
|
+
page: options?.page,
|
|
1356
|
+
pageSize: options?.pageSize,
|
|
1357
|
+
states: states,
|
|
1358
|
+
// Azure DevOps only populates clone URLs on request (extra call); no-op elsewhere.
|
|
1359
|
+
includeRemoteInfo: isAzureDevOpsProvider(providerId) ? true : undefined,
|
|
631
1360
|
});
|
|
1361
|
+
return { value: result, duration: performance.now() - start };
|
|
632
1362
|
} catch (ex) {
|
|
633
1363
|
Logger.error(ex, 'getPullRequestsForRepos');
|
|
634
|
-
return
|
|
1364
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
635
1365
|
}
|
|
636
1366
|
}
|
|
637
1367
|
|
|
@@ -639,81 +1369,243 @@ export abstract class GitHostIntegration<
|
|
|
639
1369
|
repo?: T,
|
|
640
1370
|
cancellation?: AbortSignal,
|
|
641
1371
|
silent?: boolean,
|
|
1372
|
+
connectionId?: string,
|
|
1373
|
+
state?: PullRequestStateFilter,
|
|
1374
|
+
options?: SearchMyPullRequestsOptions,
|
|
642
1375
|
): Promise<IntegrationResult<PullRequest[] | undefined>>;
|
|
643
1376
|
async searchMyPullRequests(
|
|
644
1377
|
repos?: T[],
|
|
645
1378
|
cancellation?: AbortSignal,
|
|
646
1379
|
silent?: boolean,
|
|
1380
|
+
connectionId?: string,
|
|
1381
|
+
state?: PullRequestStateFilter,
|
|
1382
|
+
options?: SearchMyPullRequestsOptions,
|
|
647
1383
|
): Promise<IntegrationResult<PullRequest[] | undefined>>;
|
|
648
1384
|
@trace()
|
|
649
1385
|
async searchMyPullRequests(
|
|
650
1386
|
repos?: T | T[],
|
|
651
1387
|
cancellation?: AbortSignal,
|
|
652
1388
|
silent?: boolean,
|
|
1389
|
+
connectionId?: string,
|
|
1390
|
+
state?: PullRequestStateFilter,
|
|
1391
|
+
options?: SearchMyPullRequestsOptions,
|
|
653
1392
|
): Promise<IntegrationResult<PullRequest[] | undefined>> {
|
|
654
1393
|
const scope = getScopedLogger();
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
await this.refreshSessionIfExpired(scope);
|
|
1394
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
1395
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
1396
|
+
if (session == null) return undefined;
|
|
659
1397
|
|
|
660
1398
|
const start = performance.now();
|
|
661
1399
|
try {
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
1400
|
+
// Prefer the optional metadata-aware path for account-wide reads so partial failures (e.g. one Azure
|
|
1401
|
+
// org rejecting) are surfaced as a soft `{ value, error }` instead of being lost. Repo-scoped reads and
|
|
1402
|
+
// providers without that override keep using the legacy array path.
|
|
1403
|
+
let result: IntegrationResult<PullRequest[] | undefined>;
|
|
1404
|
+
if (this.searchProviderMyPullRequestsResult != null && repos == null) {
|
|
1405
|
+
result = await this.searchProviderMyPullRequestsResult(
|
|
1406
|
+
session,
|
|
1407
|
+
repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
|
|
1408
|
+
cancellation,
|
|
1409
|
+
silent,
|
|
1410
|
+
state,
|
|
1411
|
+
options,
|
|
1412
|
+
);
|
|
1413
|
+
} else {
|
|
1414
|
+
result = {
|
|
1415
|
+
value: await this.searchProviderMyPullRequests(
|
|
1416
|
+
session,
|
|
1417
|
+
repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
|
|
1418
|
+
cancellation,
|
|
1419
|
+
silent,
|
|
1420
|
+
state,
|
|
1421
|
+
options,
|
|
1422
|
+
),
|
|
1423
|
+
};
|
|
1424
|
+
}
|
|
668
1425
|
this.resetRequestExceptionCount('searchMyPullRequests');
|
|
669
|
-
|
|
1426
|
+
// `IntegrationResult` is a strict union of value-only or error-only (and may be `undefined`). Return the
|
|
1427
|
+
// matching branch explicitly; a missing result is treated as a successful empty read.
|
|
1428
|
+
if (result == null) {
|
|
1429
|
+
return { value: undefined, duration: performance.now() - start };
|
|
1430
|
+
}
|
|
1431
|
+
if (result.error != null) {
|
|
1432
|
+
return { error: result.error, duration: performance.now() - start };
|
|
1433
|
+
}
|
|
1434
|
+
return { value: result.value, duration: performance.now() - start };
|
|
670
1435
|
} catch (ex) {
|
|
671
1436
|
this.handleProviderException('searchMyPullRequests', ex, {
|
|
672
1437
|
scope: scope,
|
|
673
1438
|
silent: true,
|
|
674
1439
|
});
|
|
675
1440
|
return {
|
|
676
|
-
error: ex,
|
|
1441
|
+
error: toError(ex),
|
|
677
1442
|
duration: performance.now() - start,
|
|
678
1443
|
};
|
|
679
1444
|
}
|
|
680
1445
|
}
|
|
681
1446
|
|
|
1447
|
+
/**
|
|
1448
|
+
* Account-wide, user-scoped counterpart of {@link getMyPullRequestsForReposResult} that returns the raw
|
|
1449
|
+
* `ProviderPullRequest` shape (not the normalized model). Unlike the repo-scoped core, this needs no
|
|
1450
|
+
* `repos` — it reads the current user's pull requests across the account, so the ProviderBackend sweep
|
|
1451
|
+
* can drive its Kanban "done" column even when no repositories are supplied (where the repo-scoped core
|
|
1452
|
+
* rejects an empty `repos` input). Recovers thrown errors into `{ error }` so callers surface warnings.
|
|
1453
|
+
*/
|
|
1454
|
+
async getMyPullRequestsForUserResult(
|
|
1455
|
+
options?: {
|
|
1456
|
+
state?: PullRequestStateFilter[];
|
|
1457
|
+
cursor?: string;
|
|
1458
|
+
includeReviewRequested?: boolean;
|
|
1459
|
+
/** Exact OR union of account-wide relationships to include. */
|
|
1460
|
+
filters?: PullRequestFilter[];
|
|
1461
|
+
/** Request only the stable list fields, omitting optional provider enrichments. */
|
|
1462
|
+
summary?: boolean;
|
|
1463
|
+
},
|
|
1464
|
+
connectionId?: string,
|
|
1465
|
+
): Promise<IntegrationResult<ProviderApiPagedResult<ProviderPullRequest> | undefined>> {
|
|
1466
|
+
const scope = getScopedLogger();
|
|
1467
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
1468
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
1469
|
+
if (session == null) return undefined;
|
|
1470
|
+
|
|
1471
|
+
if (this.getProviderMyPullRequestsForUser == null) {
|
|
1472
|
+
return undefined;
|
|
1473
|
+
}
|
|
1474
|
+
|
|
1475
|
+
const start = performance.now();
|
|
1476
|
+
try {
|
|
1477
|
+
const result = await this.getProviderMyPullRequestsForUser(session, options);
|
|
1478
|
+
this.resetRequestExceptionCount('getMyPullRequestsForUser');
|
|
1479
|
+
return { value: result, duration: performance.now() - start };
|
|
1480
|
+
} catch (ex) {
|
|
1481
|
+
this.handleProviderException('getMyPullRequestsForUser', ex, { scope: scope });
|
|
1482
|
+
return { error: toError(ex), duration: performance.now() - start };
|
|
1483
|
+
}
|
|
1484
|
+
}
|
|
1485
|
+
|
|
1486
|
+
/**
|
|
1487
|
+
* Reads the current user's pull requests across the whole account using each provider's native "my PRs"
|
|
1488
|
+
* query, returning the raw provider shape. Without `filters`, the exact user scopes depend on provider-native
|
|
1489
|
+
* behavior and options like `includeReviewRequested`. With `filters`, each member is an exact account-wide OR
|
|
1490
|
+
* relationship validated by the facade before this provider hook is called. Optional: providers that can't
|
|
1491
|
+
* express an account-wide user query leave it undefined and the surface falls back to repo-scoped.
|
|
1492
|
+
*
|
|
1493
|
+
* These native user queries are cursor-based, so `cursor` (not a page number) drives continuation; there
|
|
1494
|
+
* is no jump-to-page-N and no per-call page size on this path.
|
|
1495
|
+
*
|
|
1496
|
+
* `includeReviewRequested` opts into the review-requested slice for providers whose account-wide read
|
|
1497
|
+
* only returns authored PRs natively and must fan out per-repo to add reviewer PRs (Bitbucket). It's off
|
|
1498
|
+
* by default so a sweep pays gkcli-parity cost (authored only) unless the caller deliberately opts in;
|
|
1499
|
+
* providers whose native query already covers review-requested PRs ignore it.
|
|
1500
|
+
*/
|
|
1501
|
+
protected getProviderMyPullRequestsForUser?(
|
|
1502
|
+
session: ProviderAuthenticationSession,
|
|
1503
|
+
options?: {
|
|
1504
|
+
state?: PullRequestStateFilter[];
|
|
1505
|
+
cursor?: string;
|
|
1506
|
+
includeReviewRequested?: boolean;
|
|
1507
|
+
filters?: PullRequestFilter[];
|
|
1508
|
+
summary?: boolean;
|
|
1509
|
+
},
|
|
1510
|
+
): Promise<ProviderApiPagedResult<ProviderPullRequest> | undefined>;
|
|
1511
|
+
|
|
1512
|
+
/**
|
|
1513
|
+
* Parses a Repo/Project paging cursor into its `cursors` bundle. Guards against valid JSON whose
|
|
1514
|
+
* `cursors` is a truthy non-array (e.g. `{ "cursors": "..." }`), which would otherwise bypass the
|
|
1515
|
+
* `?? []` fallback at call sites and flow into `.map()` downstream, throwing instead of degrading to
|
|
1516
|
+
* the first page.
|
|
1517
|
+
*/
|
|
1518
|
+
private parseCursorInfo<T>(cursor?: string): { cursors?: T[] } {
|
|
1519
|
+
try {
|
|
1520
|
+
const parsed = JSON.parse(cursor ?? '{}') as { cursors?: T[] };
|
|
1521
|
+
return Array.isArray(parsed?.cursors) ? parsed : {};
|
|
1522
|
+
} catch {
|
|
1523
|
+
return {};
|
|
1524
|
+
}
|
|
1525
|
+
}
|
|
1526
|
+
|
|
1527
|
+
// `state` selects which PR states to include (open/closed/merged/all). Providers that cannot express it
|
|
1528
|
+
// in a single query filter the normalized results; omitted preserves the historical open-only behavior.
|
|
682
1529
|
protected abstract searchProviderMyPullRequests(
|
|
683
1530
|
session: ProviderAuthenticationSession,
|
|
684
1531
|
repos?: T[],
|
|
685
1532
|
cancellation?: AbortSignal,
|
|
686
1533
|
silent?: boolean,
|
|
1534
|
+
state?: PullRequestStateFilter,
|
|
1535
|
+
options?: SearchMyPullRequestsOptions,
|
|
687
1536
|
): Promise<PullRequest[] | undefined>;
|
|
688
1537
|
|
|
1538
|
+
/**
|
|
1539
|
+
* Optional metadata-aware counterpart of {@link searchProviderMyPullRequests}. Providers whose account-wide
|
|
1540
|
+
* "my PRs" read already produces {@link ProviderApiPagedResult} with completeness/failures can override
|
|
1541
|
+
* this to return a soft `{ value, error }` result so `searchMyPullRequests` surfaces partial data and a
|
|
1542
|
+
* warning instead of silently discarding the failure signal. The wrapper prefers this when present; the
|
|
1543
|
+
* abstract {@link searchProviderMyPullRequests} remains the required fallback for repo-scoped and
|
|
1544
|
+
* metadata-oblivious paths.
|
|
1545
|
+
*/
|
|
1546
|
+
protected searchProviderMyPullRequestsResult?(
|
|
1547
|
+
session: ProviderAuthenticationSession,
|
|
1548
|
+
repos?: T[],
|
|
1549
|
+
cancellation?: AbortSignal,
|
|
1550
|
+
silent?: boolean,
|
|
1551
|
+
state?: PullRequestStateFilter,
|
|
1552
|
+
options?: SearchMyPullRequestsOptions,
|
|
1553
|
+
): Promise<IntegrationResult<PullRequest[] | undefined>>;
|
|
1554
|
+
|
|
689
1555
|
async searchPullRequests(
|
|
690
1556
|
searchQuery: string,
|
|
691
1557
|
repo?: T,
|
|
692
1558
|
cancellation?: AbortSignal,
|
|
1559
|
+
options?: { include?: PullRequestState[] },
|
|
693
1560
|
): Promise<PullRequest[] | undefined>;
|
|
694
1561
|
async searchPullRequests(
|
|
695
1562
|
searchQuery: string,
|
|
696
1563
|
repos?: T[],
|
|
697
1564
|
cancellation?: AbortSignal,
|
|
1565
|
+
options?: { include?: PullRequestState[] },
|
|
1566
|
+
): Promise<PullRequest[] | undefined>;
|
|
1567
|
+
async searchPullRequests(
|
|
1568
|
+
searchQuery: string,
|
|
1569
|
+
repo?: T,
|
|
1570
|
+
cancellation?: AbortSignal,
|
|
1571
|
+
connectionId?: string,
|
|
1572
|
+
options?: { include?: PullRequestState[] },
|
|
1573
|
+
): Promise<PullRequest[] | undefined>;
|
|
1574
|
+
async searchPullRequests(
|
|
1575
|
+
searchQuery: string,
|
|
1576
|
+
repos?: T[],
|
|
1577
|
+
cancellation?: AbortSignal,
|
|
1578
|
+
connectionId?: string,
|
|
1579
|
+
options?: { include?: PullRequestState[] },
|
|
698
1580
|
): Promise<PullRequest[] | undefined>;
|
|
699
1581
|
@trace()
|
|
700
1582
|
async searchPullRequests(
|
|
701
1583
|
searchQuery: string,
|
|
702
1584
|
repos?: T | T[],
|
|
703
1585
|
cancellation?: AbortSignal,
|
|
1586
|
+
connectionIdOrOptions?: string | { include?: PullRequestState[] },
|
|
1587
|
+
options?: { include?: PullRequestState[] },
|
|
704
1588
|
): Promise<PullRequest[] | undefined> {
|
|
1589
|
+
// `connectionId` (string) can be omitted when passing `options`; split the overlapping 4th arg.
|
|
1590
|
+
// When the 4th arg isn't the options object (a string `connectionId` or `undefined`), fall back to
|
|
1591
|
+
// the 5th-arg `options` so an explicit `undefined` connectionId still honors state filtering.
|
|
1592
|
+
const connectionId = typeof connectionIdOrOptions === 'string' ? connectionIdOrOptions : undefined;
|
|
1593
|
+
const searchOptions =
|
|
1594
|
+
connectionIdOrOptions != null && typeof connectionIdOrOptions !== 'string'
|
|
1595
|
+
? connectionIdOrOptions
|
|
1596
|
+
: options;
|
|
705
1597
|
const scope = getScopedLogger();
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
await this.refreshSessionIfExpired(scope);
|
|
1598
|
+
// `connectionId` targets a specific account (multi-account); omitted reads the primary.
|
|
1599
|
+
const session = await this.resolveReadSession(connectionId, scope);
|
|
1600
|
+
if (session == null) return undefined;
|
|
710
1601
|
|
|
711
1602
|
try {
|
|
712
1603
|
const prs = await this.searchProviderPullRequests?.(
|
|
713
|
-
|
|
1604
|
+
session,
|
|
714
1605
|
searchQuery,
|
|
715
1606
|
repos != null ? (Array.isArray(repos) ? repos : [repos]) : undefined,
|
|
716
1607
|
cancellation,
|
|
1608
|
+
searchOptions,
|
|
717
1609
|
);
|
|
718
1610
|
this.resetRequestExceptionCount('searchPullRequests');
|
|
719
1611
|
return prs;
|
|
@@ -728,6 +1620,7 @@ export abstract class GitHostIntegration<
|
|
|
728
1620
|
searchQuery: string,
|
|
729
1621
|
repos?: T[],
|
|
730
1622
|
cancellation?: AbortSignal,
|
|
1623
|
+
options?: { include?: PullRequestState[] },
|
|
731
1624
|
): Promise<PullRequest[] | undefined>;
|
|
732
1625
|
|
|
733
1626
|
getPullRequestIdentityFromMaybeUrl(search: string): PullRequestUrlIdentity | undefined {
|