@shipfox/api-integration-github 12.6.0 → 12.7.0

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.
@@ -1,2 +1,2 @@
1
1
  $ shipfox-swc
2
- Successfully compiled: 31 files with swc (490.83ms)
2
+ Successfully compiled: 31 files with swc (417.05ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @shipfox/api-integration-github
2
2
 
3
+ ## 12.7.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 4639dd9: Add GitHub pull request review-thread inspection and resolution tools.
8
+
3
9
  ## 12.6.0
4
10
 
5
11
  ### Patch Changes
@@ -1 +1 @@
1
- {"version":3,"file":"agent-tools.d.ts","sourceRoot":"","sources":["../../src/core/agent-tools.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent-tools.d.ts","sourceRoot":"","sources":["../../src/core/agent-tools.ts"],"names":[],"mappings":"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"}
@@ -25,6 +25,61 @@ const ADD_PENDING_REVIEW_COMMENT_MUTATION = `
25
25
  }
26
26
  }
27
27
  `;
28
+ const GET_PULL_REQUEST_REVIEW_THREADS_QUERY = `
29
+ query GetPullRequestReviewThreads(
30
+ $owner: String!
31
+ $repo: String!
32
+ $pullNumber: Int!
33
+ $after: String
34
+ ) {
35
+ repository(owner: $owner, name: $repo) {
36
+ pullRequest(number: $pullNumber) {
37
+ reviewThreads(first: 100, after: $after) {
38
+ nodes {
39
+ id
40
+ isResolved
41
+ comments(first: 100) {
42
+ nodes {
43
+ id
44
+ databaseId
45
+ body
46
+ author {
47
+ login
48
+ }
49
+ path
50
+ line
51
+ side
52
+ startLine
53
+ startSide
54
+ createdAt
55
+ updatedAt
56
+ url
57
+ }
58
+ pageInfo {
59
+ hasNextPage
60
+ endCursor
61
+ }
62
+ }
63
+ }
64
+ pageInfo {
65
+ hasNextPage
66
+ endCursor
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
72
+ `;
73
+ const RESOLVE_PULL_REQUEST_REVIEW_THREAD_MUTATION = `
74
+ mutation ResolvePullRequestReviewThread($input: ResolveReviewThreadInput!) {
75
+ resolveReviewThread(input: $input) {
76
+ thread {
77
+ id
78
+ isResolved
79
+ }
80
+ }
81
+ }
82
+ `;
28
83
  export class GithubAgentToolsProvider {
29
84
  constructor(options = {}){
30
85
  this.options = options;
@@ -62,8 +117,11 @@ export class GithubAgentToolsProvider {
62
117
  const client = (this.options.createClient ?? createOctokitClient)(token.token);
63
118
  const method = typeof call.arguments.method === 'string' ? call.arguments.method : undefined;
64
119
  if (operation.kind === 'graphql') {
65
- const data = await mapGithubError(()=>addCommentToPendingReview(client, operation.parameters));
66
- return data === undefined ? githubToolError(NO_PENDING_REVIEW_MESSAGE, 'provider-rejected') : githubToolResult(tool.id, data);
120
+ const data = await mapGithubError(()=>executeGithubGraphqlOperation(client, tool.id, method, operation.parameters));
121
+ if (data === undefined && tool.id === 'add_comment_to_pending_review') {
122
+ return githubToolError(NO_PENDING_REVIEW_MESSAGE, 'provider-rejected');
123
+ }
124
+ return githubToolResult(tool.id, data);
67
125
  }
68
126
  const operationParameters = await mapGithubError(()=>resolvePendingReviewParameters(client, operation.parameters, tool.id, method));
69
127
  if (operationParameters === undefined) {
@@ -172,6 +230,8 @@ export function githubOperationRoute(toolId, method, args) {
172
230
  return `GET ${repoPath}/pulls/${pull}/commits`;
173
231
  case 'pull_request_read.get_review_comments':
174
232
  return `GET ${repoPath}/pulls/${pull}/comments`;
233
+ case 'pull_request_read.get_review_threads':
234
+ return GITHUB_GRAPHQL_ROUTE;
175
235
  case 'pull_request_read.get_reviews':
176
236
  return `GET ${repoPath}/pulls/${pull}/reviews`;
177
237
  case 'pull_request_read.get_comments':
@@ -198,6 +258,8 @@ export function githubOperationRoute(toolId, method, args) {
198
258
  return `POST ${repoPath}/pulls/${pull}/reviews/{review_id}/events`;
199
259
  case 'pull_request_review_write.delete_pending':
200
260
  return `DELETE ${repoPath}/pulls/${pull}/reviews/{review_id}`;
261
+ case 'pull_request_review_thread_write.resolve':
262
+ return GITHUB_GRAPHQL_ROUTE;
201
263
  case 'add_comment_to_pending_review.':
202
264
  return GITHUB_GRAPHQL_ROUTE;
203
265
  case 'actions_list.list_workflows':
@@ -259,6 +321,33 @@ async function addCommentToPendingReview(client, args) {
259
321
  input
260
322
  });
261
323
  }
324
+ async function executeGithubGraphqlOperation(client, toolId, method, parameters) {
325
+ if (client.graphql === undefined) {
326
+ throw new GithubIntegrationProviderError('malformed-provider-response', 'GitHub client does not support GraphQL operations');
327
+ }
328
+ switch(`${toolId}.${method ?? ''}`){
329
+ case 'pull_request_read.get_review_threads':
330
+ {
331
+ const variables = {
332
+ owner: parameters.owner,
333
+ repo: parameters.repo,
334
+ pullNumber: parameters.pull_number
335
+ };
336
+ if (typeof parameters.cursor === 'string') variables.after = parameters.cursor;
337
+ return await client.graphql(GET_PULL_REQUEST_REVIEW_THREADS_QUERY, variables);
338
+ }
339
+ case 'pull_request_review_thread_write.resolve':
340
+ return await client.graphql(RESOLVE_PULL_REQUEST_REVIEW_THREAD_MUTATION, {
341
+ input: {
342
+ threadId: parameters.thread_id
343
+ }
344
+ });
345
+ case 'add_comment_to_pending_review.':
346
+ return await addCommentToPendingReview(client, parameters);
347
+ default:
348
+ throw new GithubIntegrationProviderError('malformed-provider-response', 'GitHub operation does not support GraphQL operations');
349
+ }
350
+ }
262
351
  export function projectGithubOperationParameters(toolId, method, args) {
263
352
  const parameters = {
264
353
  ...args
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/core/agent-tools.ts"],"sourcesContent":["import type {\n AgentToolCallInput,\n AgentToolCatalogEntry,\n AgentToolSelectionCatalog,\n AgentToolSession,\n AgentToolsProvider,\n IntegrationConnection,\n OpenAgentToolsSessionInput,\n} from '@shipfox/api-integration-spi';\nimport {Octokit} from 'octokit';\nimport {mapGithubError} from '#api/client.js';\nimport {\n createGithubInstallationTokenProvider,\n type GithubInstallationTokenProvider,\n} from '#api/installation-token-provider.js';\nimport {config, normalizedGithubApiBaseUrl} from '#config.js';\nimport type {GithubInstallation} from '#db/installations.js';\nimport {GithubIntegrationProviderError} from './errors.js';\nimport {\n type GithubAgentToolCatalogEntry,\n type GithubAgentToolId,\n type GithubAgentToolRequiredScope,\n githubAgentToolCatalog,\n githubAgentToolSelectionCatalog,\n} from './github-agent-tool-catalog.js';\n\nexport type {\n GithubAgentToolCatalogEntry,\n GithubAgentToolCategory,\n GithubAgentToolId,\n GithubAgentToolPermission,\n GithubAgentToolPermissionAccess,\n GithubAgentToolRequiredPermission,\n GithubAgentToolRequiredScope,\n GithubAgentToolSensitivity,\n} from './github-agent-tool-catalog.js';\nexport {\n buildGithubAgentToolSelectionCatalog,\n DEFAULT_JOB_LOG_TAIL_LINES,\n githubAgentToolCatalog,\n githubAgentToolSelectionCatalog,\n} from './github-agent-tool-catalog.js';\n\ntype GithubIntegrationConnection = IntegrationConnection<'github'>;\n\ntype GithubToolCallResult = {\n isError?: boolean | undefined;\n content: readonly {type: 'text'; text: string}[];\n structuredContent?: Record<string, unknown> | undefined;\n};\n\ntype GithubToolErrorCode =\n | 'invalid-request'\n | 'access-denied'\n | 'provider-rejected'\n | 'malformed-provider-response';\n\nconst GITHUB_GRAPHQL_ROUTE = 'POST /graphql';\nconst GITHUB_ARTIFACT_ARCHIVE_FORMAT = 'zip';\nconst GITHUB_ARTIFACT_DOWNLOAD_ROUTE = `GET /repos/{owner}/{repo}/actions/artifacts/{resource_id}/${GITHUB_ARTIFACT_ARCHIVE_FORMAT}`;\nconst GITHUB_ARTIFACT_DOWNLOAD_TIMEOUT_MS = 30_000;\nconst GITHUB_APP_BOT_SUFFIX = '[bot]';\nconst PENDING_REVIEW_PAGE_SIZE = 100;\nconst PENDING_REVIEW_MAX_PAGE_REQUESTS = 5;\nconst PENDING_REVIEW_LOOKUP_TIMEOUT_MS = 15_000;\nconst PENDING_REVIEW_PAGE_TIMEOUT_MS = 5_000;\nconst PENDING_REVIEW_PAGE_PATTERN = /[?&]page=(\\d+)/u;\nconst NO_PENDING_REVIEW_MESSAGE =\n 'No pending pull request review found for the authenticated GitHub user.';\n\nconst ADD_PENDING_REVIEW_COMMENT_MUTATION = `\n mutation AddCommentToPendingReview($input: AddPullRequestReviewThreadInput!) {\n addPullRequestReviewThread(input: $input) {\n thread {\n id\n }\n }\n }\n`;\n\nexport class GithubAgentToolsProvider\n implements\n AgentToolsProvider<\n GithubIntegrationConnection,\n GithubAgentToolRequiredScope,\n unknown,\n GithubToolCallResult\n >\n{\n private readonly tokenProvider: GithubInstallationTokenProvider;\n\n constructor(private readonly options: GithubAgentToolsProviderOptions = {}) {\n this.tokenProvider = options.tokenProvider ?? createGithubInstallationTokenProvider();\n }\n\n catalog(): readonly GithubAgentToolCatalogEntry[] {\n return githubAgentToolCatalog;\n }\n\n selectionCatalog(): AgentToolSelectionCatalog {\n return githubAgentToolSelectionCatalog;\n }\n\n async openSession(\n input: OpenAgentToolsSessionInput<GithubIntegrationConnection, GithubAgentToolRequiredScope>,\n ): Promise<AgentToolSession<GithubToolCallResult>> {\n const installation = await this.options.getInstallationByConnectionId?.(input.connection.id);\n if (!installation) {\n throw new GithubIntegrationProviderError(\n 'installation-not-found',\n 'GitHub installation is not connected to this integration',\n );\n }\n const installationId = Number(installation.installationId);\n if (!Number.isSafeInteger(installationId) || installationId < 1) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub installation has an invalid installation ID',\n );\n }\n let tokenPromise:\n | ReturnType<GithubInstallationTokenProvider['getInstallationAccessToken']>\n | undefined;\n\n return {\n call: async (call) => {\n const tool = input.tools.find((candidate) => candidate.id === call.toolId);\n if (!tool) return githubToolError(`Unknown GitHub tool: ${call.toolId}`, 'invalid-request');\n const operation = resolveGithubOperation(tool, call);\n if (operation === undefined)\n return githubToolError('Unknown GitHub tool operation', 'invalid-request');\n const validationError = validateGithubToolArguments(tool, call.arguments);\n if (validationError) return githubToolError(validationError, 'invalid-request');\n tokenPromise ??= this.tokenProvider.getInstallationAccessToken(installationId);\n const token = await tokenPromise;\n if (!hasGrantedPermissions(token.permissions ?? {}, tool, call)) {\n return githubToolError(\n 'GitHub installation token is missing permission for this operation',\n 'access-denied',\n );\n }\n const client = (this.options.createClient ?? createOctokitClient)(token.token);\n const method =\n typeof call.arguments.method === 'string' ? call.arguments.method : undefined;\n\n if (operation.kind === 'graphql') {\n const data = await mapGithubError(() =>\n addCommentToPendingReview(client, operation.parameters),\n );\n return data === undefined\n ? githubToolError(NO_PENDING_REVIEW_MESSAGE, 'provider-rejected')\n : githubToolResult(tool.id as GithubAgentToolId, data);\n }\n\n const operationParameters = await mapGithubError(() =>\n resolvePendingReviewParameters(\n client,\n operation.parameters,\n tool.id as GithubAgentToolId,\n method,\n ),\n );\n if (operationParameters === undefined) {\n return githubToolError(NO_PENDING_REVIEW_MESSAGE, 'provider-rejected');\n }\n const response = await mapGithubError(() =>\n client.request(operation.route, operationParameters),\n );\n return githubToolResult(\n tool.id as GithubAgentToolId,\n response.data,\n response,\n operationParameters,\n operation.route,\n );\n },\n };\n }\n}\n\nexport interface GithubAgentToolsProviderOptions {\n getInstallationByConnectionId?:\n | ((connectionId: string) => Promise<GithubInstallation | undefined>)\n | undefined;\n tokenProvider?: GithubInstallationTokenProvider | undefined;\n createClient?: GithubToolClientFactory | undefined;\n}\n\nexport interface GithubToolResponse {\n data: unknown;\n headers?: Record<string, string | number | undefined> | undefined;\n status?: number | undefined;\n url?: string | undefined;\n}\n\nexport interface GithubToolClient {\n request(route: string, parameters: Record<string, unknown>): Promise<GithubToolResponse>;\n graphql?: ((query: string, variables: Record<string, unknown>) => Promise<unknown>) | undefined;\n}\n\nexport type GithubToolClientFactory = (token: string) => GithubToolClient;\n\ninterface GithubToolOperation {\n route: string;\n parameters: Record<string, unknown>;\n kind: 'rest' | 'graphql';\n}\n\nfunction createOctokitClient(token: string): GithubToolClient {\n const octokit = new Octokit({\n auth: token,\n baseUrl: normalizedGithubApiBaseUrl(),\n retry: {enabled: false},\n });\n return {\n request: async (route, parameters) => {\n if (route !== GITHUB_ARTIFACT_DOWNLOAD_ROUTE) {\n return await octokit.request(route, parameters);\n }\n\n const abortController = new AbortController();\n const timeout = setTimeout(\n () => abortController.abort(),\n GITHUB_ARTIFACT_DOWNLOAD_TIMEOUT_MS,\n );\n try {\n return await octokit.request(route, {\n ...parameters,\n request: {\n redirect: 'manual',\n parseSuccessResponseBody: false,\n signal: abortController.signal,\n },\n });\n } finally {\n clearTimeout(timeout);\n }\n },\n graphql: async (query, variables) => await octokit.graphql(query, variables),\n };\n}\n\nfunction resolveGithubOperation(\n tool: AgentToolCatalogEntry<GithubAgentToolRequiredScope>,\n call: AgentToolCallInput,\n): GithubToolOperation | undefined {\n const args = call.arguments;\n const method = typeof args.method === 'string' ? args.method : undefined;\n const params = {...args};\n delete params.method;\n\n if (tool.methods && !tool.methods.some((candidate) => candidate.id === method)) return undefined;\n\n const toolId = tool.id as GithubAgentToolId;\n const route = githubOperationRoute(toolId, method, params);\n return route === undefined\n ? undefined\n : {\n route,\n parameters: projectGithubOperationParameters(toolId, method, params),\n kind: route === GITHUB_GRAPHQL_ROUTE ? 'graphql' : 'rest',\n };\n}\n\nexport function githubOperationRoute(\n toolId: GithubAgentToolId,\n method: string | undefined,\n args: Record<string, unknown>,\n): string | undefined {\n const owner = '{owner}';\n const repo = '{repo}';\n const issue = '{issue_number}';\n const pull = '{pull_number}';\n const run = '{run_id}';\n const resource = '{resource_id}';\n const repoPath = `/repos/${owner}/${repo}`;\n\n switch (`${toolId}.${method ?? ''}`) {\n case 'issue_read.get':\n return `GET ${repoPath}/issues/${issue}`;\n case 'issue_read.get_comments':\n return `GET ${repoPath}/issues/${issue}/comments`;\n case 'issue_read.get_sub_issues':\n return `GET ${repoPath}/issues/${issue}/sub_issues`;\n case 'issue_read.get_parent':\n return `GET ${repoPath}/issues/${issue}/parent`;\n case 'issue_read.get_labels':\n return `GET ${repoPath}/issues/${issue}/labels`;\n case 'list_issue_types.':\n return args.repo === undefined\n ? 'GET /orgs/{owner}/issue-types'\n : `GET ${repoPath}/issue-types`;\n case 'list_issues.':\n return `GET ${repoPath}/issues`;\n case 'search_issues.':\n return 'GET /search/issues';\n case 'add_issue_comment.':\n if (args.comment_id !== undefined)\n return `POST ${repoPath}/issues/comments/{comment_id}/reactions`;\n return args.reaction !== undefined && args.body === undefined\n ? `POST ${repoPath}/issues/${issue}/reactions`\n : `POST ${repoPath}/issues/${issue}/comments`;\n case 'issue_write.create':\n return `POST ${repoPath}/issues`;\n case 'issue_write.update':\n return `PATCH ${repoPath}/issues/${issue}`;\n case 'sub_issue_write.add':\n return `POST ${repoPath}/issues/${issue}/sub_issues`;\n case 'sub_issue_write.remove':\n return `DELETE ${repoPath}/issues/${issue}/sub_issues/{sub_issue_id}`;\n case 'sub_issue_write.reprioritize':\n return `PATCH ${repoPath}/issues/${issue}/sub_issues/priority`;\n case 'pull_request_read.get':\n return `GET ${repoPath}/pulls/${pull}`;\n case 'pull_request_read.get_diff':\n return `GET ${repoPath}/pulls/${pull}`;\n case 'pull_request_read.get_status':\n return `GET ${repoPath}/commits/{ref}/status`;\n case 'pull_request_read.get_files':\n return `GET ${repoPath}/pulls/${pull}/files`;\n case 'pull_request_read.get_commits':\n return `GET ${repoPath}/pulls/${pull}/commits`;\n case 'pull_request_read.get_review_comments':\n return `GET ${repoPath}/pulls/${pull}/comments`;\n case 'pull_request_read.get_reviews':\n return `GET ${repoPath}/pulls/${pull}/reviews`;\n case 'pull_request_read.get_comments':\n return `GET ${repoPath}/issues/${pull}/comments`;\n case 'pull_request_read.get_check_runs':\n return `GET ${repoPath}/commits/{ref}/check-runs`;\n case 'list_pull_requests.':\n return `GET ${repoPath}/pulls`;\n case 'search_pull_requests.':\n return 'GET /search/issues';\n case 'create_pull_request.':\n return `POST ${repoPath}/pulls`;\n case 'update_pull_request.':\n return `PATCH ${repoPath}/pulls/${pull}`;\n case 'add_reply_to_pull_request_comment.':\n return args.reaction !== undefined && args.body === undefined\n ? `POST ${repoPath}/pulls/comments/{comment_id}/reactions`\n : `POST ${repoPath}/pulls/${pull}/comments/{comment_id}/replies`;\n case 'merge_pull_request.':\n return `PUT ${repoPath}/pulls/${pull}/merge`;\n case 'update_pull_request_branch.':\n return `PUT ${repoPath}/pulls/${pull}/update-branch`;\n case 'pull_request_review_write.create':\n return `POST ${repoPath}/pulls/${pull}/reviews`;\n case 'pull_request_review_write.submit_pending':\n return `POST ${repoPath}/pulls/${pull}/reviews/{review_id}/events`;\n case 'pull_request_review_write.delete_pending':\n return `DELETE ${repoPath}/pulls/${pull}/reviews/{review_id}`;\n case 'add_comment_to_pending_review.':\n return GITHUB_GRAPHQL_ROUTE;\n case 'actions_list.list_workflows':\n return `GET ${repoPath}/actions/workflows`;\n case 'actions_list.list_workflow_runs':\n return `GET ${repoPath}/actions/workflows/${resource}/runs`;\n case 'actions_list.list_workflow_jobs':\n return `GET ${repoPath}/actions/runs/${resource}/jobs`;\n case 'actions_list.list_workflow_run_artifacts':\n return `GET ${repoPath}/actions/runs/${resource}/artifacts`;\n case 'actions_get.get_workflow':\n return `GET ${repoPath}/actions/workflows/${resource}`;\n case 'actions_get.get_workflow_run':\n return `GET ${repoPath}/actions/runs/${resource}`;\n case 'actions_get.get_workflow_job':\n return `GET ${repoPath}/actions/jobs/${resource}`;\n case 'actions_get.download_workflow_run_artifact':\n return GITHUB_ARTIFACT_DOWNLOAD_ROUTE;\n case 'actions_get.get_workflow_run_usage':\n return `GET ${repoPath}/actions/runs/${resource}/timing`;\n case 'actions_get.get_workflow_run_logs_url':\n return `GET ${repoPath}/actions/runs/${resource}/logs`;\n case 'actions_run_trigger.run_workflow':\n return `POST ${repoPath}/actions/workflows/{workflow_id}/dispatches`;\n case 'actions_run_trigger.rerun_workflow_run':\n return `POST ${repoPath}/actions/runs/${run}/rerun`;\n case 'actions_run_trigger.rerun_failed_jobs':\n return `POST ${repoPath}/actions/runs/${run}/rerun-failed-jobs`;\n case 'actions_run_trigger.cancel_workflow_run':\n return `POST ${repoPath}/actions/runs/${run}/cancel`;\n case 'actions_run_trigger.delete_workflow_run_logs':\n return `DELETE ${repoPath}/actions/runs/${run}/logs`;\n case 'get_job_logs.':\n return `GET ${repoPath}/actions/jobs/{job_id}/logs`;\n default:\n return undefined;\n }\n}\n\nasync function addCommentToPendingReview(\n client: GithubToolClient,\n args: Record<string, unknown>,\n): Promise<unknown | undefined> {\n if (client.graphql === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub client does not support GraphQL operations',\n );\n }\n\n const review = await latestPendingReview(client, args, 'nodeId');\n if (review === undefined) return undefined;\n if (review.nodeId === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pending pull request review did not include a node ID',\n );\n }\n\n const input: Record<string, unknown> = {\n pullRequestReviewId: review.nodeId,\n path: args.path,\n body: args.body,\n subjectType: args.subject_type,\n };\n if (args.line !== undefined) input.line = args.line;\n if (args.side !== undefined) input.side = args.side;\n if (args.start_line !== undefined) input.startLine = args.start_line;\n if (args.start_side !== undefined) input.startSide = args.start_side;\n\n return await client.graphql(ADD_PENDING_REVIEW_COMMENT_MUTATION, {input});\n}\n\nexport function projectGithubOperationParameters(\n toolId: GithubAgentToolId,\n method: string | undefined,\n args: Record<string, unknown>,\n): Record<string, unknown> {\n const parameters = {...args};\n if (toolId === 'add_issue_comment' && parameters.reaction !== undefined) {\n parameters.content = parameters.reaction;\n delete parameters.reaction;\n if (parameters.body === undefined) delete parameters.body;\n }\n if (toolId === 'pull_request_read' && method === 'get_diff') {\n parameters.headers = {accept: 'application/vnd.github.diff'};\n }\n return parameters;\n}\n\nasync function resolvePendingReviewParameters(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n toolId: GithubAgentToolId,\n method: string | undefined,\n): Promise<Record<string, unknown> | undefined> {\n if (!isPendingReviewOperation(toolId, method)) return parameters;\n\n const review = await latestPendingReview(client, parameters, 'id');\n if (review === undefined) return undefined;\n if (review.id === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pending pull request review did not include a numeric ID',\n );\n }\n return {...parameters, review_id: review.id};\n}\n\nfunction isPendingReviewOperation(toolId: GithubAgentToolId, method: string | undefined): boolean {\n return (\n toolId === 'pull_request_review_write' &&\n (method === 'submit_pending' || method === 'delete_pending')\n );\n}\n\ninterface PendingReviewReference {\n id?: number | undefined;\n nodeId?: string | undefined;\n}\n\ntype PendingReviewIdentifier = keyof PendingReviewReference;\n\ninterface PendingReviewPageResult {\n malformed: boolean;\n review?: PendingReviewReference | undefined;\n}\n\nasync function latestPendingReview(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n requiredIdentifier: PendingReviewIdentifier,\n): Promise<PendingReviewReference | undefined> {\n const lookupController = new AbortController();\n const lookupTimeout = setTimeout(\n () => lookupController.abort(),\n PENDING_REVIEW_LOOKUP_TIMEOUT_MS,\n );\n\n try {\n return await latestPendingReviewBeforeDeadline(\n client,\n parameters,\n requiredIdentifier,\n lookupController.signal,\n );\n } finally {\n clearTimeout(lookupTimeout);\n }\n}\n\nasync function latestPendingReviewBeforeDeadline(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n requiredIdentifier: PendingReviewIdentifier,\n lookupSignal: AbortSignal,\n): Promise<PendingReviewReference | undefined> {\n const firstPage = await requestPendingReviewPage(client, parameters, 1, lookupSignal);\n const lastPage = pendingReviewLastPage(firstPage.headers);\n let requests = 1;\n let malformed = false;\n\n for (let page = lastPage; page >= 1; page -= 1) {\n let response = firstPage;\n if (page !== 1) {\n if (requests >= PENDING_REVIEW_MAX_PAGE_REQUESTS) {\n throw new GithubIntegrationProviderError(\n 'content-too-large',\n 'GitHub pull request review history exceeded the pending review lookup limit',\n );\n }\n response = await requestPendingReviewPage(client, parameters, page, lookupSignal);\n requests += 1;\n }\n if (!Array.isArray(response.data)) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pull request review list response was malformed',\n );\n }\n\n const result = latestPendingReviewOnPage(response.data, requiredIdentifier);\n if (result.review !== undefined) return result.review;\n malformed ||= result.malformed;\n }\n\n if (malformed) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n requiredIdentifier === 'nodeId'\n ? 'GitHub pending pull request review did not include a node ID'\n : 'GitHub pending pull request review did not include a numeric ID',\n );\n }\n return undefined;\n}\n\nasync function requestPendingReviewPage(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n page: number,\n lookupSignal: AbortSignal,\n): Promise<GithubToolResponse> {\n const pageController = new AbortController();\n const abortPage = () => pageController.abort();\n if (lookupSignal.aborted) abortPage();\n else lookupSignal.addEventListener('abort', abortPage, {once: true});\n const pageTimeout = setTimeout(abortPage, PENDING_REVIEW_PAGE_TIMEOUT_MS);\n\n try {\n return await client.request('GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews', {\n owner: parameters.owner,\n repo: parameters.repo,\n pull_number: parameters.pull_number,\n per_page: PENDING_REVIEW_PAGE_SIZE,\n page,\n request: {signal: pageController.signal},\n });\n } finally {\n clearTimeout(pageTimeout);\n lookupSignal.removeEventListener('abort', abortPage);\n }\n}\n\nfunction pendingReviewLastPage(headers: GithubToolResponse['headers']): number {\n const link = headers?.link;\n if (typeof link !== 'string') return 1;\n const lastLink = link.split(',').find((part) => part.includes('rel=\"last\"'));\n if (lastLink === undefined) return 1;\n const match = PENDING_REVIEW_PAGE_PATTERN.exec(lastLink);\n const page = match?.[1] === undefined ? Number.NaN : Number.parseInt(match[1], 10);\n if (!Number.isSafeInteger(page) || page < 1) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pull request review pagination response was malformed',\n );\n }\n return page;\n}\n\nfunction latestPendingReviewOnPage(\n data: readonly unknown[],\n requiredIdentifier: PendingReviewIdentifier,\n): PendingReviewPageResult {\n let malformed = false;\n const appLogin = githubAppBotLogin().toLowerCase();\n for (let index = data.length - 1; index >= 0; index -= 1) {\n const review = data[index];\n if (!isRecord(review) || review.state !== 'PENDING') continue;\n const userLogin = isRecord(review.user) ? review.user.login : undefined;\n if (typeof userLogin !== 'string' || userLogin.trim().length === 0) {\n malformed = true;\n continue;\n }\n if (userLogin.trim().toLowerCase() !== appLogin) continue;\n const id =\n typeof review.id === 'number' && Number.isSafeInteger(review.id) && review.id > 0\n ? review.id\n : undefined;\n const nodeId =\n typeof review.node_id === 'string' && review.node_id.trim().length > 0\n ? review.node_id.trim()\n : undefined;\n const reference = {id, nodeId};\n if (reference[requiredIdentifier] !== undefined) return {malformed, review: reference};\n malformed = true;\n }\n\n return {malformed};\n}\n\nfunction githubAppBotLogin(): string {\n const configuredUsername = config.GITHUB_APP_USERNAME?.trim() || config.GITHUB_APP_SLUG.trim();\n return configuredUsername.toLowerCase().endsWith(GITHUB_APP_BOT_SUFFIX)\n ? configuredUsername\n : `${configuredUsername}${GITHUB_APP_BOT_SUFFIX}`;\n}\n\nfunction githubToolResult(\n toolId: GithubAgentToolId,\n data: unknown,\n response?: GithubToolResponse,\n parameters?: Record<string, unknown>,\n route?: string,\n): GithubToolCallResult {\n const structuredContent = projectGithubToolOutput(toolId, data, response, parameters, route);\n if (structuredContent === undefined) {\n return githubToolError(\n 'GitHub artifact download did not return a download URL',\n 'malformed-provider-response',\n );\n }\n return {\n content: [{type: 'text', text: JSON.stringify(structuredContent)}],\n structuredContent,\n };\n}\n\nfunction projectGithubToolOutput(\n toolId: GithubAgentToolId,\n data: unknown,\n response?: GithubToolResponse,\n parameters?: Record<string, unknown>,\n route?: string,\n): Record<string, unknown> | undefined {\n if (route === GITHUB_ARTIFACT_DOWNLOAD_ROUTE) {\n return projectGithubArtifactDownloadOutput(response, parameters);\n }\n\n switch (toolId) {\n case 'list_issue_types':\n return {issue_types: data};\n case 'list_issues':\n return {issues: data};\n case 'search_issues':\n return {issues: githubSearchItems(data)};\n case 'list_pull_requests':\n return {pull_requests: data};\n case 'search_pull_requests':\n return {pull_requests: githubSearchItems(data)};\n case 'create_pull_request':\n case 'update_pull_request':\n return {pull_request: data};\n case 'merge_pull_request':\n return {merge: data};\n default:\n return isRecord(data) ? data : {result: data};\n }\n}\n\nfunction projectGithubArtifactDownloadOutput(\n response: GithubToolResponse | undefined,\n parameters: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (response === undefined) return undefined;\n const downloadUrl = response.headers?.location;\n if (typeof downloadUrl !== 'string' || downloadUrl.length === 0) return undefined;\n\n const output: Record<string, unknown> = {\n archive_format: GITHUB_ARTIFACT_ARCHIVE_FORMAT,\n download_url: downloadUrl,\n };\n if (typeof parameters?.resource_id === 'string') output.artifact_id = parameters.resource_id;\n\n const contentType = response.headers?.['content-type'];\n if (typeof contentType === 'string') output.content_type = contentType;\n\n const contentLength = response.headers?.['content-length'];\n const sizeBytes = typeof contentLength === 'number' ? contentLength : Number(contentLength);\n if (Number.isSafeInteger(sizeBytes) && sizeBytes >= 0) output.size_bytes = sizeBytes;\n\n return output;\n}\n\nfunction githubSearchItems(data: unknown): unknown {\n return isRecord(data) ? data.items : data;\n}\n\nfunction githubToolError(message: string, code: GithubToolErrorCode): GithubToolCallResult {\n return {\n isError: true,\n content: [{type: 'text', text: message}],\n structuredContent: {code},\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateGithubToolArguments(\n tool: AgentToolCatalogEntry<GithubAgentToolRequiredScope>,\n arguments_: Record<string, unknown>,\n): string | undefined {\n const required = Array.isArray(tool.inputSchema.required) ? tool.inputSchema.required : [];\n for (const name of required) {\n if (typeof name === 'string' && arguments_[name] === undefined) {\n return `Missing required parameter: ${name}`;\n }\n }\n\n const methodRequired = methodRequiredParameters(tool.inputSchema, arguments_);\n for (const name of methodRequired) {\n if (arguments_[name] === undefined) return `Missing required parameter: ${name}`;\n }\n\n const properties = tool.inputSchema.properties;\n if (typeof properties !== 'object' || properties === null || Array.isArray(properties)) {\n return undefined;\n }\n const propertySchemas = properties as Record<string, unknown>;\n for (const [name, value] of Object.entries(arguments_)) {\n const schema = propertySchemas[name];\n if (typeof schema !== 'object' || schema === null || Array.isArray(schema)) continue;\n const type = (schema as {type?: unknown}).type;\n if (type === 'integer' && (!Number.isInteger(value) || typeof value !== 'number')) {\n return `Parameter ${name} must be an integer`;\n }\n if (type === 'array' && !Array.isArray(value)) return `Parameter ${name} must be an array`;\n }\n return undefined;\n}\n\nfunction methodRequiredParameters(\n inputSchema: AgentToolCatalogEntry<GithubAgentToolRequiredScope>['inputSchema'],\n arguments_: Record<string, unknown>,\n): string[] {\n const method = arguments_.method;\n if (typeof method !== 'string' || !Array.isArray(inputSchema.oneOf)) return [];\n\n for (const candidate of inputSchema.oneOf) {\n if (!isRecord(candidate) || !isRecord(candidate.properties)) continue;\n const methodSchema = candidate.properties.method;\n if (!isRecord(methodSchema) || methodSchema.const !== method) continue;\n return Array.isArray(candidate.required)\n ? candidate.required.filter((name): name is string => typeof name === 'string')\n : [];\n }\n\n return [];\n}\n\nfunction hasGrantedPermissions(\n granted: Record<string, 'read' | 'write' | 'admin'>,\n tool: AgentToolCatalogEntry<GithubAgentToolRequiredScope>,\n call: AgentToolCallInput,\n): boolean {\n const method = typeof call.arguments.method === 'string' ? call.arguments.method : undefined;\n const required =\n tool.methods?.find((candidate) => candidate.id === method)?.requiredScope ?? tool.requiredScope;\n return required.every(({permission, access}) => {\n const actual = granted[permission];\n return actual === 'write' || actual === 'admin' || actual === access;\n });\n}\n"],"names":["Octokit","mapGithubError","createGithubInstallationTokenProvider","config","normalizedGithubApiBaseUrl","GithubIntegrationProviderError","githubAgentToolCatalog","githubAgentToolSelectionCatalog","buildGithubAgentToolSelectionCatalog","DEFAULT_JOB_LOG_TAIL_LINES","GITHUB_GRAPHQL_ROUTE","GITHUB_ARTIFACT_ARCHIVE_FORMAT","GITHUB_ARTIFACT_DOWNLOAD_ROUTE","GITHUB_ARTIFACT_DOWNLOAD_TIMEOUT_MS","GITHUB_APP_BOT_SUFFIX","PENDING_REVIEW_PAGE_SIZE","PENDING_REVIEW_MAX_PAGE_REQUESTS","PENDING_REVIEW_LOOKUP_TIMEOUT_MS","PENDING_REVIEW_PAGE_TIMEOUT_MS","PENDING_REVIEW_PAGE_PATTERN","NO_PENDING_REVIEW_MESSAGE","ADD_PENDING_REVIEW_COMMENT_MUTATION","GithubAgentToolsProvider","options","tokenProvider","catalog","selectionCatalog","openSession","input","installation","getInstallationByConnectionId","connection","id","installationId","Number","isSafeInteger","tokenPromise","call","tool","tools","find","candidate","toolId","githubToolError","operation","resolveGithubOperation","undefined","validationError","validateGithubToolArguments","arguments","getInstallationAccessToken","token","hasGrantedPermissions","permissions","client","createClient","createOctokitClient","method","kind","data","addCommentToPendingReview","parameters","githubToolResult","operationParameters","resolvePendingReviewParameters","response","request","route","octokit","auth","baseUrl","retry","enabled","abortController","AbortController","timeout","setTimeout","abort","redirect","parseSuccessResponseBody","signal","clearTimeout","graphql","query","variables","args","params","methods","some","githubOperationRoute","projectGithubOperationParameters","owner","repo","issue","pull","run","resource","repoPath","comment_id","reaction","body","review","latestPendingReview","nodeId","pullRequestReviewId","path","subjectType","subject_type","line","side","start_line","startLine","start_side","startSide","content","headers","accept","isPendingReviewOperation","review_id","requiredIdentifier","lookupController","lookupTimeout","latestPendingReviewBeforeDeadline","lookupSignal","firstPage","requestPendingReviewPage","lastPage","pendingReviewLastPage","requests","malformed","page","Array","isArray","result","latestPendingReviewOnPage","pageController","abortPage","aborted","addEventListener","once","pageTimeout","pull_number","per_page","removeEventListener","link","lastLink","split","part","includes","match","exec","NaN","parseInt","appLogin","githubAppBotLogin","toLowerCase","index","length","isRecord","state","userLogin","user","login","trim","node_id","reference","configuredUsername","GITHUB_APP_USERNAME","GITHUB_APP_SLUG","endsWith","structuredContent","projectGithubToolOutput","type","text","JSON","stringify","projectGithubArtifactDownloadOutput","issue_types","issues","githubSearchItems","pull_requests","pull_request","merge","downloadUrl","location","output","archive_format","download_url","resource_id","artifact_id","contentType","content_type","contentLength","sizeBytes","size_bytes","items","message","code","isError","value","arguments_","required","inputSchema","name","methodRequired","methodRequiredParameters","properties","propertySchemas","Object","entries","schema","isInteger","oneOf","methodSchema","const","filter","granted","requiredScope","every","permission","access","actual"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/core/agent-tools.ts"],"sourcesContent":["import type {\n AgentToolCallInput,\n AgentToolCatalogEntry,\n AgentToolSelectionCatalog,\n AgentToolSession,\n AgentToolsProvider,\n IntegrationConnection,\n OpenAgentToolsSessionInput,\n} from '@shipfox/api-integration-spi';\nimport {Octokit} from 'octokit';\nimport {mapGithubError} from '#api/client.js';\nimport {\n createGithubInstallationTokenProvider,\n type GithubInstallationTokenProvider,\n} from '#api/installation-token-provider.js';\nimport {config, normalizedGithubApiBaseUrl} from '#config.js';\nimport type {GithubInstallation} from '#db/installations.js';\nimport {GithubIntegrationProviderError} from './errors.js';\nimport {\n type GithubAgentToolCatalogEntry,\n type GithubAgentToolId,\n type GithubAgentToolRequiredScope,\n githubAgentToolCatalog,\n githubAgentToolSelectionCatalog,\n} from './github-agent-tool-catalog.js';\n\nexport type {\n GithubAgentToolCatalogEntry,\n GithubAgentToolCategory,\n GithubAgentToolId,\n GithubAgentToolPermission,\n GithubAgentToolPermissionAccess,\n GithubAgentToolRequiredPermission,\n GithubAgentToolRequiredScope,\n GithubAgentToolSensitivity,\n} from './github-agent-tool-catalog.js';\nexport {\n buildGithubAgentToolSelectionCatalog,\n DEFAULT_JOB_LOG_TAIL_LINES,\n githubAgentToolCatalog,\n githubAgentToolSelectionCatalog,\n} from './github-agent-tool-catalog.js';\n\ntype GithubIntegrationConnection = IntegrationConnection<'github'>;\n\ntype GithubToolCallResult = {\n isError?: boolean | undefined;\n content: readonly {type: 'text'; text: string}[];\n structuredContent?: Record<string, unknown> | undefined;\n};\n\ntype GithubToolErrorCode =\n | 'invalid-request'\n | 'access-denied'\n | 'provider-rejected'\n | 'malformed-provider-response';\n\nconst GITHUB_GRAPHQL_ROUTE = 'POST /graphql';\nconst GITHUB_ARTIFACT_ARCHIVE_FORMAT = 'zip';\nconst GITHUB_ARTIFACT_DOWNLOAD_ROUTE = `GET /repos/{owner}/{repo}/actions/artifacts/{resource_id}/${GITHUB_ARTIFACT_ARCHIVE_FORMAT}`;\nconst GITHUB_ARTIFACT_DOWNLOAD_TIMEOUT_MS = 30_000;\nconst GITHUB_APP_BOT_SUFFIX = '[bot]';\nconst PENDING_REVIEW_PAGE_SIZE = 100;\nconst PENDING_REVIEW_MAX_PAGE_REQUESTS = 5;\nconst PENDING_REVIEW_LOOKUP_TIMEOUT_MS = 15_000;\nconst PENDING_REVIEW_PAGE_TIMEOUT_MS = 5_000;\nconst PENDING_REVIEW_PAGE_PATTERN = /[?&]page=(\\d+)/u;\nconst NO_PENDING_REVIEW_MESSAGE =\n 'No pending pull request review found for the authenticated GitHub user.';\n\nconst ADD_PENDING_REVIEW_COMMENT_MUTATION = `\n mutation AddCommentToPendingReview($input: AddPullRequestReviewThreadInput!) {\n addPullRequestReviewThread(input: $input) {\n thread {\n id\n }\n }\n }\n`;\n\nconst GET_PULL_REQUEST_REVIEW_THREADS_QUERY = `\n query GetPullRequestReviewThreads(\n $owner: String!\n $repo: String!\n $pullNumber: Int!\n $after: String\n ) {\n repository(owner: $owner, name: $repo) {\n pullRequest(number: $pullNumber) {\n reviewThreads(first: 100, after: $after) {\n nodes {\n id\n isResolved\n comments(first: 100) {\n nodes {\n id\n databaseId\n body\n author {\n login\n }\n path\n line\n side\n startLine\n startSide\n createdAt\n updatedAt\n url\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n pageInfo {\n hasNextPage\n endCursor\n }\n }\n }\n }\n }\n`;\n\nconst RESOLVE_PULL_REQUEST_REVIEW_THREAD_MUTATION = `\n mutation ResolvePullRequestReviewThread($input: ResolveReviewThreadInput!) {\n resolveReviewThread(input: $input) {\n thread {\n id\n isResolved\n }\n }\n }\n`;\n\nexport class GithubAgentToolsProvider\n implements\n AgentToolsProvider<\n GithubIntegrationConnection,\n GithubAgentToolRequiredScope,\n unknown,\n GithubToolCallResult\n >\n{\n private readonly tokenProvider: GithubInstallationTokenProvider;\n\n constructor(private readonly options: GithubAgentToolsProviderOptions = {}) {\n this.tokenProvider = options.tokenProvider ?? createGithubInstallationTokenProvider();\n }\n\n catalog(): readonly GithubAgentToolCatalogEntry[] {\n return githubAgentToolCatalog;\n }\n\n selectionCatalog(): AgentToolSelectionCatalog {\n return githubAgentToolSelectionCatalog;\n }\n\n async openSession(\n input: OpenAgentToolsSessionInput<GithubIntegrationConnection, GithubAgentToolRequiredScope>,\n ): Promise<AgentToolSession<GithubToolCallResult>> {\n const installation = await this.options.getInstallationByConnectionId?.(input.connection.id);\n if (!installation) {\n throw new GithubIntegrationProviderError(\n 'installation-not-found',\n 'GitHub installation is not connected to this integration',\n );\n }\n const installationId = Number(installation.installationId);\n if (!Number.isSafeInteger(installationId) || installationId < 1) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub installation has an invalid installation ID',\n );\n }\n let tokenPromise:\n | ReturnType<GithubInstallationTokenProvider['getInstallationAccessToken']>\n | undefined;\n\n return {\n call: async (call) => {\n const tool = input.tools.find((candidate) => candidate.id === call.toolId);\n if (!tool) return githubToolError(`Unknown GitHub tool: ${call.toolId}`, 'invalid-request');\n const operation = resolveGithubOperation(tool, call);\n if (operation === undefined)\n return githubToolError('Unknown GitHub tool operation', 'invalid-request');\n const validationError = validateGithubToolArguments(tool, call.arguments);\n if (validationError) return githubToolError(validationError, 'invalid-request');\n tokenPromise ??= this.tokenProvider.getInstallationAccessToken(installationId);\n const token = await tokenPromise;\n if (!hasGrantedPermissions(token.permissions ?? {}, tool, call)) {\n return githubToolError(\n 'GitHub installation token is missing permission for this operation',\n 'access-denied',\n );\n }\n const client = (this.options.createClient ?? createOctokitClient)(token.token);\n const method =\n typeof call.arguments.method === 'string' ? call.arguments.method : undefined;\n\n if (operation.kind === 'graphql') {\n const data = await mapGithubError(() =>\n executeGithubGraphqlOperation(\n client,\n tool.id as GithubAgentToolId,\n method,\n operation.parameters,\n ),\n );\n if (data === undefined && tool.id === 'add_comment_to_pending_review') {\n return githubToolError(NO_PENDING_REVIEW_MESSAGE, 'provider-rejected');\n }\n return githubToolResult(tool.id as GithubAgentToolId, data);\n }\n\n const operationParameters = await mapGithubError(() =>\n resolvePendingReviewParameters(\n client,\n operation.parameters,\n tool.id as GithubAgentToolId,\n method,\n ),\n );\n if (operationParameters === undefined) {\n return githubToolError(NO_PENDING_REVIEW_MESSAGE, 'provider-rejected');\n }\n const response = await mapGithubError(() =>\n client.request(operation.route, operationParameters),\n );\n return githubToolResult(\n tool.id as GithubAgentToolId,\n response.data,\n response,\n operationParameters,\n operation.route,\n );\n },\n };\n }\n}\n\nexport interface GithubAgentToolsProviderOptions {\n getInstallationByConnectionId?:\n | ((connectionId: string) => Promise<GithubInstallation | undefined>)\n | undefined;\n tokenProvider?: GithubInstallationTokenProvider | undefined;\n createClient?: GithubToolClientFactory | undefined;\n}\n\nexport interface GithubToolResponse {\n data: unknown;\n headers?: Record<string, string | number | undefined> | undefined;\n status?: number | undefined;\n url?: string | undefined;\n}\n\nexport interface GithubToolClient {\n request(route: string, parameters: Record<string, unknown>): Promise<GithubToolResponse>;\n graphql?: ((query: string, variables: Record<string, unknown>) => Promise<unknown>) | undefined;\n}\n\nexport type GithubToolClientFactory = (token: string) => GithubToolClient;\n\ninterface GithubToolOperation {\n route: string;\n parameters: Record<string, unknown>;\n kind: 'rest' | 'graphql';\n}\n\nfunction createOctokitClient(token: string): GithubToolClient {\n const octokit = new Octokit({\n auth: token,\n baseUrl: normalizedGithubApiBaseUrl(),\n retry: {enabled: false},\n });\n return {\n request: async (route, parameters) => {\n if (route !== GITHUB_ARTIFACT_DOWNLOAD_ROUTE) {\n return await octokit.request(route, parameters);\n }\n\n const abortController = new AbortController();\n const timeout = setTimeout(\n () => abortController.abort(),\n GITHUB_ARTIFACT_DOWNLOAD_TIMEOUT_MS,\n );\n try {\n return await octokit.request(route, {\n ...parameters,\n request: {\n redirect: 'manual',\n parseSuccessResponseBody: false,\n signal: abortController.signal,\n },\n });\n } finally {\n clearTimeout(timeout);\n }\n },\n graphql: async (query, variables) => await octokit.graphql(query, variables),\n };\n}\n\nfunction resolveGithubOperation(\n tool: AgentToolCatalogEntry<GithubAgentToolRequiredScope>,\n call: AgentToolCallInput,\n): GithubToolOperation | undefined {\n const args = call.arguments;\n const method = typeof args.method === 'string' ? args.method : undefined;\n const params = {...args};\n delete params.method;\n\n if (tool.methods && !tool.methods.some((candidate) => candidate.id === method)) return undefined;\n\n const toolId = tool.id as GithubAgentToolId;\n const route = githubOperationRoute(toolId, method, params);\n return route === undefined\n ? undefined\n : {\n route,\n parameters: projectGithubOperationParameters(toolId, method, params),\n kind: route === GITHUB_GRAPHQL_ROUTE ? 'graphql' : 'rest',\n };\n}\n\nexport function githubOperationRoute(\n toolId: GithubAgentToolId,\n method: string | undefined,\n args: Record<string, unknown>,\n): string | undefined {\n const owner = '{owner}';\n const repo = '{repo}';\n const issue = '{issue_number}';\n const pull = '{pull_number}';\n const run = '{run_id}';\n const resource = '{resource_id}';\n const repoPath = `/repos/${owner}/${repo}`;\n\n switch (`${toolId}.${method ?? ''}`) {\n case 'issue_read.get':\n return `GET ${repoPath}/issues/${issue}`;\n case 'issue_read.get_comments':\n return `GET ${repoPath}/issues/${issue}/comments`;\n case 'issue_read.get_sub_issues':\n return `GET ${repoPath}/issues/${issue}/sub_issues`;\n case 'issue_read.get_parent':\n return `GET ${repoPath}/issues/${issue}/parent`;\n case 'issue_read.get_labels':\n return `GET ${repoPath}/issues/${issue}/labels`;\n case 'list_issue_types.':\n return args.repo === undefined\n ? 'GET /orgs/{owner}/issue-types'\n : `GET ${repoPath}/issue-types`;\n case 'list_issues.':\n return `GET ${repoPath}/issues`;\n case 'search_issues.':\n return 'GET /search/issues';\n case 'add_issue_comment.':\n if (args.comment_id !== undefined)\n return `POST ${repoPath}/issues/comments/{comment_id}/reactions`;\n return args.reaction !== undefined && args.body === undefined\n ? `POST ${repoPath}/issues/${issue}/reactions`\n : `POST ${repoPath}/issues/${issue}/comments`;\n case 'issue_write.create':\n return `POST ${repoPath}/issues`;\n case 'issue_write.update':\n return `PATCH ${repoPath}/issues/${issue}`;\n case 'sub_issue_write.add':\n return `POST ${repoPath}/issues/${issue}/sub_issues`;\n case 'sub_issue_write.remove':\n return `DELETE ${repoPath}/issues/${issue}/sub_issues/{sub_issue_id}`;\n case 'sub_issue_write.reprioritize':\n return `PATCH ${repoPath}/issues/${issue}/sub_issues/priority`;\n case 'pull_request_read.get':\n return `GET ${repoPath}/pulls/${pull}`;\n case 'pull_request_read.get_diff':\n return `GET ${repoPath}/pulls/${pull}`;\n case 'pull_request_read.get_status':\n return `GET ${repoPath}/commits/{ref}/status`;\n case 'pull_request_read.get_files':\n return `GET ${repoPath}/pulls/${pull}/files`;\n case 'pull_request_read.get_commits':\n return `GET ${repoPath}/pulls/${pull}/commits`;\n case 'pull_request_read.get_review_comments':\n return `GET ${repoPath}/pulls/${pull}/comments`;\n case 'pull_request_read.get_review_threads':\n return GITHUB_GRAPHQL_ROUTE;\n case 'pull_request_read.get_reviews':\n return `GET ${repoPath}/pulls/${pull}/reviews`;\n case 'pull_request_read.get_comments':\n return `GET ${repoPath}/issues/${pull}/comments`;\n case 'pull_request_read.get_check_runs':\n return `GET ${repoPath}/commits/{ref}/check-runs`;\n case 'list_pull_requests.':\n return `GET ${repoPath}/pulls`;\n case 'search_pull_requests.':\n return 'GET /search/issues';\n case 'create_pull_request.':\n return `POST ${repoPath}/pulls`;\n case 'update_pull_request.':\n return `PATCH ${repoPath}/pulls/${pull}`;\n case 'add_reply_to_pull_request_comment.':\n return args.reaction !== undefined && args.body === undefined\n ? `POST ${repoPath}/pulls/comments/{comment_id}/reactions`\n : `POST ${repoPath}/pulls/${pull}/comments/{comment_id}/replies`;\n case 'merge_pull_request.':\n return `PUT ${repoPath}/pulls/${pull}/merge`;\n case 'update_pull_request_branch.':\n return `PUT ${repoPath}/pulls/${pull}/update-branch`;\n case 'pull_request_review_write.create':\n return `POST ${repoPath}/pulls/${pull}/reviews`;\n case 'pull_request_review_write.submit_pending':\n return `POST ${repoPath}/pulls/${pull}/reviews/{review_id}/events`;\n case 'pull_request_review_write.delete_pending':\n return `DELETE ${repoPath}/pulls/${pull}/reviews/{review_id}`;\n case 'pull_request_review_thread_write.resolve':\n return GITHUB_GRAPHQL_ROUTE;\n case 'add_comment_to_pending_review.':\n return GITHUB_GRAPHQL_ROUTE;\n case 'actions_list.list_workflows':\n return `GET ${repoPath}/actions/workflows`;\n case 'actions_list.list_workflow_runs':\n return `GET ${repoPath}/actions/workflows/${resource}/runs`;\n case 'actions_list.list_workflow_jobs':\n return `GET ${repoPath}/actions/runs/${resource}/jobs`;\n case 'actions_list.list_workflow_run_artifacts':\n return `GET ${repoPath}/actions/runs/${resource}/artifacts`;\n case 'actions_get.get_workflow':\n return `GET ${repoPath}/actions/workflows/${resource}`;\n case 'actions_get.get_workflow_run':\n return `GET ${repoPath}/actions/runs/${resource}`;\n case 'actions_get.get_workflow_job':\n return `GET ${repoPath}/actions/jobs/${resource}`;\n case 'actions_get.download_workflow_run_artifact':\n return GITHUB_ARTIFACT_DOWNLOAD_ROUTE;\n case 'actions_get.get_workflow_run_usage':\n return `GET ${repoPath}/actions/runs/${resource}/timing`;\n case 'actions_get.get_workflow_run_logs_url':\n return `GET ${repoPath}/actions/runs/${resource}/logs`;\n case 'actions_run_trigger.run_workflow':\n return `POST ${repoPath}/actions/workflows/{workflow_id}/dispatches`;\n case 'actions_run_trigger.rerun_workflow_run':\n return `POST ${repoPath}/actions/runs/${run}/rerun`;\n case 'actions_run_trigger.rerun_failed_jobs':\n return `POST ${repoPath}/actions/runs/${run}/rerun-failed-jobs`;\n case 'actions_run_trigger.cancel_workflow_run':\n return `POST ${repoPath}/actions/runs/${run}/cancel`;\n case 'actions_run_trigger.delete_workflow_run_logs':\n return `DELETE ${repoPath}/actions/runs/${run}/logs`;\n case 'get_job_logs.':\n return `GET ${repoPath}/actions/jobs/{job_id}/logs`;\n default:\n return undefined;\n }\n}\n\nasync function addCommentToPendingReview(\n client: GithubToolClient,\n args: Record<string, unknown>,\n): Promise<unknown | undefined> {\n if (client.graphql === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub client does not support GraphQL operations',\n );\n }\n\n const review = await latestPendingReview(client, args, 'nodeId');\n if (review === undefined) return undefined;\n if (review.nodeId === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pending pull request review did not include a node ID',\n );\n }\n\n const input: Record<string, unknown> = {\n pullRequestReviewId: review.nodeId,\n path: args.path,\n body: args.body,\n subjectType: args.subject_type,\n };\n if (args.line !== undefined) input.line = args.line;\n if (args.side !== undefined) input.side = args.side;\n if (args.start_line !== undefined) input.startLine = args.start_line;\n if (args.start_side !== undefined) input.startSide = args.start_side;\n\n return await client.graphql(ADD_PENDING_REVIEW_COMMENT_MUTATION, {input});\n}\n\nasync function executeGithubGraphqlOperation(\n client: GithubToolClient,\n toolId: GithubAgentToolId,\n method: string | undefined,\n parameters: Record<string, unknown>,\n): Promise<unknown | undefined> {\n if (client.graphql === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub client does not support GraphQL operations',\n );\n }\n\n switch (`${toolId}.${method ?? ''}`) {\n case 'pull_request_read.get_review_threads': {\n const variables: Record<string, unknown> = {\n owner: parameters.owner,\n repo: parameters.repo,\n pullNumber: parameters.pull_number,\n };\n if (typeof parameters.cursor === 'string') variables.after = parameters.cursor;\n return await client.graphql(GET_PULL_REQUEST_REVIEW_THREADS_QUERY, variables);\n }\n case 'pull_request_review_thread_write.resolve':\n return await client.graphql(RESOLVE_PULL_REQUEST_REVIEW_THREAD_MUTATION, {\n input: {threadId: parameters.thread_id},\n });\n case 'add_comment_to_pending_review.':\n return await addCommentToPendingReview(client, parameters);\n default:\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub operation does not support GraphQL operations',\n );\n }\n}\n\nexport function projectGithubOperationParameters(\n toolId: GithubAgentToolId,\n method: string | undefined,\n args: Record<string, unknown>,\n): Record<string, unknown> {\n const parameters = {...args};\n if (toolId === 'add_issue_comment' && parameters.reaction !== undefined) {\n parameters.content = parameters.reaction;\n delete parameters.reaction;\n if (parameters.body === undefined) delete parameters.body;\n }\n if (toolId === 'pull_request_read' && method === 'get_diff') {\n parameters.headers = {accept: 'application/vnd.github.diff'};\n }\n return parameters;\n}\n\nasync function resolvePendingReviewParameters(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n toolId: GithubAgentToolId,\n method: string | undefined,\n): Promise<Record<string, unknown> | undefined> {\n if (!isPendingReviewOperation(toolId, method)) return parameters;\n\n const review = await latestPendingReview(client, parameters, 'id');\n if (review === undefined) return undefined;\n if (review.id === undefined) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pending pull request review did not include a numeric ID',\n );\n }\n return {...parameters, review_id: review.id};\n}\n\nfunction isPendingReviewOperation(toolId: GithubAgentToolId, method: string | undefined): boolean {\n return (\n toolId === 'pull_request_review_write' &&\n (method === 'submit_pending' || method === 'delete_pending')\n );\n}\n\ninterface PendingReviewReference {\n id?: number | undefined;\n nodeId?: string | undefined;\n}\n\ntype PendingReviewIdentifier = keyof PendingReviewReference;\n\ninterface PendingReviewPageResult {\n malformed: boolean;\n review?: PendingReviewReference | undefined;\n}\n\nasync function latestPendingReview(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n requiredIdentifier: PendingReviewIdentifier,\n): Promise<PendingReviewReference | undefined> {\n const lookupController = new AbortController();\n const lookupTimeout = setTimeout(\n () => lookupController.abort(),\n PENDING_REVIEW_LOOKUP_TIMEOUT_MS,\n );\n\n try {\n return await latestPendingReviewBeforeDeadline(\n client,\n parameters,\n requiredIdentifier,\n lookupController.signal,\n );\n } finally {\n clearTimeout(lookupTimeout);\n }\n}\n\nasync function latestPendingReviewBeforeDeadline(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n requiredIdentifier: PendingReviewIdentifier,\n lookupSignal: AbortSignal,\n): Promise<PendingReviewReference | undefined> {\n const firstPage = await requestPendingReviewPage(client, parameters, 1, lookupSignal);\n const lastPage = pendingReviewLastPage(firstPage.headers);\n let requests = 1;\n let malformed = false;\n\n for (let page = lastPage; page >= 1; page -= 1) {\n let response = firstPage;\n if (page !== 1) {\n if (requests >= PENDING_REVIEW_MAX_PAGE_REQUESTS) {\n throw new GithubIntegrationProviderError(\n 'content-too-large',\n 'GitHub pull request review history exceeded the pending review lookup limit',\n );\n }\n response = await requestPendingReviewPage(client, parameters, page, lookupSignal);\n requests += 1;\n }\n if (!Array.isArray(response.data)) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pull request review list response was malformed',\n );\n }\n\n const result = latestPendingReviewOnPage(response.data, requiredIdentifier);\n if (result.review !== undefined) return result.review;\n malformed ||= result.malformed;\n }\n\n if (malformed) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n requiredIdentifier === 'nodeId'\n ? 'GitHub pending pull request review did not include a node ID'\n : 'GitHub pending pull request review did not include a numeric ID',\n );\n }\n return undefined;\n}\n\nasync function requestPendingReviewPage(\n client: GithubToolClient,\n parameters: Record<string, unknown>,\n page: number,\n lookupSignal: AbortSignal,\n): Promise<GithubToolResponse> {\n const pageController = new AbortController();\n const abortPage = () => pageController.abort();\n if (lookupSignal.aborted) abortPage();\n else lookupSignal.addEventListener('abort', abortPage, {once: true});\n const pageTimeout = setTimeout(abortPage, PENDING_REVIEW_PAGE_TIMEOUT_MS);\n\n try {\n return await client.request('GET /repos/{owner}/{repo}/pulls/{pull_number}/reviews', {\n owner: parameters.owner,\n repo: parameters.repo,\n pull_number: parameters.pull_number,\n per_page: PENDING_REVIEW_PAGE_SIZE,\n page,\n request: {signal: pageController.signal},\n });\n } finally {\n clearTimeout(pageTimeout);\n lookupSignal.removeEventListener('abort', abortPage);\n }\n}\n\nfunction pendingReviewLastPage(headers: GithubToolResponse['headers']): number {\n const link = headers?.link;\n if (typeof link !== 'string') return 1;\n const lastLink = link.split(',').find((part) => part.includes('rel=\"last\"'));\n if (lastLink === undefined) return 1;\n const match = PENDING_REVIEW_PAGE_PATTERN.exec(lastLink);\n const page = match?.[1] === undefined ? Number.NaN : Number.parseInt(match[1], 10);\n if (!Number.isSafeInteger(page) || page < 1) {\n throw new GithubIntegrationProviderError(\n 'malformed-provider-response',\n 'GitHub pull request review pagination response was malformed',\n );\n }\n return page;\n}\n\nfunction latestPendingReviewOnPage(\n data: readonly unknown[],\n requiredIdentifier: PendingReviewIdentifier,\n): PendingReviewPageResult {\n let malformed = false;\n const appLogin = githubAppBotLogin().toLowerCase();\n for (let index = data.length - 1; index >= 0; index -= 1) {\n const review = data[index];\n if (!isRecord(review) || review.state !== 'PENDING') continue;\n const userLogin = isRecord(review.user) ? review.user.login : undefined;\n if (typeof userLogin !== 'string' || userLogin.trim().length === 0) {\n malformed = true;\n continue;\n }\n if (userLogin.trim().toLowerCase() !== appLogin) continue;\n const id =\n typeof review.id === 'number' && Number.isSafeInteger(review.id) && review.id > 0\n ? review.id\n : undefined;\n const nodeId =\n typeof review.node_id === 'string' && review.node_id.trim().length > 0\n ? review.node_id.trim()\n : undefined;\n const reference = {id, nodeId};\n if (reference[requiredIdentifier] !== undefined) return {malformed, review: reference};\n malformed = true;\n }\n\n return {malformed};\n}\n\nfunction githubAppBotLogin(): string {\n const configuredUsername = config.GITHUB_APP_USERNAME?.trim() || config.GITHUB_APP_SLUG.trim();\n return configuredUsername.toLowerCase().endsWith(GITHUB_APP_BOT_SUFFIX)\n ? configuredUsername\n : `${configuredUsername}${GITHUB_APP_BOT_SUFFIX}`;\n}\n\nfunction githubToolResult(\n toolId: GithubAgentToolId,\n data: unknown,\n response?: GithubToolResponse,\n parameters?: Record<string, unknown>,\n route?: string,\n): GithubToolCallResult {\n const structuredContent = projectGithubToolOutput(toolId, data, response, parameters, route);\n if (structuredContent === undefined) {\n return githubToolError(\n 'GitHub artifact download did not return a download URL',\n 'malformed-provider-response',\n );\n }\n return {\n content: [{type: 'text', text: JSON.stringify(structuredContent)}],\n structuredContent,\n };\n}\n\nfunction projectGithubToolOutput(\n toolId: GithubAgentToolId,\n data: unknown,\n response?: GithubToolResponse,\n parameters?: Record<string, unknown>,\n route?: string,\n): Record<string, unknown> | undefined {\n if (route === GITHUB_ARTIFACT_DOWNLOAD_ROUTE) {\n return projectGithubArtifactDownloadOutput(response, parameters);\n }\n\n switch (toolId) {\n case 'list_issue_types':\n return {issue_types: data};\n case 'list_issues':\n return {issues: data};\n case 'search_issues':\n return {issues: githubSearchItems(data)};\n case 'list_pull_requests':\n return {pull_requests: data};\n case 'search_pull_requests':\n return {pull_requests: githubSearchItems(data)};\n case 'create_pull_request':\n case 'update_pull_request':\n return {pull_request: data};\n case 'merge_pull_request':\n return {merge: data};\n default:\n return isRecord(data) ? data : {result: data};\n }\n}\n\nfunction projectGithubArtifactDownloadOutput(\n response: GithubToolResponse | undefined,\n parameters: Record<string, unknown> | undefined,\n): Record<string, unknown> | undefined {\n if (response === undefined) return undefined;\n const downloadUrl = response.headers?.location;\n if (typeof downloadUrl !== 'string' || downloadUrl.length === 0) return undefined;\n\n const output: Record<string, unknown> = {\n archive_format: GITHUB_ARTIFACT_ARCHIVE_FORMAT,\n download_url: downloadUrl,\n };\n if (typeof parameters?.resource_id === 'string') output.artifact_id = parameters.resource_id;\n\n const contentType = response.headers?.['content-type'];\n if (typeof contentType === 'string') output.content_type = contentType;\n\n const contentLength = response.headers?.['content-length'];\n const sizeBytes = typeof contentLength === 'number' ? contentLength : Number(contentLength);\n if (Number.isSafeInteger(sizeBytes) && sizeBytes >= 0) output.size_bytes = sizeBytes;\n\n return output;\n}\n\nfunction githubSearchItems(data: unknown): unknown {\n return isRecord(data) ? data.items : data;\n}\n\nfunction githubToolError(message: string, code: GithubToolErrorCode): GithubToolCallResult {\n return {\n isError: true,\n content: [{type: 'text', text: message}],\n structuredContent: {code},\n };\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction validateGithubToolArguments(\n tool: AgentToolCatalogEntry<GithubAgentToolRequiredScope>,\n arguments_: Record<string, unknown>,\n): string | undefined {\n const required = Array.isArray(tool.inputSchema.required) ? tool.inputSchema.required : [];\n for (const name of required) {\n if (typeof name === 'string' && arguments_[name] === undefined) {\n return `Missing required parameter: ${name}`;\n }\n }\n\n const methodRequired = methodRequiredParameters(tool.inputSchema, arguments_);\n for (const name of methodRequired) {\n if (arguments_[name] === undefined) return `Missing required parameter: ${name}`;\n }\n\n const properties = tool.inputSchema.properties;\n if (typeof properties !== 'object' || properties === null || Array.isArray(properties)) {\n return undefined;\n }\n const propertySchemas = properties as Record<string, unknown>;\n for (const [name, value] of Object.entries(arguments_)) {\n const schema = propertySchemas[name];\n if (typeof schema !== 'object' || schema === null || Array.isArray(schema)) continue;\n const type = (schema as {type?: unknown}).type;\n if (type === 'integer' && (!Number.isInteger(value) || typeof value !== 'number')) {\n return `Parameter ${name} must be an integer`;\n }\n if (type === 'array' && !Array.isArray(value)) return `Parameter ${name} must be an array`;\n }\n return undefined;\n}\n\nfunction methodRequiredParameters(\n inputSchema: AgentToolCatalogEntry<GithubAgentToolRequiredScope>['inputSchema'],\n arguments_: Record<string, unknown>,\n): string[] {\n const method = arguments_.method;\n if (typeof method !== 'string' || !Array.isArray(inputSchema.oneOf)) return [];\n\n for (const candidate of inputSchema.oneOf) {\n if (!isRecord(candidate) || !isRecord(candidate.properties)) continue;\n const methodSchema = candidate.properties.method;\n if (!isRecord(methodSchema) || methodSchema.const !== method) continue;\n return Array.isArray(candidate.required)\n ? candidate.required.filter((name): name is string => typeof name === 'string')\n : [];\n }\n\n return [];\n}\n\nfunction hasGrantedPermissions(\n granted: Record<string, 'read' | 'write' | 'admin'>,\n tool: AgentToolCatalogEntry<GithubAgentToolRequiredScope>,\n call: AgentToolCallInput,\n): boolean {\n const method = typeof call.arguments.method === 'string' ? call.arguments.method : undefined;\n const required =\n tool.methods?.find((candidate) => candidate.id === method)?.requiredScope ?? tool.requiredScope;\n return required.every(({permission, access}) => {\n const actual = granted[permission];\n return actual === 'write' || actual === 'admin' || actual === access;\n });\n}\n"],"names":["Octokit","mapGithubError","createGithubInstallationTokenProvider","config","normalizedGithubApiBaseUrl","GithubIntegrationProviderError","githubAgentToolCatalog","githubAgentToolSelectionCatalog","buildGithubAgentToolSelectionCatalog","DEFAULT_JOB_LOG_TAIL_LINES","GITHUB_GRAPHQL_ROUTE","GITHUB_ARTIFACT_ARCHIVE_FORMAT","GITHUB_ARTIFACT_DOWNLOAD_ROUTE","GITHUB_ARTIFACT_DOWNLOAD_TIMEOUT_MS","GITHUB_APP_BOT_SUFFIX","PENDING_REVIEW_PAGE_SIZE","PENDING_REVIEW_MAX_PAGE_REQUESTS","PENDING_REVIEW_LOOKUP_TIMEOUT_MS","PENDING_REVIEW_PAGE_TIMEOUT_MS","PENDING_REVIEW_PAGE_PATTERN","NO_PENDING_REVIEW_MESSAGE","ADD_PENDING_REVIEW_COMMENT_MUTATION","GET_PULL_REQUEST_REVIEW_THREADS_QUERY","RESOLVE_PULL_REQUEST_REVIEW_THREAD_MUTATION","GithubAgentToolsProvider","options","tokenProvider","catalog","selectionCatalog","openSession","input","installation","getInstallationByConnectionId","connection","id","installationId","Number","isSafeInteger","tokenPromise","call","tool","tools","find","candidate","toolId","githubToolError","operation","resolveGithubOperation","undefined","validationError","validateGithubToolArguments","arguments","getInstallationAccessToken","token","hasGrantedPermissions","permissions","client","createClient","createOctokitClient","method","kind","data","executeGithubGraphqlOperation","parameters","githubToolResult","operationParameters","resolvePendingReviewParameters","response","request","route","octokit","auth","baseUrl","retry","enabled","abortController","AbortController","timeout","setTimeout","abort","redirect","parseSuccessResponseBody","signal","clearTimeout","graphql","query","variables","args","params","methods","some","githubOperationRoute","projectGithubOperationParameters","owner","repo","issue","pull","run","resource","repoPath","comment_id","reaction","body","addCommentToPendingReview","review","latestPendingReview","nodeId","pullRequestReviewId","path","subjectType","subject_type","line","side","start_line","startLine","start_side","startSide","pullNumber","pull_number","cursor","after","threadId","thread_id","content","headers","accept","isPendingReviewOperation","review_id","requiredIdentifier","lookupController","lookupTimeout","latestPendingReviewBeforeDeadline","lookupSignal","firstPage","requestPendingReviewPage","lastPage","pendingReviewLastPage","requests","malformed","page","Array","isArray","result","latestPendingReviewOnPage","pageController","abortPage","aborted","addEventListener","once","pageTimeout","per_page","removeEventListener","link","lastLink","split","part","includes","match","exec","NaN","parseInt","appLogin","githubAppBotLogin","toLowerCase","index","length","isRecord","state","userLogin","user","login","trim","node_id","reference","configuredUsername","GITHUB_APP_USERNAME","GITHUB_APP_SLUG","endsWith","structuredContent","projectGithubToolOutput","type","text","JSON","stringify","projectGithubArtifactDownloadOutput","issue_types","issues","githubSearchItems","pull_requests","pull_request","merge","downloadUrl","location","output","archive_format","download_url","resource_id","artifact_id","contentType","content_type","contentLength","sizeBytes","size_bytes","items","message","code","isError","value","arguments_","required","inputSchema","name","methodRequired","methodRequiredParameters","properties","propertySchemas","Object","entries","schema","isInteger","oneOf","methodSchema","const","filter","granted","requiredScope","every","permission","access","actual"],"mappings":"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"}
@@ -41,7 +41,7 @@ export interface GithubAgentToolCatalogEntry extends AgentToolCatalogEntry<Githu
41
41
  category: GithubAgentToolCategory;
42
42
  methods?: readonly GithubAgentToolCatalogMethod[] | undefined;
43
43
  }
44
- export declare const githubAgentToolCatalog: readonly [GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry];
44
+ export declare const githubAgentToolCatalog: readonly [GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry, GithubAgentToolCatalogEntry];
45
45
  export type GithubAgentToolId = (typeof githubAgentToolCatalog)[number]['id'];
46
46
  export declare function buildGithubAgentToolSelectionCatalog(catalog: readonly GithubAgentToolCatalogEntry[]): AgentToolSelectionCatalog;
47
47
  export declare const githubAgentToolSelectionCatalog: AgentToolSelectionCatalog;
@@ -1 +1 @@
1
- {"version":3,"file":"github-agent-tool-catalog.d.ts","sourceRoot":"","sources":["../../src/core/github-agent-tool-catalog.ts"],"names":[],"mappings":"AAAA,KAAK,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC;AAC7C,KAAK,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,UAAU,sBAAsB,CAAC,aAAa,GAAG,OAAO;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,oBAAoB,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,UAAU,qBAAqB,CAAC,aAAa,GAAG,OAAO;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,oBAAoB,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,YAAY,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,EAAE,SAAS,sBAAsB,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,CAAC;CACxE;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,QAAQ,GAAG,YAAY,CAAC;IACtE,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,yBAAyB;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,eAAe,GAAG,SAAS,CAAC;AAC7E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,eAAe,CAAC;AAC5F,MAAM,MAAM,+BAA+B,GAAG,MAAM,GAAG,OAAO,CAAC;AAC/D,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,iCAAiC;IAChD,UAAU,EAAE,yBAAyB,CAAC;IACtC,MAAM,EAAE,+BAA+B,CAAC;CACzC;AAED,MAAM,MAAM,4BAA4B,GAAG,SAAS,iCAAiC,EAAE,CAAC;AAExF,MAAM,MAAM,4BAA4B,GAAG,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;AAEhG,MAAM,WAAW,2BACf,SAAQ,qBAAqB,CAAC,4BAA4B,CAAC;IAC3D,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,CAAC,EAAE,SAAS,4BAA4B,EAAE,GAAG,SAAS,CAAC;CAC/D;AAsOD,eAAO,MAAM,sBAAsB,4mBAqfwB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAE9E,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,SAAS,2BAA2B,EAAE,GAC9C,yBAAyB,CAoC3B;AAED,eAAO,MAAM,+BAA+B,2BACkB,CAAC"}
1
+ {"version":3,"file":"github-agent-tool-catalog.d.ts","sourceRoot":"","sources":["../../src/core/github-agent-tool-catalog.ts"],"names":[],"mappings":"AAAA,KAAK,oBAAoB,GAAG,MAAM,GAAG,OAAO,CAAC;AAC7C,KAAK,mBAAmB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAEnD,UAAU,sBAAsB,CAAC,aAAa,GAAG,OAAO;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,oBAAoB,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;CAC9B;AAED,UAAU,qBAAqB,CAAC,aAAa,GAAG,OAAO;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,oBAAoB,CAAC;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,aAAa,EAAE,aAAa,CAAC;IAC7B,WAAW,EAAE,mBAAmB,CAAC;IACjC,YAAY,CAAC,EAAE,mBAAmB,GAAG,SAAS,CAAC;IAC/C,OAAO,CAAC,EAAE,SAAS,sBAAsB,CAAC,aAAa,CAAC,EAAE,GAAG,SAAS,CAAC;CACxE;AAED,UAAU,iBAAiB;IACzB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,QAAQ,GAAG,iBAAiB,GAAG,QAAQ,GAAG,YAAY,CAAC;IACtE,QAAQ,CAAC,WAAW,EAAE,oBAAoB,CAAC;IAC3C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED,UAAU,yBAAyB;IACjC,QAAQ,CAAC,SAAS,EAAE,SAAS,iBAAiB,EAAE,CAAC;CAClD;AAED,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAE9C,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,eAAe,GAAG,SAAS,CAAC;AAC7E,MAAM,MAAM,yBAAyB,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,eAAe,CAAC;AAC5F,MAAM,MAAM,+BAA+B,GAAG,MAAM,GAAG,OAAO,CAAC;AAC/D,MAAM,MAAM,0BAA0B,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1D,MAAM,WAAW,iCAAiC;IAChD,UAAU,EAAE,yBAAyB,CAAC;IACtC,MAAM,EAAE,+BAA+B,CAAC;CACzC;AAED,MAAM,MAAM,4BAA4B,GAAG,SAAS,iCAAiC,EAAE,CAAC;AAExF,MAAM,MAAM,4BAA4B,GAAG,sBAAsB,CAAC,4BAA4B,CAAC,CAAC;AAEhG,MAAM,WAAW,2BACf,SAAQ,qBAAqB,CAAC,4BAA4B,CAAC;IAC3D,QAAQ,EAAE,uBAAuB,CAAC;IAClC,OAAO,CAAC,EAAE,SAAS,4BAA4B,EAAE,GAAG,SAAS,CAAC;CAC/D;AAuPD,eAAO,MAAM,sBAAsB,yoBAugBwB,CAAC;AAE5D,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,sBAAsB,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;AAE9E,wBAAgB,oCAAoC,CAClD,OAAO,EAAE,SAAS,2BAA2B,EAAE,GAC9C,yBAAyB,CAoC3B;AAED,eAAO,MAAM,+BAA+B,2BACkB,CAAC"}
@@ -83,6 +83,7 @@ const pullRequestReadMethods = [
83
83
  method('get_files', 'Get files changed in a specific pull request.', 'read', false, scopes.pullRequestsRead),
84
84
  method('get_commits', 'Get commits in a specific pull request.', 'read', false, scopes.pullRequestsRead),
85
85
  method('get_review_comments', 'Get review comments for a specific pull request.', 'read', false, scopes.pullRequestsRead),
86
+ method('get_review_threads', 'Get review threads, their resolution state, and comments for a specific pull request.', 'read', false, scopes.pullRequestsRead),
86
87
  method('get_reviews', 'Get reviews for a specific pull request.', 'read', false, scopes.pullRequestsRead),
87
88
  method('get_comments', 'Get conversation comments for a specific pull request.', 'read', false, scopes.issuesRead),
88
89
  method('get_check_runs', 'Get check runs for the head commit of a pull request.', 'read', false, scopes.pullRequestsRead)
@@ -92,6 +93,9 @@ const pullRequestReviewWriteMethods = [
92
93
  method('submit_pending', 'Submit the latest pending pull request review.', 'write', false, scopes.pullRequestsWrite),
93
94
  method('delete_pending', 'Delete the latest pending pull request review.', 'write', false, scopes.pullRequestsWrite)
94
95
  ];
96
+ const pullRequestReviewThreadWriteMethods = [
97
+ method('resolve', 'Resolve a pull request review thread.', 'write', false, scopes.pullRequestsWrite)
98
+ ];
95
99
  const actionsListMethods = [
96
100
  method('list_workflows', 'List workflows in a repository.', 'read', false, scopes.actionsRead),
97
101
  method('list_workflow_runs', 'List workflow runs in a repository or for a workflow.', 'read', false, scopes.actionsRead),
@@ -338,6 +342,7 @@ export const githubAgentToolCatalog = [
338
342
  methodRequiredSchema('get_files', []),
339
343
  methodRequiredSchema('get_commits', []),
340
344
  methodRequiredSchema('get_review_comments', []),
345
+ methodRequiredSchema('get_review_threads', []),
341
346
  methodRequiredSchema('get_reviews', []),
342
347
  methodRequiredSchema('get_comments', []),
343
348
  methodRequiredSchema('get_check_runs', [
@@ -572,6 +577,20 @@ export const githubAgentToolCatalog = [
572
577
  ]),
573
578
  outputSchema: openObjectSchema('Pull request review write result')
574
579
  }),
580
+ tool({
581
+ id: 'pull_request_review_thread_write',
582
+ category: 'pull_requests',
583
+ description: 'Resolve review threads on a pull request in a GitHub repository.',
584
+ methods: pullRequestReviewThreadWriteMethods,
585
+ inputSchema: repositoryInputSchema({
586
+ method: methodSchema(pullRequestReviewThreadWriteMethods, 'The write operation to perform on a pull request review thread'),
587
+ thread_id: stringSchema('The node ID of the review thread')
588
+ }, [
589
+ 'method',
590
+ 'thread_id'
591
+ ]),
592
+ outputSchema: openObjectSchema('Pull request review thread write result')
593
+ }),
575
594
  tool({
576
595
  id: 'add_comment_to_pending_review',
577
596
  category: 'pull_requests',