### Why / What / How **Why:** We have GitHub trigger and repo/issue/PR blocks, but no way for agents to work with the user's GitHub notification inbox — e.g. inbox-zero automations, notification triage, or surfacing review requests. GitHub's Notifications API is poll-only (no webhook events exist for it), so inbox automations run as scheduled graphs using regular blocks. **What:** Adds six blocks covering the [GitHub Notifications REST API](https://docs.github.com/en/rest/activity/notifications): listing notifications and getting / marking read / marking done / unsubscribing from notification threads, plus mark-all-as-read. Also adds a `GithubGetUserInfoBlock` and extends `GithubListPRReviewersBlock` with review status info, enabling agents to determine whether the account's user is (still) involved in a PR (example use case: auto-archiving stale review-request notifications). **How:** New `notifications.py` in the GitHub blocks package, following the existing block conventions there. Notification endpoints live under `/notifications` rather than `/repos/...`, so the blocks use `get_api(credentials, convert_urls=False)` with absolute URLs. API responses are normalized into a shared `NotificationItem` shape whose `thread_id` chains into the per-thread blocks and whose `subject_url` is converted best-effort from the API URL to the corresponding github.com page URL. Notification blocks use the minimal `notifications` OAuth scope. ### Changes 🏗️ - Add `GithubListNotificationsBlock`: lists the inbox with include-read / participating-only / `since` / `before` filters and optional repo scoping; yields the full list plus each notification individually - Add `GithubGetNotificationThreadBlock`: fetches one thread and exposes title, reason, unread, subject type/URL, and repository as separate outputs - Add `GithubMarkNotificationsAsReadBlock`: marks all notifications as read, optionally repo-scoped, with optional `last_read_at` cutoff - Add `GithubMarkNotificationThreadAsReadBlock` and `GithubMarkNotificationThreadAsDoneBlock`: per-thread read / done - Add `GithubUnsubscribeNotificationThreadBlock`: mutes a thread - Add `GithubGetUserInfoBlock`: fetches info on a given user, or the authenticated user if no username is given - Extend `GithubListPRReviewersBlock`: new `include_past_reviewers` toggle (default off) to also list users who already submitted a review, plus `review_requested` / `has_reviewed` / `review_state` fields on each reviewer item; the extra API call is gated behind the toggle so existing graphs are unaffected - Refactor: hoist `GITHUB_API_URL` constant into `_api.py` and reuse it ### Checklist 📋 #### For code changes: - [x] I have clearly listed my changes in the PR description - [x] I have made a test plan - [x] I have tested my changes according to the test plan: - [x] `poetry run pytest backend/blocks/test/test_block.py` — full block suite passes, including schema validation + mocked execution of all new/changed blocks - [x] `poetry run pytest backend/blocks/github/test_github_blocks.py` — passes - [ ] Live-run the List / Mark as read blocks against a real GitHub account (not done — mocked execution only) <details> <summary>Example test plan</summary> - [ ] Create from scratch and execute an agent with at least 3 blocks - [ ] Import an agent from file upload, and confirm it executes correctly - [ ] Upload agent to marketplace - [ ] Import an agent from marketplace and confirm it executes correctly - [ ] Edit an agent from monitor, and confirm it executes correctly </details> #### For configuration changes: - [x] `.env.default` is updated or already compatible with my changes - [x] `docker-compose.yml` is updated or already compatible with my changes - [x] I have included a list of my configuration changes in the PR description (under **Changes**) <details> <summary>Examples of configuration changes</summary> - Changing ports - Adding new services that need to communicate with each other - Secrets or environment variable changes - New or infrastructure changes such as databases </details> --------- Co-authored-by: Claude Fable 5 <[email protected]>
12 KiB
GitHub Issues
Blocks for managing GitHub issues including creating, reading, listing, commenting, labeling, and assigning issues programmatically.
Github Add Label
What it is
A block that adds a label to a GitHub issue or pull request for categorization and organization.
How it works
The block takes the GitHub credentials, the URL of the issue or pull request, and the label to be added as inputs. It then sends a request to the GitHub API to add the label to the specified issue or pull request.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue or pull request | str | Yes |
| label | Label to add to the issue or pull request | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the label addition failed | str |
| status | Status of the label addition operation | str |
Possible use case
Automatically categorizing issues based on their content or assigning priority labels to newly created issues.
Github Assign Issue
What it is
A block that assigns a GitHub user to an issue for task ownership and tracking.
How it works
The block takes the GitHub credentials, the URL of the issue, and the username of the person to be assigned as inputs. It then sends a request to the GitHub API to assign the specified user to the issue.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue | str | Yes |
| assignee | Username to assign to the issue | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the issue assignment failed | str |
| status | Status of the issue assignment operation | str |
Possible use case
Automatically assigning new issues to team members based on their expertise or workload.
Github Comment
What it is
A block that posts comments on GitHub issues or pull requests using the GitHub API.
How it works
The block takes the GitHub credentials, the URL of the issue or pull request, and the comment text as inputs. It then sends a request to the GitHub API to post the comment on the specified issue or pull request.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue or pull request | str | Yes |
| comment | Comment to post on the issue or pull request | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the comment posting failed | str |
| id | ID of the created comment | int |
| url | URL to the comment on GitHub | str |
Possible use case
Automating responses to issues in a GitHub repository, such as thanking contributors for their submissions or providing status updates on reported bugs.
Github List Comments
What it is
A block that retrieves all comments from a GitHub issue or pull request, including comment metadata and content.
How it works
This block retrieves all comments from a GitHub issue or pull request via the GitHub API. It authenticates using your GitHub credentials and fetches the complete comment history, returning both individual comments and a list of all comments with their metadata.
Each comment includes the comment ID, body text, author username, and a direct URL to the comment on GitHub.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue or pull request | str | Yes |
| limit | Maximum number of comments to fetch | int | No |
| since | Only include comments updated after the given ISO 8601 timestamp | str | No |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the operation failed | str |
| comment | Comments with their ID, body, user, and URL | Comment |
| comments | List of comments with their ID, body, user, and URL | List[CommentItem] |
Possible use case
Conversation Analysis: Extract all comments from an issue to analyze the discussion or generate a summary of the conversation.
Comment Monitoring: Track all responses on specific issues to monitor team communication or customer feedback.
Audit Trails: Collect comment history for compliance or documentation purposes.
Github List Issues
What it is
A block that retrieves a list of issues from a GitHub repository with their titles and URLs.
How it works
The block takes the GitHub credentials and repository URL as inputs. It then sends a request to the GitHub API to fetch the list of issues and returns their details.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| repo_url | URL of the GitHub repository | str | Yes |
| state | Only include issues in this state | "open" | "closed" | "all" | No |
| include_pull_requests | Whether to also include pull requests in the results. The GitHub API considers every pull request an issue. | bool | No |
| labels | Only include issues that have all of these labels | List[str] | No |
| limit | Maximum number of issues to fetch | int | No |
| assignee | Only include issues assigned to this user. Use 'none' for unassigned issues, or '*' for issues with any assignee. | str | No |
| creator | Only include issues created by this user | str | No |
| mentioned | Only include issues in which this user is mentioned | str | No |
| milestone | Only include issues in this milestone, by milestone number. Use 'none' for issues without a milestone, or '*' for issues with any milestone. | str | No |
| sort | What to sort the issues by | "created" | "updated" | "comments" | No |
| direction | Sort direction | "asc" | "desc" | No |
| since | Only include issues updated after the given ISO 8601 timestamp | str | No |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the operation failed | str |
| issue | Issues with their title and URL | Issue |
| issues | List of issues with their title and URL | List[IssueItem] |
Possible use case
Creating a summary of open issues for a project status report or displaying them on a project management dashboard.
Github Make Issue
What it is
A block that creates new issues on GitHub repositories with a title and body content.
How it works
The block takes the GitHub credentials, repository URL, issue title, and issue body as inputs. It then sends a request to the GitHub API to create a new issue with the provided information.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| repo_url | URL of the GitHub repository | str | Yes |
| title | Title of the issue | str | Yes |
| body | Body of the issue | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the issue creation failed | str |
| number | Number of the created issue | int |
| url | URL of the created issue | str |
Possible use case
Automatically creating issues for bug reports or feature requests submitted through an external system or form.
Github Read Issue
What it is
A block that retrieves information about a specific GitHub issue, including its title, body content, and creator.
How it works
The block takes the GitHub credentials and the issue URL as inputs. It then sends a request to the GitHub API to fetch the issue's details and returns the relevant information.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if reading the issue failed | str |
| title | Title of the issue | str |
| body | Body of the issue | str |
| user | User who created the issue | str |
Possible use case
Gathering information about reported issues for analysis or to display on a dashboard.
Github Remove Label
What it is
A block that removes a label from a GitHub issue or pull request.
How it works
The block takes the GitHub credentials, the URL of the issue or pull request, and the label to be removed as inputs. It then sends a request to the GitHub API to remove the label from the specified issue or pull request.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue or pull request | str | Yes |
| label | Label to remove from the issue or pull request | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the label removal failed | str |
| status | Status of the label removal operation | str |
Possible use case
Updating the status of issues as they progress through a workflow, such as removing a "In Progress" label when an issue is completed.
Github Unassign Issue
What it is
A block that removes a user's assignment from a GitHub issue.
How it works
The block takes the GitHub credentials, the URL of the issue, and the username of the person to be unassigned as inputs. It then sends a request to the GitHub API to remove the specified user's assignment from the issue.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| issue_url | URL of the GitHub issue | str | Yes |
| assignee | Username to unassign from the issue | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the issue unassignment failed | str |
| status | Status of the issue unassignment operation | str |
Possible use case
Automatically unassigning issues that have been inactive for a certain period or when reassigning workload among team members.
Github Update Comment
What it is
A block that updates an existing comment on a GitHub issue or pull request.
How it works
This block updates an existing comment on a GitHub issue or pull request. You can identify the comment to update using either the direct comment URL, or a combination of the issue URL and comment ID. The block sends a PATCH request to the GitHub API to replace the comment's content.
The updated comment retains its original author and timestamp context while replacing the body text with your new content.
Inputs
| Input | Description | Type | Required |
|---|---|---|---|
| comment_url | URL of the GitHub comment | str | No |
| issue_url | URL of the GitHub issue or pull request | str | No |
| comment_id | ID of the GitHub comment | str | No |
| comment | Comment to update | str | Yes |
Outputs
| Output | Description | Type |
|---|---|---|
| error | Error message if the comment update failed | str |
| id | ID of the updated comment | int |
| url | URL to the comment on GitHub | str |
Possible use case
Status Updates: Modify a pinned status comment to reflect current progress on an issue.
Bot Maintenance: Update automated bot comments with new information instead of creating duplicate comments.
Error Corrections: Fix typos or incorrect information in previously posted comments.