@mastra/github-signals 0.2.1-alpha.0 → 0.2.2-alpha.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 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"names":["promisify","createTool","createHash","path","join","homedir","readFile","SignalProvider","randomUUID","result","z","subscription"],"mappings":"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","file":"index.cjs","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, AgentSignalIfIdleOptions } 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 GithubPermission = 'admin' | 'maintain' | 'write' | 'triage' | 'read' | 'none';\nconst DEFAULT_AUTHORIZED_PERMISSIONS: GithubPermission[] = ['admin', 'maintain', 'write'];\nconst DEFAULT_AUTHORIZED_BOTS = ['coderabbitai[bot]', 'devin-ai-integration[bot]'];\nconst PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;\n\n/** Notification kinds driven by comment/review activity that should be gated by author permission. */\nconst AUTHOR_GATED_NOTIFICATION_KINDS = new Set(['pull-request-activity', 'pull-request-review-activity']);\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\nexport type GithubPullRequestCommentSnapshot = {\n author?: string;\n authorType?: string;\n isBot?: boolean;\n body?: string;\n url?: 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 latestCommentBody?: string;\n latestCommentUrl?: string;\n latestCommentUpdatedAt?: string;\n /** Recent comments newest-first, used to fall back when the latest comment is unauthorized noise. */\n latestComments?: GithubPullRequestCommentSnapshot[];\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 GithubPermissionResolver = {\n getPermission(owner: string, repo: string, user: string): Promise<GithubPermission | undefined>;\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 /** Permissions that authorize a human commenter to trigger notifications (default: admin, maintain, write). */\n authorizedPermissions?: GithubPermission[];\n /** Bot logins authorized to trigger notifications (default: coderabbitai[bot], devin-ai-integration[bot]). */\n authorizedBots?: string[];\n /** Bot logins whose comments should be ignored and NOT trigger notifications. */\n ignoredBots?: string[];\n /** Custom resolver for looking up collaborator permissions (default: gh api). */\n permissionResolver?: GithubPermissionResolver;\n};\n\nexport type GithubSubscriptionsChangedEvent = {\n threadId: string;\n resourceId: string;\n subscriptions: GithubPRSubscription[];\n};\n\nexport type GithubPollingChangedEvent = {\n threadId: string;\n resourceId: string;\n running: boolean;\n};\n\ntype GithubSubscriptionsChangedHandler = (event: GithubSubscriptionsChangedEvent) => void;\ntype GithubPollingChangedHandler = (event: GithubPollingChangedEvent) => 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?(\n notification: unknown | unknown[],\n target: unknown,\n ): { 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 ifIdle?: AgentSignalIfIdleOptions<unknown>;\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\n/**\n * Removes a hidden block (its delimiters *and* its content) starting at every `open` marker.\n *\n * For each `open` occurrence the whole region up to and including the matching `close` is dropped.\n * When `close` is missing the block is treated as unterminated and removed through end-of-string,\n * so large payloads can't survive by omitting their closing marker. Matching is case-insensitive on\n * the markers and uses plain `indexOf` scanning, so there is no regex backtracking (ReDoS-safe).\n */\nfunction stripBlocks(text: string, open: string, close: string): string {\n const haystack = text.toLowerCase();\n const openLower = open.toLowerCase();\n const closeLower = close.toLowerCase();\n let result = '';\n let cursor = 0;\n\n for (;;) {\n const start = haystack.indexOf(openLower, cursor);\n if (start === -1) {\n result += text.slice(cursor);\n return result;\n }\n result += text.slice(cursor, start);\n const end = haystack.indexOf(closeLower, start + openLower.length);\n if (end === -1) return result; // unterminated: drop through EOF\n cursor = end + closeLower.length;\n }\n}\n\n/** Sentinel marker wrapping a stashed Markdown code region; `\\u0000` cannot appear in GitHub text. */\nconst CODE_TOKEN_PREFIX = '\\u0000CODE';\nconst CODE_TOKEN_SUFFIX = '\\u0000';\n\n/**\n * Temporarily removes Markdown code spans and fenced code blocks so tag stripping can't damage\n * human-authored code examples.\n *\n * GitHub renders Markdown, so legitimate code like `` `<Component>` ``, generic type examples, or\n * fenced JSX/TSX must survive sanitization. Each code region is replaced with an opaque token and\n * pushed onto a stash; {@link restore} swaps the tokens back after the surrounding prose has been\n * stripped of markup. Fenced blocks are matched before inline spans so backtick runs inside a fence\n * are not mistaken for inline code.\n */\nfunction preserveMarkdownCode(text: string): { text: string; restore: (sanitized: string) => string } {\n const preserved: string[] = [];\n const stash = (match: string): string => {\n const token = `${CODE_TOKEN_PREFIX}${preserved.length}${CODE_TOKEN_SUFFIX}`;\n preserved.push(match);\n return token;\n };\n\n const protectedText = text\n // Fenced code blocks first so inline-code matching does not touch their contents.\n .replace(/```[\\s\\S]*?```/g, stash)\n // Multi-backtick inline spans (e.g. ``code with ` inside``) before the single-backtick pass.\n .replace(/(`{2,})(?!`)[\\s\\S]*?[^`]\\1(?!`)/g, stash)\n // Single-backtick inline code spans.\n .replace(/`[^`\\n]*`/g, stash);\n\n return {\n text: protectedText,\n restore: sanitized =>\n sanitized.replace(/\\u0000CODE(\\d+)\\u0000/g, (_, index: string) => preserved[Number(index)] ?? ''),\n };\n}\n\n/**\n * Removes XML/HTML-like markup — and the content it hides — from a PR comment body, leaving only\n * human-readable text while preserving Markdown code examples.\n *\n * Review bots (e.g. CodeRabbit) embed large machine-only payloads in comments: base64 state blobs\n * inside `<!-- ... -->` comments (often >100KB) and verbose collapsed `<details>` sections. Rather\n * than targeting specific bot markers, we strip hidden blocks and tags generically, since none of\n * that markup is useful to downstream consumers and persisting it balloons notification payloads and\n * can overflow agent context windows.\n *\n * Markdown code spans/fenced blocks are stashed first and restored last, so legitimate code such as\n * `` `<Component>` `` or fenced JSX is kept intact while bot markup elsewhere is removed. Block\n * removal (comments, `<details>`) drops the *entire* section including its inner content, and any\n * unterminated block is removed through end-of-string so a missing closing marker can't smuggle the\n * payload through. All scanning is `indexOf`-based and the only regex used is a non-backtracking\n * single-tag matcher, so adversarial input cannot trigger catastrophic backtracking (ReDoS). Any\n * unterminated markup fragment (e.g. a dangling `<script` with no `>`) is dropped through end-of-\n * string, and finally every remaining lone `<` is removed so no partial markup survives — while\n * ordinary prose like `coverage < 80%` keeps its text intact.\n */\nexport function sanitizeCommentText(body: string): string {\n // Protect Markdown code regions before any stripping touches the text.\n const { text: protectedBody, restore } = preserveMarkdownCode(body);\n // Remove whole hidden sections (delimiters + content) before touching individual tags.\n let text = stripBlocks(protectedBody, '<!--', '-->');\n text = stripBlocks(text, '<details', '</details>');\n const stripped = text\n // Remaining standalone tags, e.g. <summary>, </p>, <br/>. `[^<>]*` cannot backtrack.\n .replace(/<\\/?[a-zA-Z][^<>]*>/g, '')\n // Drop an unterminated markup fragment (`<!--`, `</`, `<tag`...) from its start through EOF.\n .replace(/<[!/a-zA-Z][\\s\\S]*$/g, '')\n // Strip any lone `<` left over, but keep surrounding prose (e.g. `coverage < 80%`).\n .replace(/</g, '')\n // Normalize prose whitespace *before* restoring code, so stashed blocks are never mutated.\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n return restore(stripped);\n}\n\n/** Applies {@link sanitizeCommentText} to an optional comment body, preserving `undefined`. */\nfunction sanitizeCommentBody(body: string | undefined): string | undefined {\n if (body === undefined) return undefined;\n const sanitized = sanitizeCommentText(body);\n return sanitized.length > 0 ? sanitized : undefined;\n}\n\nfunction getCommentExcerpt(body: string): string {\n const excerpt = sanitizeCommentText(body).replace(/\\s+/g, ' ').trim();\n return excerpt.length > 240 ? `${excerpt.slice(0, 237)}...` : excerpt;\n}\n\nfunction getCommentNotificationSummary(pr: string, snapshot: GithubPullRequestSnapshot): string | undefined {\n if (!snapshot.latestCommentAuthor || !snapshot.latestCommentBody) return undefined;\n return `${snapshot.latestCommentAuthor} commented on ${pr}: ${getCommentExcerpt(snapshot.latestCommentBody)}`;\n}\n\ntype GithubActivityNotificationPlan = { kind: string; priority: 'medium' | 'high'; summary: string };\n\nconst githubActivityNotificationPriority: Record<GithubActivityNotificationPlan['priority'], number> = {\n high: 0,\n medium: 1,\n};\n\nfunction getGithubActivityNotificationRank(notification: GithubActivityNotificationPlan): number {\n return notification.kind === 'pull-request-activity' ? 0 : 1;\n}\n\nfunction compareGithubActivityNotifications(\n a: GithubActivityNotificationPlan | undefined,\n b: GithubActivityNotificationPlan | undefined,\n): number {\n if (!a && !b) return 0;\n if (!a) return 1;\n if (!b) return -1;\n const priorityComparison =\n githubActivityNotificationPriority[a.priority] - githubActivityNotificationPriority[b.priority];\n if (priorityComparison !== 0) return priorityComparison;\n return getGithubActivityNotificationRank(a) - getGithubActivityNotificationRank(b);\n}\n\nfunction classifyGithubCommentActivityNotification(input: {\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n}): GithubActivityNotificationPlan | undefined {\n if (isBotOnlyActivity(input.snapshot)) return undefined;\n const pr = `${input.subscription.owner}/${input.subscription.repo}#${input.subscription.number}`;\n const summary = getCommentNotificationSummary(pr, input.snapshot);\n if (!summary) return undefined;\n return { kind: 'pull-request-activity', priority: 'high', summary };\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 const commentSummary = getCommentNotificationSummary(pr, input.snapshot);\n return {\n kind: 'pull-request-activity',\n priority: commentSummary ? 'high' : 'medium',\n summary: commentSummary ?? `${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 latestComments = await queryGitcrawlDb<{\n author_login?: string;\n author_type?: string;\n is_bot?: number;\n body?: string;\n html_url?: string;\n updated_at?: string;\n }>(`select c.author_login, c.author_type, c.is_bot, c.body, json_extract(c.raw_json, '$.html_url') as html_url,\n coalesce(c.updated_at_gh, c.created_at_gh) as updated_at\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 20`);\n const latestComment = latestComments[0];\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 latestCommentBody: sanitizeCommentBody(readString(latestComment?.body)),\n latestCommentUrl: readString(latestComment?.html_url),\n latestCommentUpdatedAt: readString(latestComment?.updated_at),\n latestComments: latestComments.map(comment => ({\n author: readString(comment.author_login),\n authorType: readString(comment.author_type),\n isBot: comment.is_bot === 1,\n body: sanitizeCommentBody(readString(comment.body)),\n url: readString(comment.html_url),\n updatedAt: readString(comment.updated_at),\n })),\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 readonly #permissionCache = new Map<string, { permission: GithubPermission; expiresAt: number }>();\n #agent?: GithubSignalAgent;\n #agentOptions: GithubSignalAgentOptions = {};\n #subscriptionsChangedHandler?: GithubSubscriptionsChangedHandler;\n #pollingChangedHandler?: GithubPollingChangedHandler;\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 onPollingChanged(handler: GithubPollingChangedHandler): void {\n this.#pollingChangedHandler = 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 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 runPoll({ includeComments: true });\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 isPollingThreadRunning(input: GithubPollingThread): boolean {\n return this.#polling.get(this.#pollingKey(input))?.running ?? false;\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 const getExecutionThreadContext = (context?: GithubToolExecuteContext) => ({\n threadId: context?.agent?.threadId ?? threadContext.threadId,\n resourceId: context?.agent?.resourceId ?? threadContext.resourceId,\n });\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, context) => {\n const executionThreadContext = getExecutionThreadContext(context);\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: executionThreadContext.threadId,\n resourceId: executionThreadContext.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, context) => {\n const executionThreadContext = getExecutionThreadContext(context);\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: executionThreadContext.threadId,\n resourceId: executionThreadContext.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 #notifyPollingChanged(input: GithubPollingChangedEvent): void {\n this.#pollingChangedHandler?.(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 this.#notifyPollingChanged({ threadId: input.threadId, resourceId: input.resourceId, 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 let snapshot = syncResult.ok ? await this.#syncClient.getPullRequestSnapshot?.(syncInput) : undefined;\n if (snapshot)\n snapshot = await this.#filterUnauthorizedLatestComment(subscription.owner, subscription.repo, snapshot);\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 const latestCommentChanged =\n !!previousGithubUpdatedAt &&\n !!snapshot?.latestCommentUpdatedAt &&\n Date.parse(snapshot.latestCommentUpdatedAt) > Date.parse(previousGithubUpdatedAt);\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 latestCommentChanged ||\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 && snapshot) {\n const notifications = await this.#sendActivityNotifications({\n polling: input,\n subscription,\n snapshot,\n previousGithubUpdatedAt,\n previousContentHash,\n latestCommentChanged,\n });\n const primaryNotification = notifications[0];\n if (primaryNotification) {\n nextSubscription.lastNotificationAt = now;\n nextSubscription.lastNotificationKind = primaryNotification.kind;\n nextSubscription.lastNotificationPriority = primaryNotification.priority;\n nextSubscription.lastNotificationSummary = primaryNotification.summary;\n shouldKeepSubscription = notifications.every(notification => 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 this.#notifyPollingChanged({ threadId: input.threadId, resourceId: input.resourceId, running: false });\n }\n }\n\n #createGithubNotificationInput(input: {\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n notification: { kind: string; priority: 'medium' | 'high'; summary: string };\n dedupeSuffix: string;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n }) {\n const failingChecks = getFailingChecks(input.snapshot);\n const pendingChecks = getPendingChecks(input.snapshot);\n const latestCommentExcerpt = input.snapshot.latestCommentBody\n ? getCommentExcerpt(input.snapshot.latestCommentBody)\n : undefined;\n const latestCommentDedupeSuffix =\n input.notification.kind === 'pull-request-activity' && input.snapshot.latestCommentUrl\n ? `comment:${input.snapshot.latestCommentUrl}:${input.snapshot.latestCommentUpdatedAt ?? ''}`\n : input.dedupeSuffix;\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}:${latestCommentDedupeSuffix}`,\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 ...(input.snapshot.latestCommentAuthor ? { latestCommentAuthor: input.snapshot.latestCommentAuthor } : {}),\n ...(latestCommentExcerpt ? { latestCommentExcerpt } : {}),\n ...(input.snapshot.latestCommentUrl ? { latestCommentUrl: input.snapshot.latestCommentUrl } : {}),\n ...(input.snapshot.latestCommentUpdatedAt\n ? { latestCommentUpdatedAt: input.snapshot.latestCommentUpdatedAt }\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 // Intentionally omit the full latestCommentBody here: persisting it verbatim bloats\n // notification payloads (a single CodeRabbit comment can exceed 100KB) and can overflow\n // agent context windows when listed. The 240-char latestCommentExcerpt is stored instead.\n latestCommentExcerpt,\n latestCommentUrl: input.snapshot.latestCommentUrl,\n latestCommentUpdatedAt: input.snapshot.latestCommentUpdatedAt,\n failingChecks,\n pendingChecks,\n },\n },\n };\n return notificationInput;\n }\n\n async #sendGithubNotification(input: {\n agent?: GithubSignalAgent;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n notification: GithubActivityNotificationPlan;\n target: { resourceId: string; threadId: string };\n dedupeSuffix: string;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n }): Promise<void> {\n const notificationInput = this.#createGithubNotificationInput(input);\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 #isAuthorizedAuthor(\n owner: string,\n repo: string,\n user: string | undefined,\n metadata: { authorType?: string; isBot?: boolean } = {},\n ): Promise<boolean> {\n if (!user) return false;\n const normalizedUser = user.toLowerCase();\n const isBot =\n metadata.isBot === true || metadata.authorType?.toLowerCase() === 'bot' || normalizedUser.endsWith('[bot]');\n if (isBot) {\n const ignoredBots = this.#options.ignoredBots ?? [];\n if (ignoredBots.some(bot => bot.toLowerCase() === normalizedUser)) return false;\n const authorizedBots = this.#options.authorizedBots ?? DEFAULT_AUTHORIZED_BOTS;\n return authorizedBots.some(bot => bot.toLowerCase() === normalizedUser);\n }\n const permission = await this.#loadAuthorPermission(owner, repo, user);\n const authorizedPermissions = this.#options.authorizedPermissions ?? DEFAULT_AUTHORIZED_PERMISSIONS;\n return !!permission && authorizedPermissions.includes(permission);\n }\n\n async #filterUnauthorizedLatestComment(\n owner: string,\n repo: string,\n snapshot: GithubPullRequestSnapshot,\n ): Promise<GithubPullRequestSnapshot> {\n const comments = snapshot.latestComments?.length\n ? snapshot.latestComments\n : [\n {\n author: snapshot.latestCommentAuthor,\n authorType: snapshot.latestCommentAuthorType,\n isBot: snapshot.latestCommentIsBot,\n body: snapshot.latestCommentBody,\n url: snapshot.latestCommentUrl,\n updatedAt: snapshot.latestCommentUpdatedAt,\n },\n ];\n if (!comments.some(comment => comment.author)) return snapshot;\n if (!comments.some(comment => comment.body || comment.url || comment.updatedAt)) return snapshot;\n\n for (const comment of comments) {\n if (\n !(await this.#isAuthorizedAuthor(owner, repo, comment.author, {\n authorType: comment.authorType,\n isBot: comment.isBot,\n }))\n ) {\n continue;\n }\n return {\n ...snapshot,\n latestCommentAuthor: comment.author,\n latestCommentAuthorType: comment.authorType,\n latestCommentIsBot: comment.isBot,\n latestCommentBody: comment.body,\n latestCommentUrl: comment.url,\n latestCommentUpdatedAt: comment.updatedAt,\n };\n }\n\n return {\n ...snapshot,\n latestCommentAuthor: undefined,\n latestCommentAuthorType: undefined,\n latestCommentIsBot: undefined,\n latestCommentBody: undefined,\n latestCommentUrl: undefined,\n latestCommentUpdatedAt: undefined,\n };\n }\n\n async #loadAuthorPermission(owner: string, repo: string, user: string): Promise<GithubPermission | undefined> {\n const cacheKey = `${owner}/${repo}:${user.toLowerCase()}`;\n const cached = this.#permissionCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) return cached.permission;\n if (cached) this.#permissionCache.delete(cacheKey);\n\n try {\n let permission: GithubPermission | undefined;\n if (this.#options.permissionResolver) {\n permission = await this.#options.permissionResolver.getPermission(owner, repo, user);\n } else {\n const { stdout } = await execFileAsync('gh', [\n 'api',\n `repos/${owner}/${repo}/collaborators/${user}/permission`,\n '--jq',\n '.permission',\n ]);\n const raw = stdout.trim();\n permission = (['admin', 'maintain', 'write', 'triage', 'read', 'none'] as const).includes(\n raw as GithubPermission,\n )\n ? (raw as GithubPermission)\n : undefined;\n }\n if (permission) {\n this.#permissionCache.set(cacheKey, { permission, expiresAt: Date.now() + PERMISSION_CACHE_TTL_MS });\n }\n return permission;\n } catch {\n this.#permissionCache.delete(cacheKey);\n return undefined;\n }\n }\n\n async #sendActivityNotifications(input: {\n polling: GithubPollingThread;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n latestCommentChanged?: boolean;\n }): Promise<Array<{ kind: string; priority: 'medium' | 'high'; summary: string }>> {\n const agent = this.#getNotificationAgent(input.polling);\n if (!agent?.sendNotificationSignal) return [];\n const notifications = [\n classifyGithubActivityNotification({\n subscription: input.subscription,\n snapshot: input.snapshot,\n }),\n ];\n if (input.latestCommentChanged && notifications[0]?.kind !== 'pull-request-activity') {\n notifications.push(\n classifyGithubCommentActivityNotification({\n subscription: input.subscription,\n snapshot: input.snapshot,\n }),\n );\n }\n\n const sent: GithubActivityNotificationPlan[] = [];\n const notificationInputs = [];\n for (const notification of notifications.sort(compareGithubActivityNotifications)) {\n if (!notification) continue;\n if (AUTHOR_GATED_NOTIFICATION_KINDS.has(notification.kind)) {\n const authorized = await this.#isAuthorizedAuthor(\n input.subscription.owner,\n input.subscription.repo,\n input.snapshot.latestCommentAuthor,\n {\n authorType: input.snapshot.latestCommentAuthorType,\n isBot: input.snapshot.latestCommentIsBot,\n },\n );\n if (!authorized) continue;\n }\n notificationInputs.push(\n this.#createGithubNotificationInput({\n subscription: input.subscription,\n snapshot: input.snapshot,\n notification,\n dedupeSuffix: input.snapshot.contentHash ?? input.snapshot.githubUpdatedAt ?? String(Date.now()),\n previousGithubUpdatedAt: input.previousGithubUpdatedAt,\n previousContentHash: input.previousContentHash,\n }),\n );\n sent.push(notification);\n }\n if (notificationInputs.length > 0) {\n const target = { resourceId: input.polling.resourceId, threadId: input.polling.threadId };\n const streamOptions = await this.#agentOptions.getNotificationStreamOptions?.(target);\n await agent.sendNotificationSignal(\n notificationInputs,\n streamOptions ? { ...target, ifIdle: { streamOptions } } : target,\n );\n }\n return sent;\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"]}
1
+ {"version":3,"sources":["../src/index.ts"],"names":["promisify","createTool","createHash","path","join","homedir","readFile","SignalProvider","randomUUID","result","z","subscription"],"mappings":"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","file":"index.cjs","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, AgentSignalIfIdleOptions } 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 GithubPermission = 'admin' | 'maintain' | 'write' | 'triage' | 'read' | 'none';\nconst DEFAULT_AUTHORIZED_PERMISSIONS: GithubPermission[] = ['admin', 'maintain', 'write'];\nconst DEFAULT_AUTHORIZED_BOTS = ['coderabbitai[bot]', 'devin-ai-integration[bot]'];\nconst PERMISSION_CACHE_TTL_MS = 5 * 60 * 1000;\n\n/** Notification kinds driven by comment/review activity that should be gated by author permission. */\nconst AUTHOR_GATED_NOTIFICATION_KINDS = new Set(['pull-request-activity', 'pull-request-review-activity']);\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\nexport type GithubPullRequestCommentSnapshot = {\n author?: string;\n authorType?: string;\n isBot?: boolean;\n body?: string;\n url?: 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 latestCommentBody?: string;\n latestCommentUrl?: string;\n latestCommentUpdatedAt?: string;\n /** Recent comments newest-first, used to fall back when the latest comment is unauthorized noise. */\n latestComments?: GithubPullRequestCommentSnapshot[];\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 GithubPermissionResolver = {\n getPermission(owner: string, repo: string, user: string): Promise<GithubPermission | undefined>;\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 /** Permissions that authorize a human commenter to trigger notifications (default: admin, maintain, write). */\n authorizedPermissions?: GithubPermission[];\n /** Bot logins authorized to trigger notifications (default: coderabbitai[bot], devin-ai-integration[bot]). */\n authorizedBots?: string[];\n /** Bot logins whose comments should be ignored and NOT trigger notifications. */\n ignoredBots?: string[];\n /** Custom resolver for looking up collaborator permissions (default: gh api). */\n permissionResolver?: GithubPermissionResolver;\n};\n\nexport type GithubSubscriptionsChangedEvent = {\n threadId: string;\n resourceId: string;\n subscriptions: GithubPRSubscription[];\n};\n\nexport type GithubPollingChangedEvent = {\n threadId: string;\n resourceId: string;\n running: boolean;\n};\n\ntype GithubSubscriptionsChangedHandler = (event: GithubSubscriptionsChangedEvent) => void;\ntype GithubPollingChangedHandler = (event: GithubPollingChangedEvent) => 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?(\n notification: unknown | unknown[],\n target: unknown,\n ): { 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 ifIdle?: AgentSignalIfIdleOptions<unknown>;\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\n/**\n * Removes a hidden block (its delimiters *and* its content) starting at every `open` marker.\n *\n * For each `open` occurrence the whole region up to and including the matching `close` is dropped.\n * When `close` is missing the block is treated as unterminated and removed through end-of-string,\n * so large payloads can't survive by omitting their closing marker. Matching is case-insensitive on\n * the markers and uses plain `indexOf` scanning, so there is no regex backtracking (ReDoS-safe).\n */\nfunction stripBlocks(text: string, open: string, close: string): string {\n const haystack = text.toLowerCase();\n const openLower = open.toLowerCase();\n const closeLower = close.toLowerCase();\n let result = '';\n let cursor = 0;\n\n for (;;) {\n const start = haystack.indexOf(openLower, cursor);\n if (start === -1) {\n result += text.slice(cursor);\n return result;\n }\n result += text.slice(cursor, start);\n const end = haystack.indexOf(closeLower, start + openLower.length);\n if (end === -1) return result; // unterminated: drop through EOF\n cursor = end + closeLower.length;\n }\n}\n\n/** Sentinel marker wrapping a stashed Markdown code region; `\\u0000` cannot appear in GitHub text. */\nconst CODE_TOKEN_PREFIX = '\\u0000CODE';\nconst CODE_TOKEN_SUFFIX = '\\u0000';\n\n/**\n * Temporarily removes Markdown code spans and fenced code blocks so tag stripping can't damage\n * human-authored code examples.\n *\n * GitHub renders Markdown, so legitimate code like `` `<Component>` ``, generic type examples, or\n * fenced JSX/TSX must survive sanitization. Each code region is replaced with an opaque token and\n * pushed onto a stash; {@link restore} swaps the tokens back after the surrounding prose has been\n * stripped of markup. Fenced blocks are matched before inline spans so backtick runs inside a fence\n * are not mistaken for inline code.\n */\nfunction preserveMarkdownCode(text: string): { text: string; restore: (sanitized: string) => string } {\n const preserved: string[] = [];\n const stash = (match: string): string => {\n const token = `${CODE_TOKEN_PREFIX}${preserved.length}${CODE_TOKEN_SUFFIX}`;\n preserved.push(match);\n return token;\n };\n\n const protectedText = text\n // Fenced code blocks first so inline-code matching does not touch their contents.\n .replace(/```[\\s\\S]*?```/g, stash)\n // Multi-backtick inline spans (e.g. ``code with ` inside``) before the single-backtick pass.\n .replace(/(`{2,})(?!`)[\\s\\S]*?[^`]\\1(?!`)/g, stash)\n // Single-backtick inline code spans.\n .replace(/`[^`\\n]*`/g, stash);\n\n return {\n text: protectedText,\n restore: sanitized =>\n sanitized.replace(/\\u0000CODE(\\d+)\\u0000/g, (_, index: string) => preserved[Number(index)] ?? ''),\n };\n}\n\n/**\n * Removes XML/HTML-like markup — and the content it hides — from a PR comment body, leaving only\n * human-readable text while preserving Markdown code examples.\n *\n * Review bots (e.g. CodeRabbit) embed large machine-only payloads in comments: base64 state blobs\n * inside `<!-- ... -->` comments (often >100KB) and verbose collapsed `<details>` sections. Rather\n * than targeting specific bot markers, we strip hidden blocks and tags generically, since none of\n * that markup is useful to downstream consumers and persisting it balloons notification payloads and\n * can overflow agent context windows.\n *\n * Markdown code spans/fenced blocks are stashed first and restored last, so legitimate code such as\n * `` `<Component>` `` or fenced JSX is kept intact while bot markup elsewhere is removed. Block\n * removal (comments, `<details>`) drops the *entire* section including its inner content, and any\n * unterminated block is removed through end-of-string so a missing closing marker can't smuggle the\n * payload through. All scanning is `indexOf`-based and the only regex used is a non-backtracking\n * single-tag matcher, so adversarial input cannot trigger catastrophic backtracking (ReDoS). Any\n * unterminated markup fragment (e.g. a dangling `<script` with no `>`) is dropped through end-of-\n * string, and finally every remaining lone `<` is removed so no partial markup survives — while\n * ordinary prose like `coverage < 80%` keeps its text intact.\n */\nexport function sanitizeCommentText(body: string): string {\n // Protect Markdown code regions before any stripping touches the text.\n const { text: protectedBody, restore } = preserveMarkdownCode(body);\n // Remove whole hidden sections (delimiters + content) before touching individual tags.\n let text = stripBlocks(protectedBody, '<!--', '-->');\n text = stripBlocks(text, '<details', '</details>');\n const stripped = text\n // Remaining standalone tags, e.g. <summary>, </p>, <br/>. `[^<>]*` cannot backtrack.\n .replace(/<\\/?[a-zA-Z][^<>]*>/g, '')\n // Drop an unterminated markup fragment (`<!--`, `</`, `<tag`...) from its start through EOF.\n .replace(/<[!/a-zA-Z][\\s\\S]*$/g, '')\n // Strip any lone `<` left over, but keep surrounding prose (e.g. `coverage < 80%`).\n .replace(/</g, '')\n // Normalize prose whitespace *before* restoring code, so stashed blocks are never mutated.\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n return restore(stripped);\n}\n\n/** Applies {@link sanitizeCommentText} to an optional comment body, preserving `undefined`. */\nfunction sanitizeCommentBody(body: string | undefined): string | undefined {\n if (body === undefined) return undefined;\n const sanitized = sanitizeCommentText(body);\n return sanitized.length > 0 ? sanitized : undefined;\n}\n\nfunction getCommentExcerpt(body: string): string {\n const excerpt = sanitizeCommentText(body).replace(/\\s+/g, ' ').trim();\n return excerpt.length > 240 ? `${excerpt.slice(0, 237)}...` : excerpt;\n}\n\nfunction getCommentNotificationSummary(pr: string, snapshot: GithubPullRequestSnapshot): string | undefined {\n if (!snapshot.latestCommentAuthor || !snapshot.latestCommentBody) return undefined;\n return `${snapshot.latestCommentAuthor} commented on ${pr}: ${getCommentExcerpt(snapshot.latestCommentBody)}`;\n}\n\ntype GithubActivityNotificationPlan = { kind: string; priority: 'medium' | 'high'; summary: string };\n\nconst githubActivityNotificationPriority: Record<GithubActivityNotificationPlan['priority'], number> = {\n high: 0,\n medium: 1,\n};\n\nfunction getGithubActivityNotificationRank(notification: GithubActivityNotificationPlan): number {\n return notification.kind === 'pull-request-activity' ? 0 : 1;\n}\n\nfunction compareGithubActivityNotifications(\n a: GithubActivityNotificationPlan | undefined,\n b: GithubActivityNotificationPlan | undefined,\n): number {\n if (!a && !b) return 0;\n if (!a) return 1;\n if (!b) return -1;\n const priorityComparison =\n githubActivityNotificationPriority[a.priority] - githubActivityNotificationPriority[b.priority];\n if (priorityComparison !== 0) return priorityComparison;\n return getGithubActivityNotificationRank(a) - getGithubActivityNotificationRank(b);\n}\n\nfunction classifyGithubCommentActivityNotification(input: {\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n}): GithubActivityNotificationPlan | undefined {\n if (isBotOnlyActivity(input.snapshot)) return undefined;\n const pr = `${input.subscription.owner}/${input.subscription.repo}#${input.subscription.number}`;\n const summary = getCommentNotificationSummary(pr, input.snapshot);\n if (!summary) return undefined;\n return { kind: 'pull-request-activity', priority: 'high', summary };\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 const commentSummary = getCommentNotificationSummary(pr, input.snapshot);\n return {\n kind: 'pull-request-activity',\n priority: commentSummary ? 'high' : 'medium',\n summary: commentSummary ?? `${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 latestComments = await queryGitcrawlDb<{\n author_login?: string;\n author_type?: string;\n is_bot?: number;\n body?: string;\n html_url?: string;\n updated_at?: string;\n }>(`select c.author_login, c.author_type, c.is_bot, c.body, json_extract(c.raw_json, '$.html_url') as html_url,\n coalesce(c.updated_at_gh, c.created_at_gh) as updated_at\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 20`);\n const latestComment = latestComments[0];\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 latestCommentBody: sanitizeCommentBody(readString(latestComment?.body)),\n latestCommentUrl: readString(latestComment?.html_url),\n latestCommentUpdatedAt: readString(latestComment?.updated_at),\n latestComments: latestComments.map(comment => ({\n author: readString(comment.author_login),\n authorType: readString(comment.author_type),\n isBot: comment.is_bot === 1,\n body: sanitizeCommentBody(readString(comment.body)),\n url: readString(comment.html_url),\n updatedAt: readString(comment.updated_at),\n })),\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 readonly #permissionCache = new Map<string, { permission: GithubPermission; expiresAt: number }>();\n #agent?: GithubSignalAgent;\n #agentOptions: GithubSignalAgentOptions = {};\n #subscriptionsChangedHandler?: GithubSubscriptionsChangedHandler;\n #pollingChangedHandler?: GithubPollingChangedHandler;\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 onPollingChanged(handler: GithubPollingChangedHandler): void {\n this.#pollingChangedHandler = 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 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 runPoll({ includeComments: true });\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 isPollingThreadRunning(input: GithubPollingThread): boolean {\n return this.#polling.get(this.#pollingKey(input))?.running ?? false;\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<void> {\n const evidence = detectPrWorkEvidence({ text: args.text, toolCalls: args.toolCalls });\n if (!evidence) return;\n\n const threadContext = this.#getThreadContext(args);\n if (!threadContext.threadId || !threadContext.resourceId) return;\n\n const { threadStore, loadedThread } = await this.#loadThread(threadContext);\n const githubMetadata = getGithubMetadata(loadedThread.metadata);\n if (githubMetadata.subscriptionHintShown || githubMetadata.subscriptions.length > 0) return;\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;\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\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 const getExecutionThreadContext = (context?: GithubToolExecuteContext) => ({\n threadId: context?.agent?.threadId ?? threadContext.threadId,\n resourceId: context?.agent?.resourceId ?? threadContext.resourceId,\n });\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, context) => {\n const executionThreadContext = getExecutionThreadContext(context);\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: executionThreadContext.threadId,\n resourceId: executionThreadContext.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, context) => {\n const executionThreadContext = getExecutionThreadContext(context);\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: executionThreadContext.threadId,\n resourceId: executionThreadContext.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 #notifyPollingChanged(input: GithubPollingChangedEvent): void {\n this.#pollingChangedHandler?.(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 this.#notifyPollingChanged({ threadId: input.threadId, resourceId: input.resourceId, 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 let snapshot = syncResult.ok ? await this.#syncClient.getPullRequestSnapshot?.(syncInput) : undefined;\n if (snapshot)\n snapshot = await this.#filterUnauthorizedLatestComment(subscription.owner, subscription.repo, snapshot);\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 const latestCommentChanged =\n !!previousGithubUpdatedAt &&\n !!snapshot?.latestCommentUpdatedAt &&\n Date.parse(snapshot.latestCommentUpdatedAt) > Date.parse(previousGithubUpdatedAt);\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 latestCommentChanged ||\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 && snapshot) {\n const notifications = await this.#sendActivityNotifications({\n polling: input,\n subscription,\n snapshot,\n previousGithubUpdatedAt,\n previousContentHash,\n latestCommentChanged,\n });\n const primaryNotification = notifications[0];\n if (primaryNotification) {\n nextSubscription.lastNotificationAt = now;\n nextSubscription.lastNotificationKind = primaryNotification.kind;\n nextSubscription.lastNotificationPriority = primaryNotification.priority;\n nextSubscription.lastNotificationSummary = primaryNotification.summary;\n shouldKeepSubscription = notifications.every(notification => 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 this.#notifyPollingChanged({ threadId: input.threadId, resourceId: input.resourceId, running: false });\n }\n }\n\n #createGithubNotificationInput(input: {\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n notification: { kind: string; priority: 'medium' | 'high'; summary: string };\n dedupeSuffix: string;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n }) {\n const failingChecks = getFailingChecks(input.snapshot);\n const pendingChecks = getPendingChecks(input.snapshot);\n const latestCommentExcerpt = input.snapshot.latestCommentBody\n ? getCommentExcerpt(input.snapshot.latestCommentBody)\n : undefined;\n const latestCommentDedupeSuffix =\n input.notification.kind === 'pull-request-activity' && input.snapshot.latestCommentUrl\n ? `comment:${input.snapshot.latestCommentUrl}:${input.snapshot.latestCommentUpdatedAt ?? ''}`\n : input.dedupeSuffix;\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}:${latestCommentDedupeSuffix}`,\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 ...(input.snapshot.latestCommentAuthor ? { latestCommentAuthor: input.snapshot.latestCommentAuthor } : {}),\n ...(latestCommentExcerpt ? { latestCommentExcerpt } : {}),\n ...(input.snapshot.latestCommentUrl ? { latestCommentUrl: input.snapshot.latestCommentUrl } : {}),\n ...(input.snapshot.latestCommentUpdatedAt\n ? { latestCommentUpdatedAt: input.snapshot.latestCommentUpdatedAt }\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 // Intentionally omit the full latestCommentBody here: persisting it verbatim bloats\n // notification payloads (a single CodeRabbit comment can exceed 100KB) and can overflow\n // agent context windows when listed. The 240-char latestCommentExcerpt is stored instead.\n latestCommentExcerpt,\n latestCommentUrl: input.snapshot.latestCommentUrl,\n latestCommentUpdatedAt: input.snapshot.latestCommentUpdatedAt,\n failingChecks,\n pendingChecks,\n },\n },\n };\n return notificationInput;\n }\n\n async #sendGithubNotification(input: {\n agent?: GithubSignalAgent;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n notification: GithubActivityNotificationPlan;\n target: { resourceId: string; threadId: string };\n dedupeSuffix: string;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n }): Promise<void> {\n const notificationInput = this.#createGithubNotificationInput(input);\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 #isAuthorizedAuthor(\n owner: string,\n repo: string,\n user: string | undefined,\n metadata: { authorType?: string; isBot?: boolean } = {},\n ): Promise<boolean> {\n if (!user) return false;\n const normalizedUser = user.toLowerCase();\n const isBot =\n metadata.isBot === true || metadata.authorType?.toLowerCase() === 'bot' || normalizedUser.endsWith('[bot]');\n if (isBot) {\n const ignoredBots = this.#options.ignoredBots ?? [];\n if (ignoredBots.some(bot => bot.toLowerCase() === normalizedUser)) return false;\n const authorizedBots = this.#options.authorizedBots ?? DEFAULT_AUTHORIZED_BOTS;\n return authorizedBots.some(bot => bot.toLowerCase() === normalizedUser);\n }\n const permission = await this.#loadAuthorPermission(owner, repo, user);\n const authorizedPermissions = this.#options.authorizedPermissions ?? DEFAULT_AUTHORIZED_PERMISSIONS;\n return !!permission && authorizedPermissions.includes(permission);\n }\n\n async #filterUnauthorizedLatestComment(\n owner: string,\n repo: string,\n snapshot: GithubPullRequestSnapshot,\n ): Promise<GithubPullRequestSnapshot> {\n const comments = snapshot.latestComments?.length\n ? snapshot.latestComments\n : [\n {\n author: snapshot.latestCommentAuthor,\n authorType: snapshot.latestCommentAuthorType,\n isBot: snapshot.latestCommentIsBot,\n body: snapshot.latestCommentBody,\n url: snapshot.latestCommentUrl,\n updatedAt: snapshot.latestCommentUpdatedAt,\n },\n ];\n if (!comments.some(comment => comment.author)) return snapshot;\n if (!comments.some(comment => comment.body || comment.url || comment.updatedAt)) return snapshot;\n\n for (const comment of comments) {\n if (\n !(await this.#isAuthorizedAuthor(owner, repo, comment.author, {\n authorType: comment.authorType,\n isBot: comment.isBot,\n }))\n ) {\n continue;\n }\n return {\n ...snapshot,\n latestCommentAuthor: comment.author,\n latestCommentAuthorType: comment.authorType,\n latestCommentIsBot: comment.isBot,\n latestCommentBody: comment.body,\n latestCommentUrl: comment.url,\n latestCommentUpdatedAt: comment.updatedAt,\n };\n }\n\n return {\n ...snapshot,\n latestCommentAuthor: undefined,\n latestCommentAuthorType: undefined,\n latestCommentIsBot: undefined,\n latestCommentBody: undefined,\n latestCommentUrl: undefined,\n latestCommentUpdatedAt: undefined,\n };\n }\n\n async #loadAuthorPermission(owner: string, repo: string, user: string): Promise<GithubPermission | undefined> {\n const cacheKey = `${owner}/${repo}:${user.toLowerCase()}`;\n const cached = this.#permissionCache.get(cacheKey);\n if (cached && cached.expiresAt > Date.now()) return cached.permission;\n if (cached) this.#permissionCache.delete(cacheKey);\n\n try {\n let permission: GithubPermission | undefined;\n if (this.#options.permissionResolver) {\n permission = await this.#options.permissionResolver.getPermission(owner, repo, user);\n } else {\n const { stdout } = await execFileAsync('gh', [\n 'api',\n `repos/${owner}/${repo}/collaborators/${user}/permission`,\n '--jq',\n '.permission',\n ]);\n const raw = stdout.trim();\n permission = (['admin', 'maintain', 'write', 'triage', 'read', 'none'] as const).includes(\n raw as GithubPermission,\n )\n ? (raw as GithubPermission)\n : undefined;\n }\n if (permission) {\n this.#permissionCache.set(cacheKey, { permission, expiresAt: Date.now() + PERMISSION_CACHE_TTL_MS });\n }\n return permission;\n } catch {\n this.#permissionCache.delete(cacheKey);\n return undefined;\n }\n }\n\n async #sendActivityNotifications(input: {\n polling: GithubPollingThread;\n subscription: GithubPRSubscription;\n snapshot: GithubPullRequestSnapshot;\n previousGithubUpdatedAt?: string;\n previousContentHash?: string;\n latestCommentChanged?: boolean;\n }): Promise<Array<{ kind: string; priority: 'medium' | 'high'; summary: string }>> {\n const agent = this.#getNotificationAgent(input.polling);\n if (!agent?.sendNotificationSignal) return [];\n const notifications = [\n classifyGithubActivityNotification({\n subscription: input.subscription,\n snapshot: input.snapshot,\n }),\n ];\n if (input.latestCommentChanged && notifications[0]?.kind !== 'pull-request-activity') {\n notifications.push(\n classifyGithubCommentActivityNotification({\n subscription: input.subscription,\n snapshot: input.snapshot,\n }),\n );\n }\n\n const sent: GithubActivityNotificationPlan[] = [];\n const notificationInputs = [];\n for (const notification of notifications.sort(compareGithubActivityNotifications)) {\n if (!notification) continue;\n if (AUTHOR_GATED_NOTIFICATION_KINDS.has(notification.kind)) {\n const authorized = await this.#isAuthorizedAuthor(\n input.subscription.owner,\n input.subscription.repo,\n input.snapshot.latestCommentAuthor,\n {\n authorType: input.snapshot.latestCommentAuthorType,\n isBot: input.snapshot.latestCommentIsBot,\n },\n );\n if (!authorized) continue;\n }\n notificationInputs.push(\n this.#createGithubNotificationInput({\n subscription: input.subscription,\n snapshot: input.snapshot,\n notification,\n dedupeSuffix: input.snapshot.contentHash ?? input.snapshot.githubUpdatedAt ?? String(Date.now()),\n previousGithubUpdatedAt: input.previousGithubUpdatedAt,\n previousContentHash: input.previousContentHash,\n }),\n );\n sent.push(notification);\n }\n if (notificationInputs.length > 0) {\n const target = { resourceId: input.polling.resourceId, threadId: input.polling.threadId };\n const streamOptions = await this.#agentOptions.getNotificationStreamOptions?.(target);\n await agent.sendNotificationSignal(\n notificationInputs,\n streamOptions ? { ...target, ifIdle: { streamOptions } } : target,\n );\n }\n return sent;\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"]}