mirror of
https://github.com/simstudioai/sim.git
synced 2026-01-08 22:48:14 -05:00
Added github repo block and tool
This commit is contained in:
59
blocks/blocks/github.ts
Normal file
59
blocks/blocks/github.ts
Normal 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
|
||||
}
|
||||
],
|
||||
},
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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
86
tools/github/repo.ts
Normal 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'
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user