@mastra/github-signals 0.0.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.
- package/LICENSE.md +30 -0
- package/dist/index.cjs +1135 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +223 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1122 -0
- package/dist/index.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["result","subscription"],"mappings":"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","file":"index.js","sourcesContent":["import { createHash, randomUUID } from 'node:crypto';\nimport { readFile } from 'node:fs/promises';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { promisify } from 'node:util';\n\nimport type { AgentSignalInput, Agent } from '@mastra/core/agent';\nimport type { MastraDBMessage } from '@mastra/core/agent/message-list';\nimport type { Mastra } from '@mastra/core/mastra';\nimport type { StorageThreadType } from '@mastra/core/memory';\nimport type {\n InputProcessorOrWorkflow,\n OutputProcessorOrWorkflow,\n ProcessInputStepArgs,\n ProcessInputStepResult,\n ProcessOutputStepArgs,\n} from '@mastra/core/processors';\nimport { SignalProvider } from '@mastra/core/signals';\nimport { createTool } from '@mastra/core/tools';\nimport z from 'zod';\n\n// Lazy-init execFileAsync to avoid vitest mock issues when only\n// constants/types are imported from this module.\nlet _execFileAsync: ((...a: any[]) => Promise<{ stdout: string; stderr: string }>) | undefined;\nasync function execFileAsync(\n file: string,\n args: readonly string[],\n options?: { cwd?: string; signal?: AbortSignal; maxBuffer?: number },\n): Promise<{ stdout: string; stderr: string }> {\n if (!_execFileAsync) {\n const cp = await import('node:child_process');\n _execFileAsync = promisify(cp.execFile);\n }\n return _execFileAsync!(file, args, options);\n}\n\nexport const GITHUB_SUBSCRIBE_PR_TAG = 'github-subscribe-pr';\nexport const GITHUB_UNSUBSCRIBE_PR_TAG = 'github-unsubscribe-pr';\nexport const GITHUB_SYNC_STATUS_TAG = 'github-sync-status';\nexport const GITHUB_SIGNALS_METADATA_KEY = 'githubSignals';\n\nexport type GithubPRSubscription = {\n owner: string;\n repo: string;\n number: number;\n subscribedAt: string;\n updatedAt: string;\n lastSubscribeSignalId: string;\n lastSyncAt?: string;\n lastSyncStatus?: 'success' | 'error' | 'skipped';\n lastSyncError?: string;\n lastObservedGithubUpdatedAt?: string;\n lastObservedContentHash?: string;\n lastObservedThreadContentHash?: string;\n lastObservedHeadSha?: string;\n lastObservedState?: string;\n lastObservedMergeableState?: string;\n lastObservedCiState?: string;\n lastObservedReviewStateHash?: string;\n lastNotificationAt?: string;\n lastNotificationKind?: string;\n lastNotificationPriority?: 'medium' | 'high';\n lastNotificationSummary?: string;\n};\n\nexport type GithubSignalsThreadMetadata = {\n subscriptions: GithubPRSubscription[];\n subscriptionHintShown?: boolean;\n};\n\nexport type GithubPRSignalInput = number | { owner?: string; repo?: string; number: number };\nexport type GithubSubscribePRSignalInput = GithubPRSignalInput;\nexport type GithubUnsubscribePRSignalInput = GithubPRSignalInput;\n\nexport type GithubSignalsSyncInput = {\n owner: string;\n repo: string;\n number: number;\n cwd?: string;\n abortSignal?: AbortSignal;\n includeComments?: boolean;\n};\n\nexport type GithubSignalsSyncResult = {\n ok: boolean;\n stdout?: string;\n stderr?: string;\n error?: string;\n};\n\nexport type GithubPullRequestCheckSnapshot = {\n name: string;\n status?: string;\n conclusion?: string;\n workflowName?: string;\n detailsUrl?: string;\n updatedAt?: string;\n};\n\ntype GithubPullRequestCheckInput = GithubPullRequestCheckSnapshot & {\n source: 'check' | 'workflow';\n};\n\nexport type GithubPullRequestSnapshot = {\n title?: string;\n state?: string;\n htmlUrl?: string;\n githubUpdatedAt?: string;\n contentHash?: string;\n threadContentHash?: string;\n headSha?: string;\n headRef?: string;\n mergeableState?: string;\n closedAt?: string;\n mergedAt?: string;\n checks?: GithubPullRequestCheckSnapshot[];\n ciState?: 'success' | 'failure' | 'pending' | 'unknown';\n unresolvedReviewThreads?: number;\n reviewStateHash?: string;\n latestReviewThreadAt?: string;\n latestCommentAuthor?: string;\n latestCommentAuthorType?: string;\n latestCommentIsBot?: boolean;\n};\n\nexport type GithubSignalsSyncClient = {\n syncPullRequest(input: GithubSignalsSyncInput): Promise<GithubSignalsSyncResult>;\n getPullRequestSnapshot?(input: GithubSignalsSyncInput): Promise<GithubPullRequestSnapshot | undefined>;\n};\n\nexport type GithubRepository = {\n owner: string;\n repo: string;\n};\n\nexport type GithubRepositoryResolver = {\n resolveRepository(input: { cwd?: string; abortSignal?: AbortSignal }): Promise<GithubRepository | undefined>;\n};\n\nexport type GithubSignalsThreadStore = {\n getThreadById(input: { threadId: string; resourceId?: string }): Promise<StorageThreadType | null>;\n saveThread(input: { thread: StorageThreadType }): Promise<StorageThreadType>;\n};\n\nexport type GithubSignalsOptions = {\n owner?: string;\n repo?: string;\n cwd?: string;\n syncOnSubscribe?: boolean;\n pollIntervalMs?: number;\n agentId?: string;\n gitcrawlCommand?: string;\n syncClient?: GithubSignalsSyncClient;\n repositoryResolver?: GithubRepositoryResolver;\n threadStore?: GithubSignalsThreadStore;\n getNotificationStreamOptions?: GithubSignalAgentOptions['getNotificationStreamOptions'];\n};\n\nexport type GithubSubscriptionsChangedEvent = {\n threadId: string;\n resourceId: string;\n subscriptions: GithubPRSubscription[];\n};\n\ntype GithubSubscriptionsChangedHandler = (event: GithubSubscriptionsChangedEvent) => void;\n\ntype GithubPRSignal = {\n id: string;\n owner?: string;\n repo?: string;\n number: number;\n};\n\ntype GithubSignalAgent = {\n sendSignal(signal: AgentSignalInput, target: unknown): { accepted: unknown };\n sendNotificationSignal?(notification: unknown, target: unknown): { accepted?: unknown } | Promise<unknown>;\n};\n\ntype GithubNotificationStreamOptions = Record<string, unknown>;\n\ntype GithubSignalAgentOptions = {\n getNotificationStreamOptions?: (target: {\n resourceId: string;\n threadId: string;\n }) => GithubNotificationStreamOptions | Promise<GithubNotificationStreamOptions>;\n};\n\ntype GithubSignalsMastra = {\n getStorage?: () => { getStore?: (name: 'memory') => Promise<unknown> } | undefined;\n getAgentById?: (id: string) => GithubSignalAgent;\n};\n\ntype GithubToolExecuteContext = {\n agent?: {\n agentId?: string;\n threadId?: string;\n resourceId?: string;\n };\n};\n\ntype GithubToolFactory = (definition: {\n id: string;\n description: string;\n inputSchema: z.ZodTypeAny;\n execute: (\n input: { owner?: string; repo?: string; number: number },\n context?: GithubToolExecuteContext,\n ) => Promise<unknown>;\n}) => unknown;\n\nconst createGithubTool = createTool as unknown as GithubToolFactory;\n\ntype GithubOperationResult = {\n owner: string;\n repo: string;\n number: number;\n subscription?: GithubPRSubscription;\n syncResult?: GithubSignalsSyncResult;\n removed?: boolean;\n remainingSubscriptions?: number;\n alreadyProcessed?: boolean;\n};\n\ntype GithubPollingThread = {\n threadId: string;\n resourceId: string;\n agentId?: string;\n};\n\ntype GithubPollingState = GithubPollingThread & {\n timer: ReturnType<typeof setInterval>;\n running: boolean;\n};\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction readString(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction readNumber(value: unknown): number | undefined {\n if (typeof value === 'number' && Number.isInteger(value) && value > 0) return value;\n if (typeof value === 'string' && /^\\d+$/.test(value)) return Number(value);\n return undefined;\n}\n\nfunction stableJson(value: unknown): string {\n if (Array.isArray(value)) return `[${value.map(stableJson).join(',')}]`;\n if (isPlainObject(value)) {\n return `{${Object.keys(value)\n .sort()\n .map(key => `${JSON.stringify(key)}:${stableJson(value[key])}`)\n .join(',')}}`;\n }\n return JSON.stringify(value);\n}\n\nfunction snapshotHash(value: unknown): string {\n return createHash('sha256').update(stableJson(value)).digest('hex');\n}\n\nfunction resolveHomePath(path: string): string {\n return path.startsWith('~/') ? join(homedir(), path.slice(2)) : path;\n}\n\nasync function getGitcrawlDbPath(): Promise<string> {\n if (process.env.GITCRAWL_DB_PATH) return resolveHomePath(process.env.GITCRAWL_DB_PATH);\n const configPath = process.env.GITCRAWL_CONFIG_PATH ?? join(homedir(), '.config', 'gitcrawl', 'config.toml');\n try {\n const config = await readFile(resolveHomePath(configPath), 'utf8');\n const match = /^\\s*db_path\\s*=\\s*['\\\"]([^'\\\"]+)['\\\"]/m.exec(config);\n if (match?.[1]) return resolveHomePath(match[1]);\n } catch {\n // fall back to gitcrawl's default config location\n }\n return join(homedir(), '.config', 'gitcrawl', 'gitcrawl.db');\n}\n\nasync function queryGitcrawlDb<T>(sql: string): Promise<T[]> {\n const dbPath = await getGitcrawlDbPath();\n const { stdout } = await execFileAsync('sqlite3', ['-json', dbPath, sql], { maxBuffer: 10 * 1024 * 1024 });\n return JSON.parse(stdout || '[]') as T[];\n}\n\nfunction sqlString(value: string): string {\n return `'${value.replaceAll(\"'\", \"''\")}'`;\n}\n\nfunction getSignalMetadata(message: MastraDBMessage): Record<string, unknown> | undefined {\n if (message.role !== 'signal') return undefined;\n const signal = message.content.metadata?.signal;\n return isPlainObject(signal) ? signal : undefined;\n}\n\nfunction getGithubMetadata(threadMetadata: Record<string, unknown> | undefined): GithubSignalsThreadMetadata {\n const mastra = isPlainObject(threadMetadata?.mastra) ? threadMetadata.mastra : {};\n const githubSignals = isPlainObject(mastra[GITHUB_SIGNALS_METADATA_KEY]) ? mastra[GITHUB_SIGNALS_METADATA_KEY] : {};\n const rawSubscriptions = Array.isArray(githubSignals.subscriptions) ? githubSignals.subscriptions : [];\n const subscriptions: GithubPRSubscription[] = [];\n\n for (const rawSubscription of rawSubscriptions) {\n if (!isPlainObject(rawSubscription)) continue;\n const owner = readString(rawSubscription.owner);\n const repo = readString(rawSubscription.repo);\n const number = readNumber(rawSubscription.number);\n const subscribedAt = readString(rawSubscription.subscribedAt);\n const updatedAt = readString(rawSubscription.updatedAt);\n const lastSubscribeSignalId = readString(rawSubscription.lastSubscribeSignalId);\n if (!owner || !repo || !number || !subscribedAt || !updatedAt || !lastSubscribeSignalId) continue;\n subscriptions.push({\n owner,\n repo,\n number,\n subscribedAt,\n updatedAt,\n lastSubscribeSignalId,\n ...(readString(rawSubscription.lastSyncAt) ? { lastSyncAt: readString(rawSubscription.lastSyncAt)! } : {}),\n ...(rawSubscription.lastSyncStatus === 'success' ||\n rawSubscription.lastSyncStatus === 'error' ||\n rawSubscription.lastSyncStatus === 'skipped'\n ? { lastSyncStatus: rawSubscription.lastSyncStatus }\n : {}),\n ...(readString(rawSubscription.lastSyncError)\n ? { lastSyncError: readString(rawSubscription.lastSyncError)! }\n : {}),\n ...(readString(rawSubscription.lastObservedGithubUpdatedAt)\n ? { lastObservedGithubUpdatedAt: readString(rawSubscription.lastObservedGithubUpdatedAt)! }\n : {}),\n ...(readString(rawSubscription.lastObservedContentHash)\n ? { lastObservedContentHash: readString(rawSubscription.lastObservedContentHash)! }\n : {}),\n ...(readString(rawSubscription.lastObservedThreadContentHash)\n ? { lastObservedThreadContentHash: readString(rawSubscription.lastObservedThreadContentHash)! }\n : {}),\n ...(readString(rawSubscription.lastObservedHeadSha)\n ? { lastObservedHeadSha: readString(rawSubscription.lastObservedHeadSha)! }\n : {}),\n ...(readString(rawSubscription.lastObservedState)\n ? { lastObservedState: readString(rawSubscription.lastObservedState)! }\n : {}),\n ...(readString(rawSubscription.lastObservedMergeableState)\n ? { lastObservedMergeableState: readString(rawSubscription.lastObservedMergeableState)! }\n : {}),\n ...(readString(rawSubscription.lastObservedCiState)\n ? { lastObservedCiState: readString(rawSubscription.lastObservedCiState)! }\n : {}),\n ...(readString(rawSubscription.lastObservedReviewStateHash)\n ? { lastObservedReviewStateHash: readString(rawSubscription.lastObservedReviewStateHash)! }\n : {}),\n ...(readString(rawSubscription.lastNotificationAt)\n ? { lastNotificationAt: readString(rawSubscription.lastNotificationAt)! }\n : {}),\n ...(readString(rawSubscription.lastNotificationKind)\n ? { lastNotificationKind: readString(rawSubscription.lastNotificationKind)! }\n : {}),\n ...(rawSubscription.lastNotificationPriority === 'medium' || rawSubscription.lastNotificationPriority === 'high'\n ? { lastNotificationPriority: rawSubscription.lastNotificationPriority }\n : {}),\n ...(readString(rawSubscription.lastNotificationSummary)\n ? { lastNotificationSummary: readString(rawSubscription.lastNotificationSummary)! }\n : {}),\n });\n }\n\n return {\n subscriptions,\n ...(githubSignals.subscriptionHintShown === true ? { subscriptionHintShown: true } : {}),\n };\n}\n\nfunction setGithubMetadata(\n threadMetadata: Record<string, unknown> | undefined,\n githubSignals: GithubSignalsThreadMetadata,\n): Record<string, unknown> {\n const existing = threadMetadata ?? {};\n const mastra = isPlainObject(existing.mastra) ? existing.mastra : {};\n const existingGithubSignals = isPlainObject(mastra[GITHUB_SIGNALS_METADATA_KEY])\n ? mastra[GITHUB_SIGNALS_METADATA_KEY]\n : {};\n\n return {\n ...existing,\n mastra: {\n ...mastra,\n [GITHUB_SIGNALS_METADATA_KEY]: {\n ...existingGithubSignals,\n ...githubSignals,\n },\n },\n };\n}\n\nfunction getFailingChecks(snapshot: GithubPullRequestSnapshot): GithubPullRequestCheckSnapshot[] {\n return (snapshot.checks ?? []).filter(check => check.conclusion === 'failure' || check.conclusion === 'timed_out');\n}\n\nfunction getPendingChecks(snapshot: GithubPullRequestSnapshot): GithubPullRequestCheckSnapshot[] {\n return (snapshot.checks ?? []).filter(check => check.status && check.status !== 'completed');\n}\n\nfunction getPrLabel(subscription: GithubPRSubscription, snapshot?: GithubPullRequestSnapshot): string {\n const pr = `${subscription.owner}/${subscription.repo}#${subscription.number}`;\n return snapshot?.title ? `${pr}: ${snapshot.title}` : pr;\n}\n\nfunction getMergedNotificationSummary(label: string): string {\n return `${label} was merged. This thread has been automatically unsubscribed from this PR. Resubscribe if you still need updates.`;\n}\n\nfunction getCheckUpdatedTime(check: { updatedAt?: string }): number {\n const value = check.updatedAt ? Date.parse(check.updatedAt) : Number.NaN;\n return Number.isFinite(value) ? value : 0;\n}\n\nfunction getCheckKey(check: GithubPullRequestCheckSnapshot): string {\n return `${check.name || 'check'}:${check.detailsUrl || check.workflowName || ''}`;\n}\n\nexport function normalizeGithubChecksForSnapshot(input: {\n checkRows: GithubPullRequestCheckInput[];\n workflowRows: GithubPullRequestCheckInput[];\n}): GithubPullRequestCheckSnapshot[] {\n const latestCheckUpdatedAt = input.checkRows.reduce(\n (latest, check) => Math.max(latest, getCheckUpdatedTime(check)),\n 0,\n );\n const rows = [\n ...input.checkRows,\n ...input.workflowRows.filter(\n workflow => input.checkRows.length === 0 || getCheckUpdatedTime(workflow) >= latestCheckUpdatedAt,\n ),\n ];\n const byKey = new Map<string, GithubPullRequestCheckInput>();\n\n for (const row of rows) {\n const key = getCheckKey(row);\n const existing = byKey.get(key);\n if (!existing) {\n byKey.set(key, row);\n continue;\n }\n\n const rowTime = getCheckUpdatedTime(row);\n const existingTime = getCheckUpdatedTime(existing);\n if (\n rowTime > existingTime ||\n (rowTime === existingTime && existing.source === 'workflow' && row.source === 'check')\n ) {\n byKey.set(key, row);\n }\n }\n\n return [...byKey.values()]\n .map(({ source: _source, ...check }) => check)\n .sort((a, b) => `${a.name}:${a.detailsUrl ?? ''}`.localeCompare(`${b.name}:${b.detailsUrl ?? ''}`));\n}\n\nfunction isBotOnlyActivity(snapshot: GithubPullRequestSnapshot): boolean {\n return snapshot.latestCommentIsBot === true && (!snapshot.ciState || snapshot.ciState === 'unknown');\n}\n\nfunction stringifyEvidence(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value);\n } catch {\n return '';\n }\n}\n\nfunction detectPrWorkEvidence(input: {\n text?: string;\n toolCalls?: Array<{ toolName: string; args: unknown }>;\n}): { owner?: string; repo?: string; number: number } | undefined {\n const evidence = [\n input.text ?? '',\n ...(input.toolCalls ?? []).map(toolCall => `${toolCall.toolName} ${stringifyEvidence(toolCall.args)}`),\n ].join('\\n');\n if (!evidence.trim()) return undefined;\n\n const url = /github\\.com\\/([^\\s/#]+)\\/([^\\s/#]+)\\/pull\\/(\\d+)/i.exec(evidence);\n if (url?.[1] && url[2] && url[3]) return { owner: url[1], repo: url[2], number: Number(url[3]) };\n\n const repoRef = /\\b([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+)#(\\d+)\\b/.exec(evidence);\n if (repoRef?.[1] && repoRef[2] && repoRef[3])\n return { owner: repoRef[1], repo: repoRef[2], number: Number(repoRef[3]) };\n\n const ghCommand = /\\bgh\\s+(?:pr\\s+(?:view|checks|status|comment|diff|checkout)|run\\s+(?:rerun|view))\\b/i.test(\n evidence,\n );\n if (!ghCommand) return undefined;\n const numberMatch = /(?:^|\\s)#?(\\d{2,})(?:\\s|$)/.exec(evidence);\n return numberMatch?.[1] ? { number: Number(numberMatch[1]) } : undefined;\n}\n\nfunction classifyGithubActivityNotification(input: {\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n}): { kind: string; priority: 'medium' | 'high'; summary: string } | undefined {\n const pr = `${input.subscription.owner}/${input.subscription.repo}#${input.subscription.number}`;\n const label = getPrLabel(input.subscription, input.snapshot);\n if (input.snapshot.state && input.subscription.lastObservedState !== input.snapshot.state) {\n if (input.snapshot.state === 'merged')\n return {\n kind: 'pull-request-merged',\n priority: 'high',\n summary: getMergedNotificationSummary(label),\n };\n if (input.snapshot.state === 'closed')\n return { kind: 'pull-request-closed', priority: 'high', summary: `${label} was closed` };\n if (input.subscription.lastObservedState && input.snapshot.state === 'open')\n return { kind: 'pull-request-reopened', priority: 'medium', summary: `${label} was reopened` };\n }\n\n const failingChecks = getFailingChecks(input.snapshot);\n if (input.snapshot.ciState === 'failure' && input.subscription.lastObservedCiState !== 'failure') {\n const names = failingChecks\n .slice(0, 3)\n .map(check => check.name)\n .join(', ');\n return {\n kind: 'pull-request-ci-failure',\n priority: 'high',\n summary: `${pr} has failing CI${names ? `: ${names}` : ''}`,\n };\n }\n if (input.snapshot.mergeableState === 'dirty' && input.subscription.lastObservedMergeableState !== 'dirty') {\n return {\n kind: 'pull-request-conflict',\n priority: 'high',\n summary: `${pr} has merge conflicts${input.snapshot.title ? `: ${input.snapshot.title}` : ''}`,\n };\n }\n if (\n input.snapshot.mergeableState &&\n input.subscription.lastObservedMergeableState === 'dirty' &&\n input.snapshot.mergeableState !== 'dirty'\n ) {\n return {\n kind: 'pull-request-conflict-resolved',\n priority: 'medium',\n summary: `${pr} merge conflicts were resolved`,\n };\n }\n if (input.snapshot.mergeableState === 'dirty') return undefined;\n if (\n input.snapshot.ciState === 'success' &&\n input.subscription.lastObservedCiState &&\n input.subscription.lastObservedCiState !== 'success'\n ) {\n return { kind: 'pull-request-ci-recovered', priority: 'medium', summary: `${pr} CI recovered` };\n }\n if (\n input.snapshot.reviewStateHash &&\n input.subscription.lastObservedReviewStateHash &&\n input.snapshot.reviewStateHash !== input.subscription.lastObservedReviewStateHash &&\n (input.snapshot.unresolvedReviewThreads ?? 0) > 0\n ) {\n return {\n kind: 'pull-request-review-activity',\n priority: 'medium',\n summary: `${pr} has ${input.snapshot.unresolvedReviewThreads} unresolved review thread${input.snapshot.unresolvedReviewThreads === 1 ? '' : 's'}`,\n };\n }\n const pendingChecks = getPendingChecks(input.snapshot);\n if (\n input.snapshot.ciState === 'pending' &&\n input.subscription.lastObservedCiState !== 'pending' &&\n pendingChecks.length > 0\n ) {\n const names = pendingChecks\n .slice(0, 3)\n .map(check => check.name)\n .join(', ');\n return {\n kind: 'pull-request-ci-pending',\n priority: 'medium',\n summary: `${pr} has CI still running${names ? `: ${names}` : ''}`,\n };\n }\n if (input.snapshot.ciState === 'pending' && input.subscription.lastObservedCiState === 'pending') return undefined;\n if (isBotOnlyActivity(input.snapshot)) return undefined;\n return {\n kind: 'pull-request-activity',\n priority: 'medium',\n summary: `${pr} has new activity${input.snapshot.title ? `: ${input.snapshot.title}` : ''}`,\n };\n}\n\nfunction classifyGithubBaselineNotification(input: {\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n}): { kind: string; priority: 'medium' | 'high'; summary: string } {\n const pr = `${input.subscription.owner}/${input.subscription.repo}#${input.subscription.number}`;\n const failingChecks = getFailingChecks(input.snapshot);\n const reviewCount = input.snapshot.unresolvedReviewThreads ?? 0;\n const high = input.snapshot.ciState === 'failure' || input.snapshot.mergeableState === 'dirty';\n const details = [\n input.snapshot.state ? `state: ${input.snapshot.state}` : undefined,\n input.snapshot.ciState && input.snapshot.ciState !== 'unknown' ? `CI: ${input.snapshot.ciState}` : undefined,\n input.snapshot.mergeableState ? `mergeability: ${input.snapshot.mergeableState}` : undefined,\n reviewCount > 0 ? `${reviewCount} unresolved review thread${reviewCount === 1 ? '' : 's'}` : undefined,\n failingChecks.length > 0\n ? `failing: ${failingChecks\n .slice(0, 3)\n .map(check => check.name)\n .join(', ')}`\n : undefined,\n ].filter(Boolean);\n return {\n kind: 'pull-request-baseline',\n priority: high ? 'high' : 'medium',\n summary: `${pr} subscribed${input.snapshot.title ? `: ${input.snapshot.title}` : ''}${details.length ? ` (${details.join('; ')})` : ''}`,\n };\n}\n\nfunction applySnapshotCursor(subscription: GithubPRSubscription, snapshot: GithubPullRequestSnapshot): void {\n if (snapshot.githubUpdatedAt) subscription.lastObservedGithubUpdatedAt = snapshot.githubUpdatedAt;\n if (snapshot.contentHash) subscription.lastObservedContentHash = snapshot.contentHash;\n if (snapshot.threadContentHash) subscription.lastObservedThreadContentHash = snapshot.threadContentHash;\n if (snapshot.headSha) subscription.lastObservedHeadSha = snapshot.headSha;\n if (snapshot.state) subscription.lastObservedState = snapshot.state;\n if (snapshot.mergeableState) subscription.lastObservedMergeableState = snapshot.mergeableState;\n if (snapshot.ciState) subscription.lastObservedCiState = snapshot.ciState;\n if (snapshot.reviewStateHash) subscription.lastObservedReviewStateHash = snapshot.reviewStateHash;\n}\n\nfunction parseGitHubRemoteUrl(remoteUrl: string): GithubRepository | undefined {\n const trimmed = remoteUrl.trim().replace(/\\.git$/, '');\n const httpsMatch = /^https:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)$/.exec(trimmed);\n if (httpsMatch?.[1] && httpsMatch[2]) return { owner: httpsMatch[1], repo: httpsMatch[2] };\n const sshMatch = /^git@github\\.com:([^/]+)\\/([^/]+)$/.exec(trimmed);\n if (sshMatch?.[1] && sshMatch[2]) return { owner: sshMatch[1], repo: sshMatch[2] };\n return undefined;\n}\n\nexport class GitRemoteRepositoryResolver implements GithubRepositoryResolver {\n async resolveRepository(input: { cwd?: string; abortSignal?: AbortSignal }): Promise<GithubRepository | undefined> {\n try {\n const { stdout } = await execFileAsync('git', ['remote', 'get-url', 'origin'], {\n cwd: input.cwd,\n signal: input.abortSignal,\n });\n return parseGitHubRemoteUrl(stdout);\n } catch {\n return undefined;\n }\n }\n}\n\nexport class GitcrawlSyncClient implements GithubSignalsSyncClient {\n readonly #command: string;\n\n constructor(options: { command?: string } = {}) {\n this.#command = options.command ?? 'gitcrawl';\n }\n\n async syncPullRequest(input: GithubSignalsSyncInput): Promise<GithubSignalsSyncResult> {\n try {\n const args = [\n 'sync',\n `${input.owner}/${input.repo}`,\n '--numbers',\n String(input.number),\n ...(input.includeComments === false ? [] : ['--include-comments']),\n '--with',\n 'pr-details',\n '--json',\n ];\n const { stdout, stderr } = await execFileAsync(this.#command, args, {\n cwd: input.cwd,\n signal: input.abortSignal,\n maxBuffer: 10 * 1024 * 1024,\n });\n return { ok: true, stdout, stderr };\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) };\n }\n }\n\n async getPullRequestSnapshot(input: GithubSignalsSyncInput): Promise<GithubPullRequestSnapshot | undefined> {\n try {\n const { stdout } = await execFileAsync(\n this.#command,\n ['threads', `${input.owner}/${input.repo}`, '--numbers', String(input.number), '--json'],\n {\n cwd: input.cwd,\n signal: input.abortSignal,\n maxBuffer: 10 * 1024 * 1024,\n },\n );\n const parsed = JSON.parse(stdout) as { threads?: Array<Record<string, unknown>> };\n const thread = parsed.threads?.find(item => readNumber(item.number) === input.number);\n if (!thread) return undefined;\n\n const owner = sqlString(input.owner);\n const repo = sqlString(input.repo);\n const number = input.number;\n const [threadDetails] = await queryGitcrawlDb<{\n state?: string;\n closed_at_gh?: string;\n merged_at_gh?: string;\n }>(`select t.state, t.closed_at_gh, t.merged_at_gh\n from threads t\n join repositories r on r.id=t.repo_id\n where r.owner=${owner} and r.name=${repo} and t.number=${number}\n limit 1`);\n const [details] = await queryGitcrawlDb<{\n head_sha?: string;\n head_ref?: string;\n mergeable_state?: string;\n merged_at?: string;\n }>(`select d.head_sha, d.head_ref, d.mergeable_state,\n json_extract(d.raw_json, '$.merged_at') as merged_at\n from pull_request_details d\n join threads t on t.id=d.thread_id\n join repositories r on r.id=t.repo_id\n where r.owner=${owner} and r.name=${repo} and t.number=${number}\n limit 1`);\n\n const headSha = readString(details?.head_sha);\n const checkRows = await queryGitcrawlDb<{\n name?: string;\n status?: string;\n conclusion?: string;\n workflow_name?: string;\n details_url?: string;\n updated_at?: string;\n }>(`select c.name, c.status, c.conclusion, c.workflow_name, c.details_url,\n coalesce(c.completed_at, c.started_at, c.fetched_at) as updated_at\n from pull_request_checks c\n join threads t on t.id=c.thread_id\n join repositories r on r.id=t.repo_id\n where r.owner=${owner} and r.name=${repo} and t.number=${number}${headSha ? ` and json_extract(c.raw_json, '$.head_sha')=${sqlString(headSha)}` : ''}`);\n\n const workflowRows = details?.head_sha\n ? await queryGitcrawlDb<{\n workflow_name?: string;\n status?: string;\n conclusion?: string;\n html_url?: string;\n updated_at_gh?: string;\n }>(`select workflow_name, status, conclusion, html_url, updated_at_gh\n from github_workflow_runs w\n join repositories r on r.id=w.repo_id\n where r.owner=${owner} and r.name=${repo} and w.head_sha=${sqlString(details.head_sha)}`)\n : [];\n const [reviewState] = await queryGitcrawlDb<{\n unresolved_count?: number;\n latest_review_thread_at?: string;\n }>(`select count(*) as unresolved_count,\n max(coalesce(first_comment_updated_at, first_comment_created_at, fetched_at)) as latest_review_thread_at\n from pull_request_review_threads rt\n join threads t on t.id=rt.thread_id\n join repositories r on r.id=t.repo_id\n where r.owner=${owner} and r.name=${repo} and t.number=${number} and rt.is_resolved=0`);\n const [latestComment] = await queryGitcrawlDb<{\n author_login?: string;\n author_type?: string;\n is_bot?: number;\n }>(`select c.author_login, c.author_type, c.is_bot\n from comments c\n join threads t on t.id=c.thread_id\n join repositories r on r.id=t.repo_id\n where r.owner=${owner} and r.name=${repo} and t.number=${number}\n order by coalesce(c.updated_at_gh, c.created_at_gh) desc\n limit 1`);\n\n const checks = normalizeGithubChecksForSnapshot({\n checkRows: checkRows.map(row => ({\n source: 'check',\n name: readString(row.name) ?? 'check',\n status: readString(row.status),\n conclusion: readString(row.conclusion),\n workflowName: readString(row.workflow_name),\n detailsUrl: readString(row.details_url),\n updatedAt: readString(row.updated_at),\n })),\n workflowRows: workflowRows.map(row => ({\n source: 'workflow',\n name: readString(row.workflow_name) ?? 'workflow',\n status: readString(row.status),\n conclusion: readString(row.conclusion),\n workflowName: readString(row.workflow_name),\n detailsUrl: readString(row.html_url),\n updatedAt: readString(row.updated_at_gh),\n })),\n });\n const ciState = checks.some(check => check.conclusion === 'failure' || check.conclusion === 'timed_out')\n ? 'failure'\n : checks.some(check => check.status && check.status !== 'completed')\n ? 'pending'\n : checks.length > 0\n ? 'success'\n : 'unknown';\n const threadContentHash = readString(thread.content_hash);\n const unresolvedReviewThreads = Number(reviewState?.unresolved_count ?? 0);\n const reviewStateHash = snapshotHash({\n unresolvedReviewThreads,\n latestReviewThreadAt: reviewState?.latest_review_thread_at,\n });\n const contentHash = snapshotHash({\n threadContentHash,\n state: thread.state,\n headSha: details?.head_sha,\n mergeableState: details?.mergeable_state,\n ciState,\n reviewStateHash,\n checks: checks.map(check => ({\n name: check.name,\n status: check.status,\n conclusion: check.conclusion,\n detailsUrl: check.detailsUrl,\n updatedAt: check.updatedAt,\n })),\n });\n return {\n title: readString(thread.title),\n state:\n readString(details?.merged_at) || readString(threadDetails?.merged_at_gh)\n ? 'merged'\n : (readString(threadDetails?.state) ?? readString(thread.state)),\n htmlUrl: readString(thread.html_url),\n githubUpdatedAt: readString(thread.updated_at_gh),\n closedAt: readString(threadDetails?.closed_at_gh),\n mergedAt: readString(details?.merged_at) ?? readString(threadDetails?.merged_at_gh),\n threadContentHash,\n contentHash,\n headSha: readString(details?.head_sha),\n headRef: readString(details?.head_ref),\n mergeableState: readString(details?.mergeable_state),\n checks,\n ciState,\n unresolvedReviewThreads,\n reviewStateHash,\n latestReviewThreadAt: readString(reviewState?.latest_review_thread_at),\n latestCommentAuthor: readString(latestComment?.author_login),\n latestCommentAuthorType: readString(latestComment?.author_type),\n latestCommentIsBot: latestComment?.is_bot === 1,\n };\n } catch {\n return undefined;\n }\n }\n}\n\nexport class GithubSignals extends SignalProvider<'github-signals'> {\n readonly id = 'github-signals' as const;\n override readonly name = 'GitHub Signals';\n #ghMastra?: GithubSignalsMastra;\n\n static signals = {\n subscribeToPR(input: GithubSubscribePRSignalInput): AgentSignalInput {\n const normalized = typeof input === 'number' ? { number: input } : input;\n return {\n type: 'reactive',\n tagName: GITHUB_SUBSCRIBE_PR_TAG,\n contents: `Subscribe to GitHub PR #${normalized.number}`,\n attributes: {\n ...(normalized.owner ? { owner: normalized.owner } : {}),\n ...(normalized.repo ? { repo: normalized.repo } : {}),\n number: normalized.number,\n },\n metadata: {\n github: {\n action: 'subscribeToPR',\n ...normalized,\n },\n },\n };\n },\n unsubscribeFromPR(input: GithubUnsubscribePRSignalInput): AgentSignalInput {\n const normalized = typeof input === 'number' ? { number: input } : input;\n return {\n type: 'reactive',\n tagName: GITHUB_UNSUBSCRIBE_PR_TAG,\n contents: `Unsubscribe from GitHub PR #${normalized.number}`,\n attributes: {\n ...(normalized.owner ? { owner: normalized.owner } : {}),\n ...(normalized.repo ? { repo: normalized.repo } : {}),\n number: normalized.number,\n },\n metadata: {\n github: {\n action: 'unsubscribeFromPR',\n ...normalized,\n },\n },\n };\n },\n };\n\n readonly #options: GithubSignalsOptions;\n readonly #syncClient: GithubSignalsSyncClient;\n readonly #repositoryResolver: GithubRepositoryResolver;\n readonly #polling = new Map<string, GithubPollingState>();\n #agent?: GithubSignalAgent;\n #agentOptions: GithubSignalAgentOptions = {};\n #subscriptionsChangedHandler?: GithubSubscriptionsChangedHandler;\n\n constructor(options: GithubSignalsOptions = {}) {\n super();\n this.#options = options;\n this.#syncClient = options.syncClient ?? new GitcrawlSyncClient({ command: options.gitcrawlCommand });\n this.#repositoryResolver = options.repositoryResolver ?? new GitRemoteRepositoryResolver();\n if (options.getNotificationStreamOptions) {\n this.#agentOptions = { getNotificationStreamOptions: options.getNotificationStreamOptions };\n }\n }\n\n /**\n * @deprecated Use `Agent({ signals: [githubSignals] })` instead.\n * Kept for backward compatibility.\n */\n addAgent(agent: GithubSignalAgent, options: GithubSignalAgentOptions = {}): void {\n this.#agent = agent;\n this.#agentOptions = options;\n }\n\n /**\n * Called by the Agent constructor when this provider is passed via `signals: [...]`.\n * Sets the bidirectional link so the provider can send signals back to the agent.\n */\n override connect(agent: Agent<any, any, any, any>): void {\n super.connect(agent);\n this.#agent = agent as unknown as GithubSignalAgent;\n }\n\n getInputProcessors(): InputProcessorOrWorkflow[] {\n return [this as unknown as InputProcessorOrWorkflow];\n }\n\n getOutputProcessors(): OutputProcessorOrWorkflow[] {\n return [this as unknown as OutputProcessorOrWorkflow];\n }\n\n onSubscriptionsChanged(handler: GithubSubscriptionsChangedHandler): void {\n this.#subscriptionsChangedHandler = handler;\n }\n\n override __registerMastra(mastra: Mastra<any, any, any, any, any, any, any, any, any, any>): void {\n super.__registerMastra(mastra);\n this.#ghMastra = mastra as unknown as GithubSignalsMastra;\n }\n\n async syncThreadNow(input: GithubPollingThread): Promise<number> {\n return this.#pollThread(input, { includeComments: true });\n }\n\n async subscribeThreadToPR(input: GithubPollingThread & { pr: GithubPRSignalInput }): Promise<GithubOperationResult> {\n const pr = typeof input.pr === 'number' ? { number: input.pr } : input.pr;\n return this.#subscribe({\n id: `github-command-subscribe-${randomUUID()}`,\n ...pr,\n threadId: input.threadId,\n resourceId: input.resourceId,\n });\n }\n\n async unsubscribeThreadFromPR(\n input: GithubPollingThread & { pr: GithubPRSignalInput },\n ): Promise<GithubOperationResult> {\n const pr = typeof input.pr === 'number' ? { number: input.pr } : input.pr;\n return this.#unsubscribe({\n id: `github-command-unsubscribe-${randomUUID()}`,\n ...pr,\n threadId: input.threadId,\n resourceId: input.resourceId,\n });\n }\n\n async startPollingForThread(\n input: GithubPollingThread,\n options: { pollImmediately?: boolean } = {},\n ): Promise<boolean> {\n const subscriptions = await this.#getThreadSubscriptions(input);\n if (subscriptions.length === 0) {\n this.stopPollingForThread(input);\n return false;\n }\n\n const key = this.#pollingKey(input);\n for (const [pollingKey, state] of this.#polling.entries()) {\n if (pollingKey === key) continue;\n clearInterval(state.timer);\n this.#polling.delete(pollingKey);\n }\n\n if (this.#polling.has(key)) return true;\n\n let scheduledPollCount = options.pollImmediately ? 1 : 0;\n const runPoll = (pollOptions: { includeComments?: boolean } = {}) => {\n void this.#pollThread(input, pollOptions).catch(error => {\n console.warn('GitHub PR polling failed:', error);\n });\n };\n const timer = setInterval(() => {\n scheduledPollCount += 1;\n runPoll({ includeComments: scheduledPollCount % 2 === 1 });\n }, this.#options.pollIntervalMs ?? 300_000);\n if (options.pollImmediately) runPoll({ includeComments: true });\n timer.unref?.();\n this.#polling.set(key, { ...input, timer, running: false });\n return true;\n }\n\n stopPollingForThread(input: GithubPollingThread): void {\n const key = this.#pollingKey(input);\n const state = this.#polling.get(key);\n if (!state) return;\n clearInterval(state.timer);\n this.#polling.delete(key);\n }\n\n isPollingThread(input: GithubPollingThread): boolean {\n return this.#polling.has(this.#pollingKey(input));\n }\n\n getPollIntervalMs(): number {\n return this.#options.pollIntervalMs ?? 300_000;\n }\n\n stopAllPolling(): void {\n for (const state of this.#polling.values()) clearInterval(state.timer);\n this.#polling.clear();\n }\n\n async pollThreadNow(input: GithubPollingThread): Promise<number> {\n return this.#pollThread(input, { includeComments: true });\n }\n\n async processInputStep(args: ProcessInputStepArgs): Promise<ProcessInputStepResult> {\n const tools = this.#createTools(args);\n if (args.stepNumber !== 0) return { tools };\n\n const signal = this.#findLatestGithubSignal(args.messages);\n if (!signal) return { tools };\n\n const threadContext = this.#getThreadContext(args);\n\n if (signal.tagName === GITHUB_UNSUBSCRIBE_PR_TAG) {\n const result = await this.#unsubscribe({ ...signal, ...threadContext, abortSignal: args.abortSignal });\n await this.#sendStatus(args, result, {\n status: result.removed ? 'unsubscribed' : 'not_subscribed',\n action: 'unsubscribeFromPR',\n message: result.removed\n ? `Unsubscribed from ${result.owner}/${result.repo}#${result.number}.`\n : `No GitHub subscription found for ${result.owner}/${result.repo}#${result.number}.`,\n });\n return { tools };\n }\n\n const result = await this.#subscribe({ ...signal, ...threadContext, abortSignal: args.abortSignal });\n if (result.alreadyProcessed) return { tools };\n await this.#sendStatus(args, result, {\n status: result.syncResult?.ok === false ? 'sync_error' : 'subscribed',\n action: 'subscribeToPR',\n message:\n result.syncResult?.ok === false\n ? `Subscribed to ${result.owner}/${result.repo}#${result.number}, but gitcrawl sync failed: ${result.syncResult.error}`\n : `Subscribed to ${result.owner}/${result.repo}#${result.number}.`,\n });\n return { tools };\n }\n\n async processOutputStep(args: ProcessOutputStepArgs): Promise<MastraDBMessage[]> {\n const evidence = detectPrWorkEvidence({ text: args.text, toolCalls: args.toolCalls });\n if (!evidence) return args.messages;\n\n const threadContext = this.#getThreadContext(args);\n if (!threadContext.threadId || !threadContext.resourceId) return args.messages;\n\n const { threadStore, loadedThread } = await this.#loadThread(threadContext);\n const githubMetadata = getGithubMetadata(loadedThread.metadata);\n if (githubMetadata.subscriptionHintShown || githubMetadata.subscriptions.length > 0) return args.messages;\n\n let repository: GithubRepository;\n try {\n repository = await this.#resolveRepository({\n id: 'github-subscription-hint',\n owner: evidence.owner,\n repo: evidence.repo,\n number: evidence.number,\n });\n } catch {\n return args.messages;\n }\n\n await threadStore.saveThread({\n thread: {\n ...loadedThread,\n id: threadContext.threadId,\n resourceId: threadContext.resourceId,\n createdAt: loadedThread.createdAt ?? new Date(),\n updatedAt: new Date(),\n metadata: setGithubMetadata(loadedThread.metadata, { ...githubMetadata, subscriptionHintShown: true }),\n },\n });\n\n await args.sendSignal?.({\n type: 'reactive',\n tagName: 'system-reminder',\n contents: `Looks like you're working with ${repository.owner}/${repository.repo}#${evidence.number}. Use /github subscribe ${evidence.number} or the github_subscribe_pr tool to follow updates.`,\n attributes: { type: 'github-subscription-hint' },\n metadata: {\n github: {\n action: 'subscriptionHint',\n owner: repository.owner,\n repo: repository.repo,\n number: evidence.number,\n },\n },\n });\n\n return args.messages;\n }\n\n async #resolveThreadStore(): Promise<GithubSignalsThreadStore | undefined> {\n if (this.#options.threadStore) return this.#options.threadStore;\n const storage = this.#ghMastra?.getStorage?.();\n const memoryStore = storage?.getStore ? await storage.getStore('memory') : undefined;\n return memoryStore as GithubSignalsThreadStore | undefined;\n }\n\n #getThreadContext(args: { requestContext?: ProcessInputStepArgs['requestContext'] }): {\n threadId?: string;\n resourceId?: string;\n } {\n const memoryContext = args.requestContext?.get('MastraMemory') as\n | { thread?: { id?: string }; resourceId?: string }\n | undefined;\n return { threadId: memoryContext?.thread?.id, resourceId: memoryContext?.resourceId };\n }\n\n #createTools(args: ProcessInputStepArgs): Record<string, unknown> {\n const threadContext = this.#getThreadContext(args);\n return {\n ...args.tools,\n github_subscribe_pr: createGithubTool({\n id: 'github_subscribe_pr',\n description:\n 'Subscribe this thread to a GitHub pull request. Syncs only the requested PR with gitcrawl and stores the subscription on the thread.',\n inputSchema: z.object({\n number: z.number().int().positive(),\n owner: z.string().optional(),\n repo: z.string().optional(),\n }),\n execute: async input => {\n const result = await this.#subscribe({\n id: `github-tool-subscribe-${randomUUID()}`,\n owner: input.owner,\n repo: input.repo,\n number: input.number,\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n });\n return {\n subscribed: true,\n owner: result.owner,\n repo: result.repo,\n number: result.number,\n syncStatus: result.syncResult?.ok === false ? 'error' : result.syncResult ? 'success' : undefined,\n message:\n result.syncResult?.ok === false\n ? `Subscribed to ${result.owner}/${result.repo}#${result.number}, but gitcrawl sync failed: ${result.syncResult.error}`\n : `Subscribed to ${result.owner}/${result.repo}#${result.number}.`,\n };\n },\n }),\n github_unsubscribe_pr: createGithubTool({\n id: 'github_unsubscribe_pr',\n description: 'Unsubscribe this thread from a GitHub pull request.',\n inputSchema: z.object({\n number: z.number().int().positive(),\n owner: z.string().optional(),\n repo: z.string().optional(),\n }),\n execute: async input => {\n const result = await this.#unsubscribe({\n id: `github-tool-unsubscribe-${randomUUID()}`,\n owner: input.owner,\n repo: input.repo,\n number: input.number,\n threadId: threadContext.threadId,\n resourceId: threadContext.resourceId,\n });\n return {\n unsubscribed: result.removed ?? false,\n owner: result.owner,\n repo: result.repo,\n number: result.number,\n remainingSubscriptions: result.remainingSubscriptions,\n message: result.removed\n ? `Unsubscribed from ${result.owner}/${result.repo}#${result.number}.`\n : `No GitHub subscription found for ${result.owner}/${result.repo}#${result.number}.`,\n };\n },\n }),\n };\n }\n\n async #resolveRepository(input: GithubPRSignal & { abortSignal?: AbortSignal }): Promise<GithubRepository> {\n const resolvedRepository =\n input.owner && input.repo\n ? { owner: input.owner, repo: input.repo }\n : this.#options.owner && this.#options.repo\n ? { owner: this.#options.owner, repo: this.#options.repo }\n : await this.#repositoryResolver.resolveRepository({\n cwd: this.#options.cwd,\n abortSignal: input.abortSignal,\n });\n\n if (!resolvedRepository?.owner || !resolvedRepository.repo) {\n throw new Error(\n 'GitHub PR subscription requires owner and repo. Run inside a GitHub repo or pass owner and repo.',\n );\n }\n\n return resolvedRepository;\n }\n\n async #loadThread(input: { threadId?: string; resourceId?: string }) {\n const threadStore = await this.#resolveThreadStore();\n if (!threadStore) throw new Error('GitHub PR subscription requires memory-backed thread storage.');\n if (!input.threadId || !input.resourceId)\n throw new Error('GitHub PR subscription requires threadId and resourceId.');\n const loadedThread =\n (await threadStore.getThreadById({ threadId: input.threadId, resourceId: input.resourceId })) ?? undefined;\n if (!loadedThread) throw new Error(`Could not load thread ${input.threadId}.`);\n return { threadStore, loadedThread };\n }\n\n #pollingKey(input: GithubPollingThread): string {\n return `${input.resourceId}:${input.threadId}`;\n }\n\n #getNotificationAgent(_input?: { agentId?: string }): GithubSignalAgent | undefined {\n if (this.#agent) return this.#agent;\n const agentId = _input?.agentId ?? this.#options.agentId;\n return agentId ? this.#ghMastra?.getAgentById?.(agentId) : undefined;\n }\n\n async #getThreadSubscriptions(input: GithubPollingThread): Promise<GithubPRSubscription[]> {\n const { loadedThread } = await this.#loadThread(input);\n return getGithubMetadata(loadedThread.metadata).subscriptions;\n }\n\n #notifySubscriptionsChanged(input: GithubSubscriptionsChangedEvent): void {\n this.#subscriptionsChangedHandler?.(input);\n }\n\n async #pollThread(input: GithubPollingThread, options: { includeComments?: boolean } = {}): Promise<number> {\n const key = this.#pollingKey(input);\n const state = this.#polling.get(key);\n if (state?.running) {\n return 0;\n }\n if (state) state.running = true;\n\n try {\n const { threadStore, loadedThread } = await this.#loadThread(input);\n const githubMetadata = getGithubMetadata(loadedThread.metadata);\n if (githubMetadata.subscriptions.length === 0) {\n this.stopPollingForThread(input);\n return 0;\n }\n\n const now = new Date().toISOString();\n const subscriptions: GithubPRSubscription[] = [];\n for (const subscription of githubMetadata.subscriptions) {\n const syncInput = {\n owner: subscription.owner,\n repo: subscription.repo,\n number: subscription.number,\n cwd: this.#options.cwd,\n includeComments: options.includeComments,\n };\n const syncResult = await this.#syncClient.syncPullRequest(syncInput);\n const snapshot = syncResult.ok ? await this.#syncClient.getPullRequestSnapshot?.(syncInput) : undefined;\n const nextSubscription: GithubPRSubscription = {\n ...subscription,\n updatedAt: now,\n lastSyncAt: now,\n lastSyncStatus: syncResult.ok ? 'success' : 'error',\n };\n if (syncResult.error) nextSubscription.lastSyncError = syncResult.error;\n else delete nextSubscription.lastSyncError;\n\n const previousGithubUpdatedAt = subscription.lastObservedGithubUpdatedAt;\n const previousContentHash = subscription.lastObservedContentHash;\n const previousThreadContentHash = subscription.lastObservedThreadContentHash;\n const previousHeadSha = subscription.lastObservedHeadSha;\n if (snapshot) applySnapshotCursor(nextSubscription, snapshot);\n\n // First observation (no previous cursor) always counts as changed so we\n // emit a baseline notification with the PR's current state.\n const isFirstObservation = syncResult.ok && snapshot && !previousGithubUpdatedAt && !previousContentHash;\n\n const legacyAggregateChanged =\n previousContentHash &&\n snapshot?.contentHash &&\n previousContentHash !== snapshot.contentHash &&\n !previousThreadContentHash &&\n !previousHeadSha;\n const changed =\n isFirstObservation ||\n (syncResult.ok &&\n snapshot &&\n (legacyAggregateChanged ||\n (previousThreadContentHash &&\n snapshot.threadContentHash &&\n previousThreadContentHash !== snapshot.threadContentHash) ||\n (previousHeadSha && snapshot.headSha && previousHeadSha !== snapshot.headSha) ||\n (subscription.lastObservedState && snapshot.state && subscription.lastObservedState !== snapshot.state) ||\n (subscription.lastObservedMergeableState &&\n snapshot.mergeableState &&\n subscription.lastObservedMergeableState !== snapshot.mergeableState) ||\n (subscription.lastObservedCiState &&\n snapshot.ciState &&\n subscription.lastObservedCiState !== snapshot.ciState) ||\n (subscription.lastObservedReviewStateHash &&\n snapshot.reviewStateHash &&\n subscription.lastObservedReviewStateHash !== snapshot.reviewStateHash)));\n let shouldKeepSubscription = true;\n if (changed) {\n const notification = await this.#sendActivityNotification({\n polling: input,\n subscription,\n snapshot,\n previousGithubUpdatedAt,\n previousContentHash,\n });\n if (notification) {\n nextSubscription.lastNotificationAt = now;\n nextSubscription.lastNotificationKind = notification.kind;\n nextSubscription.lastNotificationPriority = notification.priority;\n nextSubscription.lastNotificationSummary = notification.summary;\n shouldKeepSubscription = notification.kind !== 'pull-request-merged';\n }\n }\n\n if (shouldKeepSubscription) subscriptions.push(nextSubscription);\n }\n\n await threadStore.saveThread({\n thread: {\n ...loadedThread,\n id: input.threadId,\n resourceId: input.resourceId,\n createdAt: loadedThread.createdAt ?? new Date(),\n updatedAt: new Date(),\n metadata: setGithubMetadata(loadedThread.metadata, { subscriptions }),\n },\n });\n this.#notifySubscriptionsChanged({ threadId: input.threadId, resourceId: input.resourceId, subscriptions });\n if (subscriptions.length === 0) this.stopPollingForThread(input);\n return subscriptions.length;\n } catch (error) {\n throw error;\n } finally {\n const latestState = this.#polling.get(key);\n if (latestState) latestState.running = false;\n }\n }\n\n async #sendGithubNotification(input: {\n agent?: GithubSignalAgent;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n notification: { kind: string; priority: 'medium' | 'high'; summary: string };\n target: { resourceId: string; threadId: string };\n dedupeSuffix: string;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n }): Promise<void> {\n const failingChecks = getFailingChecks(input.snapshot);\n const pendingChecks = getPendingChecks(input.snapshot);\n const notificationInput = {\n source: 'github',\n kind: input.notification.kind,\n priority: input.notification.priority,\n summary: input.notification.summary,\n dedupeKey: `github:${input.subscription.owner}/${input.subscription.repo}#${input.subscription.number}:${input.dedupeSuffix}`,\n coalesceKey: `github:${input.subscription.owner}/${input.subscription.repo}#${input.subscription.number}:${input.notification.kind}`,\n attributes: {\n owner: input.subscription.owner,\n repo: input.subscription.repo,\n number: input.subscription.number,\n ...(input.snapshot.title ? { title: input.snapshot.title } : {}),\n ...(input.snapshot.state ? { state: input.snapshot.state } : {}),\n ...(input.snapshot.htmlUrl ? { url: input.snapshot.htmlUrl } : {}),\n ...(input.snapshot.githubUpdatedAt ? { githubUpdatedAt: input.snapshot.githubUpdatedAt } : {}),\n ...(input.previousGithubUpdatedAt ? { previousGithubUpdatedAt: input.previousGithubUpdatedAt } : {}),\n ...(input.snapshot.mergeableState ? { mergeableState: input.snapshot.mergeableState } : {}),\n ...(input.snapshot.ciState ? { ciState: input.snapshot.ciState } : {}),\n ...(input.snapshot.unresolvedReviewThreads !== undefined\n ? { unresolvedReviewThreads: input.snapshot.unresolvedReviewThreads }\n : {}),\n ...(failingChecks.length > 0 ? { failingChecks: failingChecks.map(check => check.name).join(', ') } : {}),\n ...(pendingChecks.length > 0 ? { pendingChecks: pendingChecks.map(check => check.name).join(', ') } : {}),\n },\n metadata: {\n github: {\n owner: input.subscription.owner,\n repo: input.subscription.repo,\n number: input.subscription.number,\n title: input.snapshot.title,\n state: input.snapshot.state,\n htmlUrl: input.snapshot.htmlUrl,\n githubUpdatedAt: input.snapshot.githubUpdatedAt,\n previousGithubUpdatedAt: input.previousGithubUpdatedAt,\n contentHash: input.snapshot.contentHash,\n previousContentHash: input.previousContentHash,\n threadContentHash: input.snapshot.threadContentHash,\n headSha: input.snapshot.headSha,\n headRef: input.snapshot.headRef,\n mergeableState: input.snapshot.mergeableState,\n ciState: input.snapshot.ciState,\n closedAt: input.snapshot.closedAt,\n mergedAt: input.snapshot.mergedAt,\n unresolvedReviewThreads: input.snapshot.unresolvedReviewThreads,\n reviewStateHash: input.snapshot.reviewStateHash,\n latestReviewThreadAt: input.snapshot.latestReviewThreadAt,\n latestCommentAuthor: input.snapshot.latestCommentAuthor,\n latestCommentAuthorType: input.snapshot.latestCommentAuthorType,\n latestCommentIsBot: input.snapshot.latestCommentIsBot,\n failingChecks,\n pendingChecks,\n },\n },\n };\n const streamOptions = await this.#agentOptions.getNotificationStreamOptions?.(input.target);\n await input.agent?.sendNotificationSignal?.(\n notificationInput,\n streamOptions ? { ...input.target, ifIdle: { streamOptions } } : input.target,\n );\n }\n\n async #sendBaselineNotification(input: {\n threadId: string;\n resourceId: string;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n }): Promise<void> {\n const agent = this.#getNotificationAgent({});\n if (!agent?.sendNotificationSignal) return;\n await this.#sendGithubNotification({\n agent,\n subscription: input.subscription,\n snapshot: input.snapshot,\n notification: classifyGithubBaselineNotification({ subscription: input.subscription, snapshot: input.snapshot }),\n target: { resourceId: input.resourceId, threadId: input.threadId },\n dedupeSuffix: `baseline:${input.subscription.lastSubscribeSignalId}`,\n });\n }\n\n async #sendActivityNotification(input: {\n polling: GithubPollingThread;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n }): Promise<{ kind: string; priority: 'medium' | 'high'; summary: string } | undefined> {\n const agent = this.#getNotificationAgent(input.polling);\n if (!agent?.sendNotificationSignal) return undefined;\n const notification = classifyGithubActivityNotification({\n subscription: input.subscription,\n snapshot: input.snapshot,\n });\n if (!notification) return undefined;\n await this.#sendGithubNotification({\n agent,\n subscription: input.subscription,\n snapshot: input.snapshot,\n notification,\n target: { resourceId: input.polling.resourceId, threadId: input.polling.threadId },\n dedupeSuffix: input.snapshot.contentHash ?? input.snapshot.githubUpdatedAt ?? String(Date.now()),\n previousGithubUpdatedAt: input.previousGithubUpdatedAt,\n previousContentHash: input.previousContentHash,\n });\n return notification;\n }\n\n async #subscribe(\n input: GithubPRSignal & { threadId?: string; resourceId?: string; abortSignal?: AbortSignal },\n ): Promise<GithubOperationResult> {\n const { owner, repo } = await this.#resolveRepository(input);\n const { threadStore, loadedThread } = await this.#loadThread(input);\n const githubMetadata = getGithubMetadata(loadedThread.metadata);\n const existingIndex = githubMetadata.subscriptions.findIndex(\n subscription =>\n subscription.owner === owner && subscription.repo === repo && subscription.number === input.number,\n );\n const existing = existingIndex >= 0 ? githubMetadata.subscriptions[existingIndex] : undefined;\n if (existing?.lastSubscribeSignalId === input.id) {\n return { owner, repo, number: input.number, subscription: existing, alreadyProcessed: true };\n }\n\n const now = new Date().toISOString();\n const subscription: GithubPRSubscription = {\n owner,\n repo,\n number: input.number,\n subscribedAt: existing?.subscribedAt ?? now,\n updatedAt: now,\n lastSubscribeSignalId: input.id,\n ...(existing?.lastSyncAt ? { lastSyncAt: existing.lastSyncAt } : {}),\n ...(existing?.lastSyncStatus ? { lastSyncStatus: existing.lastSyncStatus } : {}),\n ...(existing?.lastSyncError ? { lastSyncError: existing.lastSyncError } : {}),\n ...(existing?.lastObservedGithubUpdatedAt\n ? { lastObservedGithubUpdatedAt: existing.lastObservedGithubUpdatedAt }\n : {}),\n ...(existing?.lastObservedContentHash ? { lastObservedContentHash: existing.lastObservedContentHash } : {}),\n ...(existing?.lastObservedThreadContentHash\n ? { lastObservedThreadContentHash: existing.lastObservedThreadContentHash }\n : {}),\n ...(existing?.lastObservedHeadSha ? { lastObservedHeadSha: existing.lastObservedHeadSha } : {}),\n ...(existing?.lastObservedState ? { lastObservedState: existing.lastObservedState } : {}),\n ...(existing?.lastObservedMergeableState\n ? { lastObservedMergeableState: existing.lastObservedMergeableState }\n : {}),\n ...(existing?.lastObservedCiState ? { lastObservedCiState: existing.lastObservedCiState } : {}),\n ...(existing?.lastObservedReviewStateHash\n ? { lastObservedReviewStateHash: existing.lastObservedReviewStateHash }\n : {}),\n };\n\n let syncResult: GithubSignalsSyncResult | undefined;\n let baselineSnapshot: GithubPullRequestSnapshot | undefined;\n if (this.#options.syncOnSubscribe !== false) {\n const syncInput = {\n owner,\n repo,\n number: input.number,\n cwd: this.#options.cwd,\n abortSignal: input.abortSignal,\n };\n syncResult = await this.#syncClient.syncPullRequest(syncInput);\n subscription.lastSyncAt = new Date().toISOString();\n subscription.lastSyncStatus = syncResult.ok ? 'success' : 'error';\n if (syncResult.error) subscription.lastSyncError = syncResult.error;\n else delete subscription.lastSyncError;\n const snapshot = syncResult.ok ? await this.#syncClient.getPullRequestSnapshot?.(syncInput) : undefined;\n baselineSnapshot = snapshot;\n if (snapshot) applySnapshotCursor(subscription, snapshot);\n } else {\n subscription.lastSyncStatus = 'skipped';\n }\n\n const subscriptions = [subscription];\n\n await threadStore.saveThread({\n thread: {\n ...loadedThread,\n id: input.threadId!,\n resourceId: input.resourceId!,\n createdAt: loadedThread.createdAt ?? new Date(),\n updatedAt: new Date(),\n metadata: setGithubMetadata(loadedThread.metadata, { subscriptions }),\n },\n });\n this.#notifySubscriptionsChanged({ threadId: input.threadId!, resourceId: input.resourceId!, subscriptions });\n if (baselineSnapshot) {\n await this.#sendBaselineNotification({\n threadId: input.threadId!,\n resourceId: input.resourceId!,\n subscription,\n snapshot: baselineSnapshot,\n });\n }\n await this.startPollingForThread({ threadId: input.threadId!, resourceId: input.resourceId! });\n\n return { owner, repo, number: input.number, subscription, syncResult };\n }\n\n async #unsubscribe(\n input: GithubPRSignal & { threadId?: string; resourceId?: string; abortSignal?: AbortSignal },\n ): Promise<GithubOperationResult> {\n const { owner, repo } = await this.#resolveRepository(input);\n const { threadStore, loadedThread } = await this.#loadThread(input);\n const githubMetadata = getGithubMetadata(loadedThread.metadata);\n const subscriptions = githubMetadata.subscriptions.filter(\n subscription =>\n !(subscription.owner === owner && subscription.repo === repo && subscription.number === input.number),\n );\n const removed = subscriptions.length !== githubMetadata.subscriptions.length;\n if (removed) {\n await threadStore.saveThread({\n thread: {\n ...loadedThread,\n id: input.threadId!,\n resourceId: input.resourceId!,\n createdAt: loadedThread.createdAt ?? new Date(),\n updatedAt: new Date(),\n metadata: setGithubMetadata(loadedThread.metadata, { subscriptions }),\n },\n });\n this.#notifySubscriptionsChanged({ threadId: input.threadId!, resourceId: input.resourceId!, subscriptions });\n if (subscriptions.length === 0)\n this.stopPollingForThread({ threadId: input.threadId!, resourceId: input.resourceId! });\n }\n return { owner, repo, number: input.number, removed, remainingSubscriptions: subscriptions.length };\n }\n\n #findLatestGithubSignal(messages: MastraDBMessage[]): (GithubPRSignal & { tagName: string }) | undefined {\n const message = messages.at(-1);\n if (!message) return undefined;\n\n const signal = getSignalMetadata(message);\n if (!signal || (signal.tagName !== GITHUB_SUBSCRIBE_PR_TAG && signal.tagName !== GITHUB_UNSUBSCRIBE_PR_TAG)) {\n return undefined;\n }\n\n const attributes = isPlainObject(signal.attributes) ? signal.attributes : {};\n const metadata = isPlainObject(signal.metadata) ? signal.metadata : {};\n const github = isPlainObject(metadata.github) ? metadata.github : {};\n const number = readNumber(attributes.number) ?? readNumber(github.number);\n if (!number) return undefined;\n\n return {\n tagName: String(signal.tagName),\n id: readString(signal.id) ?? message.id,\n owner: readString(attributes.owner) ?? readString(github.owner),\n repo: readString(attributes.repo) ?? readString(github.repo),\n number,\n };\n }\n\n async #sendStatus(\n args: ProcessInputStepArgs,\n signal: GithubOperationResult,\n status: {\n status: 'subscribed' | 'sync_error' | 'error' | 'unsubscribed' | 'not_subscribed';\n action: 'subscribeToPR' | 'unsubscribeFromPR';\n message: string;\n },\n ) {\n await args.sendSignal?.({\n type: 'reactive',\n tagName: GITHUB_SYNC_STATUS_TAG,\n contents: status.message,\n attributes: {\n status: status.status,\n owner: signal.owner,\n repo: signal.repo,\n number: signal.number,\n },\n metadata: {\n github: {\n action: status.action,\n status: status.status,\n owner: signal.owner,\n repo: signal.repo,\n number: signal.number,\n },\n },\n });\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@mastra/github-signals",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"description": "GitHub PR notification signal provider for Mastra agents",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"types": "./dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"CHANGELOG.md"
|
|
11
|
+
],
|
|
12
|
+
"exports": {
|
|
13
|
+
".": {
|
|
14
|
+
"import": {
|
|
15
|
+
"types": "./dist/index.d.ts",
|
|
16
|
+
"default": "./dist/index.js"
|
|
17
|
+
},
|
|
18
|
+
"require": {
|
|
19
|
+
"types": "./dist/index.d.ts",
|
|
20
|
+
"default": "./dist/index.cjs"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"./package.json": "./package.json"
|
|
24
|
+
},
|
|
25
|
+
"keywords": [
|
|
26
|
+
"mastra",
|
|
27
|
+
"github",
|
|
28
|
+
"signals",
|
|
29
|
+
"notifications",
|
|
30
|
+
"ai-agent"
|
|
31
|
+
],
|
|
32
|
+
"license": "Apache-2.0",
|
|
33
|
+
"repository": {
|
|
34
|
+
"type": "git",
|
|
35
|
+
"url": "git+https://github.com/mastra-ai/mastra.git",
|
|
36
|
+
"directory": "signals/github"
|
|
37
|
+
},
|
|
38
|
+
"bugs": {
|
|
39
|
+
"url": "https://github.com/mastra-ai/mastra/issues"
|
|
40
|
+
},
|
|
41
|
+
"homepage": "https://mastra.ai",
|
|
42
|
+
"engines": {
|
|
43
|
+
"node": ">=22.13.0"
|
|
44
|
+
},
|
|
45
|
+
"peerDependencies": {
|
|
46
|
+
"@mastra/core": ">=1.0.0-0 <2.0.0-0",
|
|
47
|
+
"zod": ">=3.0.0 || >=4.0.0"
|
|
48
|
+
},
|
|
49
|
+
"devDependencies": {
|
|
50
|
+
"tsup": "^8.5.1",
|
|
51
|
+
"typescript": "^6.0.3",
|
|
52
|
+
"vitest": "4.1.5",
|
|
53
|
+
"zod": "^4.4.3",
|
|
54
|
+
"@internal/lint": "0.0.103",
|
|
55
|
+
"@mastra/core": "1.41.0",
|
|
56
|
+
"@internal/types-builder": "0.0.78"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "tsup --silent --config tsup.config.ts",
|
|
60
|
+
"build:lib": "tsup --silent --config tsup.config.ts",
|
|
61
|
+
"build:watch": "pnpm build:lib --watch",
|
|
62
|
+
"lint": "eslint .",
|
|
63
|
+
"test": "vitest run"
|
|
64
|
+
}
|
|
65
|
+
}
|