Added github repo block and tool

This commit is contained in:
Waleed Latif
2025-02-03 13:32:23 -08:00
parent b67494eeef
commit a47c50c61e
5 changed files with 167 additions and 3 deletions

59
blocks/blocks/github.ts Normal file
View File

@@ -0,0 +1,59 @@
import { GithubIcon } from '../../components/icons'
import { BlockConfig } from '../types'
import { RepoInfoResponse } from '@/tools/github/repo'
export const GitHubBlock: BlockConfig<RepoInfoResponse> = {
type: 'github_repo_info',
toolbar: {
title: 'GitHub Repository Info',
description: 'Fetch GitHub repository information and metadata',
bgColor: '#ffffff',
icon: GithubIcon,
category: 'advanced',
},
tools: {
access: ['github.repoinfo']
},
workflow: {
inputs: {
owner: { type: 'string', required: true },
repo: { type: 'string', required: true }
},
outputs: {
response: {
type: {
name: 'string',
description: 'string',
stars: 'number',
forks: 'number',
openIssues: 'number',
language: 'string'
}
}
},
subBlocks: [
{
id: 'owner',
title: 'Repository Owner',
type: 'short-input',
layout: 'half',
placeholder: 'e.g., microsoft',
},
{
id: 'repo',
title: 'Repository Name',
type: 'short-input',
layout: 'half',
placeholder: 'e.g., vscode',
},
{
id: 'apiKey',
title: 'GitHub Token',
type: 'short-input',
layout: 'full',
placeholder: 'Enter GitHub Token',
password: true
}
],
},
}

View File

@@ -9,6 +9,7 @@ import { FirecrawlScrapeBlock } from './blocks/firecrawl'
import { JinaBlock } from './blocks/jina'
import { TranslateBlock } from './blocks/translate'
import { SlackMessageBlock } from './blocks/slack'
import { GitHubBlock } from './blocks/github'
// Export blocks for ease of use
export {
@@ -19,7 +20,8 @@ export {
FirecrawlScrapeBlock,
JinaBlock,
TranslateBlock,
SlackMessageBlock
SlackMessageBlock,
GitHubBlock
}
// Registry of all block configurations
@@ -31,7 +33,8 @@ const blocks: Record<string, BlockConfig> = {
firecrawl_scrape: FirecrawlScrapeBlock,
jina_reader: JinaBlock,
translate: TranslateBlock,
slack_message: SlackMessageBlock
slack_message: SlackMessageBlock,
github_repo_info: GitHubBlock
}
// Build a reverse mapping of tools to block types

View File

@@ -993,3 +993,16 @@ export const SlackIcon = (props: SVGProps<SVGSVGElement>) => (
</svg>
)
export const GithubIcon = (props: SVGProps<SVGSVGElement>) => (
<svg
role="img"
viewBox="0 0 24 24"
xmlns="http://www.w3.org/2000/svg"
{...props}
>
<title>GitHub</title>
<path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/>
</svg>
)

86
tools/github/repo.ts Normal file
View File

@@ -0,0 +1,86 @@
import { ToolConfig, ToolResponse } from '../types'
export interface RepoInfoParams {
owner: string
repo: string
apiKey?: string
}
export interface RepoInfoResponse extends ToolResponse {
output: {
name: string
description: string
stars: number
forks: number
openIssues: number
language: string
}
}
export const repoInfoTool: ToolConfig<RepoInfoParams, RepoInfoResponse> = {
id: 'github.repoinfo',
name: 'GitHub Repository Info',
description: 'Fetch detailed information about a GitHub repository',
version: '1.0.0',
params: {
owner: {
type: 'string',
required: true,
description: 'Repository owner (user or organization)'
},
repo: {
type: 'string',
required: true,
description: 'Repository name'
},
apiKey: {
type: 'string',
description: 'GitHub Personal Access Token'
}
},
request: {
url: (params: RepoInfoParams) =>
`https://api.github.com/repos/${params.owner}/${params.repo}`,
method: 'GET',
headers: (params: RepoInfoParams) => ({
'Accept': 'application/vnd.github+json',
'Authorization': params.apiKey ? `Bearer ${params.apiKey}` : '',
'X-GitHub-Api-Version': '2022-11-28'
})
},
transformResponse: async (response: Response) => {
if (!response.ok) {
throw new Error(`GitHub API error: ${response.statusText}`)
}
const data = await response.json()
return {
success: true,
output: {
name: data.name,
description: data.description || '',
stars: data.stargazers_count,
forks: data.forks_count,
openIssues: data.open_issues_count,
language: data.language || 'Not specified'
}
}
},
transformError: (error) => {
if (error instanceof Error) {
if (error.message.includes('404')) {
return 'Repository not found. Please check the owner and repository name.'
}
if (error.message.includes('401')) {
return 'Authentication failed. Please check your GitHub token.'
}
return error.message
}
return 'Failed to fetch repository information'
}
}

View File

@@ -13,6 +13,7 @@ import { visionTool as crewAIVision } from './crewai/vision'
import { scrapeTool } from './firecrawl/scrape'
import { readUrlTool } from './jina/reader'
import { slackMessageTool } from './slack/message'
import { repoInfoTool } from './github/repo'
// Registry of all available tools
export const tools: Record<string, ToolConfig> = {
@@ -37,7 +38,9 @@ export const tools: Record<string, ToolConfig> = {
// Jina Tools
'jina.readurl': readUrlTool,
// Slack Tools
'slack.message': slackMessageTool
'slack.message': slackMessageTool,
// GitHub Tools
'github.repoinfo': repoInfoTool
}
// Get a tool by its ID