{"version":3,"file":"agents.cjs","names":[],"sources":["../src/providers/local-cli.ts","../src/providers/local-git-coauthor.ts","../src/providers/github-cli.ts","../src/providers/github-cli-coauthor.ts","../src/providers/gitlab-cli.ts","../src/snapshot/create.ts","../src/snapshot/write.ts"],"sourcesContent":["import { execFile } from \"node:child_process\";\nimport { promisify } from \"node:util\";\n\nimport type { CliRunner } from \"./types\";\n\nconst execFileAsync = promisify(execFile);\n\nexport const MAX_BUFFER = 64 * 1024 * 1024;\n\nconst AUTH_ENVIRONMENT_KEYS = new Set([\n  \"GH_TOKEN\",\n  \"GITHUB_TOKEN\",\n  \"GH_ENTERPRISE_TOKEN\",\n  \"GITHUB_ENTERPRISE_TOKEN\",\n  \"GLAB_TOKEN\",\n  \"GITLAB_TOKEN\",\n  \"GITLAB_ACCESS_TOKEN\",\n  \"OAUTH_TOKEN\",\n  \"CI_JOB_TOKEN\",\n]);\n\nexport const runLocalCli: CliRunner = async (executable, args) => {\n  const { stdout } = await execFileAsync(executable, [...args], {\n    env: withoutAuthEnvironment(process.env),\n    maxBuffer: MAX_BUFFER,\n  });\n  return stdout;\n};\n\nexport const withoutAuthEnvironment = (environment: NodeJS.ProcessEnv): NodeJS.ProcessEnv =>\n  Object.fromEntries(\n    Object.entries(environment).filter(([key]) => !AUTH_ENVIRONMENT_KEYS.has(key)),\n  );\n\nexport const parseCliJson = (provider: string, output: string): unknown => {\n  try {\n    return JSON.parse(output);\n  } catch {\n    throw new Error(`${provider} CLI returned invalid JSON`);\n  }\n};\n\nexport const runAuthenticatedCli = async (\n  provider: string,\n  loginHint: string,\n  runner: CliRunner,\n  executable: string,\n  args: readonly string[],\n): Promise<string> => {\n  try {\n    return await runner(executable, args);\n  } catch (error) {\n    const code = (error as NodeJS.ErrnoException).code;\n    const missing = code === \"ENOENT\" ? ` Install ${executable} first.` : \"\";\n    throw new Error(`${provider} CLI request failed.${missing} ${loginHint}`, { cause: error });\n  }\n};\n","import { execFile } from \"node:child_process\";\nimport { readdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { promisify } from \"node:util\";\n\nimport type { ContributionDay, FetchParams } from \"../types\";\nimport { validateDateRange } from \"../core/date\";\nimport { toCanonicalDays } from \"../core/normalize\";\nimport type { Provider } from \"./types\";\nimport type { AgentTrailerRule, CoAuthor } from \"./trailers\";\nimport { AGENT_TRAILER_RULES, matchAgent, parseCoAuthorValue, testStateless } from \"./trailers\";\nimport { MAX_BUFFER } from \"./local-cli\";\n\nconst execFileAsync = promisify(execFile);\n\nconst UNIT = \"\\x1f\";\nconst RECORD = \"\\x1e\";\nconst DEFAULT_MAX_DEPTH = 6;\n\nconst PRETTY = `format:%H${UNIT}%as${UNIT}%an${UNIT}%ae${UNIT}%(trailers:key=Co-authored-by,valueonly,separator=${RECORD})`;\n\nconst LOG_ARGS = [\"log\", \"--no-merges\", \"-i\", \"--grep=co-authored-by\", \"-z\", `--pretty=${PRETTY}`];\n\nexport interface GitAuthorIdentity {\n  name?: string | RegExp;\n  email?: string | RegExp;\n}\n\nexport type LocalGitRefScope = \"default\" | \"remote\" | \"all\";\n\nexport interface LocalGitCoAuthorProviderOptions {\n  repos?: string[];\n  roots?: string[];\n  identities?: readonly GitAuthorIdentity[];\n  refScope?: LocalGitRefScope;\n  strict?: boolean;\n  maxDepth?: number;\n  rules?: readonly AgentTrailerRule[];\n  git?: string;\n  name?: string;\n}\n\ninterface ResolvedLocalGitConfig {\n  repos: string[];\n  roots: string[];\n  identities: readonly GitAuthorIdentity[];\n  refScope: LocalGitRefScope;\n  strict: boolean;\n  maxDepth: number;\n  rules: readonly AgentTrailerRule[];\n  git: string;\n}\n\ninterface CommitInfo {\n  date: string;\n  keys: Set<string>;\n}\n\nconst isENOENT = (error: unknown): boolean =>\n  typeof error === \"object\" && error !== null && (error as { code?: string }).code === \"ENOENT\";\n\nexport const localGitCoAuthorProvider = (options: LocalGitCoAuthorProviderOptions): Provider => {\n  const config: ResolvedLocalGitConfig = {\n    repos: options.repos ?? [],\n    roots: options.roots ?? [],\n    identities: options.identities?.filter(hasIdentityMatcher) ?? [],\n    refScope: options.refScope ?? \"default\",\n    strict: options.strict ?? false,\n    maxDepth: options.maxDepth ?? DEFAULT_MAX_DEPTH,\n    rules: options.rules ?? AGENT_TRAILER_RULES,\n    git: options.git ?? \"git\",\n  };\n\n  if (config.repos.length === 0 && config.roots.length === 0) {\n    throw new Error(\"localGitCoAuthorProvider requires at least one of `repos` or `roots`\");\n  }\n\n  return {\n    name: options.name ?? \"local-git\",\n    fetchEvents: (params) => fetchEvents(config, params),\n  };\n};\n\nconst fetchEvents = async (\n  config: ResolvedLocalGitConfig,\n  params: FetchParams,\n): Promise<ContributionDay[]> => {\n  validateDateRange(params.start, params.end);\n\n  await ensureGit(config);\n\n  const repos = resolveRepos(config);\n  const commits = new Map<string, CommitInfo>();\n\n  for (const repo of repos) {\n    try {\n      const identities =\n        config.identities.length > 0\n          ? config.identities\n          : await readConfiguredIdentity(config, repo);\n      collectRepo(config, await readRepo(config, repo), commits, identities);\n    } catch (error) {\n      if (config.strict) {\n        throw new Error(`localGitCoAuthorProvider could not scan repository: ${repo}`, {\n          cause: error,\n        });\n      }\n      continue;\n    }\n  }\n\n  return toCanonicalDays(toDays(commits, params.start, params.end), params.start, params.end);\n};\n\nconst ensureGit = async (config: ResolvedLocalGitConfig): Promise<void> => {\n  try {\n    await execFileAsync(config.git, [\"--version\"], { maxBuffer: MAX_BUFFER });\n  } catch (error) {\n    if (isENOENT(error)) {\n      throw new Error(\n        `localGitCoAuthorProvider: git executable \"${config.git}\" was not found in PATH`,\n        { cause: error },\n      );\n    }\n    throw error;\n  }\n};\n\nconst resolveRepos = (config: ResolvedLocalGitConfig): string[] => {\n  const discovered = config.roots.flatMap((root) => discoverRepos(root, config.maxDepth));\n  return Array.from(new Set([...config.repos, ...discovered]));\n};\n\nconst readRepo = async (config: ResolvedLocalGitConfig, cwd: string): Promise<string> => {\n  const refs = await resolveLogRefs(config, cwd);\n  if (refs.length === 0) return \"\";\n  const { stdout } = await execFileAsync(config.git, [...LOG_ARGS, ...refs], {\n    cwd,\n    maxBuffer: MAX_BUFFER,\n  });\n  return stdout;\n};\n\nconst readConfiguredIdentity = async (\n  config: ResolvedLocalGitConfig,\n  cwd: string,\n): Promise<readonly GitAuthorIdentity[]> => {\n  const read = async (key: \"user.name\" | \"user.email\"): Promise<string | undefined> => {\n    try {\n      const { stdout } = await execFileAsync(config.git, [\"config\", \"--get\", key], {\n        cwd,\n        maxBuffer: MAX_BUFFER,\n      });\n      return stdout.trim() || undefined;\n    } catch {\n      return undefined;\n    }\n  };\n  const [name, email] = await Promise.all([read(\"user.name\"), read(\"user.email\")]);\n  return name || email ? [{ ...(name ? { name } : {}), ...(email ? { email } : {}) }] : [];\n};\n\nconst resolveLogRefs = async (config: ResolvedLocalGitConfig, cwd: string): Promise<string[]> => {\n  if (config.refScope === \"all\") return [\"--all\"];\n  if (config.refScope === \"remote\") return [\"--remotes\"];\n\n  const { stdout } = await execFileAsync(\n    config.git,\n    [\"for-each-ref\", \"--format=%(symref:short)\", \"refs/remotes/*/HEAD\"],\n    { cwd, maxBuffer: MAX_BUFFER },\n  );\n  const symbolicDefaults = stdout\n    .split(/\\r?\\n/)\n    .map((ref) => ref.trim())\n    .filter((ref) => ref.length > 0);\n  if (symbolicDefaults.length > 0) return symbolicDefaults;\n\n  const remotes = await listRemotes(config, cwd);\n  const conventionalDefaults = (\n    await Promise.all(\n      remotes.flatMap((remote) =>\n        [\"main\", \"master\"].map(async (branch) => {\n          const ref = `refs/remotes/${remote}/${branch}`;\n          try {\n            await execFileAsync(config.git, [\"rev-parse\", \"--verify\", \"--quiet\", ref], {\n              cwd,\n              maxBuffer: MAX_BUFFER,\n            });\n            return ref;\n          } catch {\n            return null;\n          }\n        }),\n      ),\n    )\n  ).filter((ref): ref is string => ref !== null);\n\n  return conventionalDefaults;\n};\n\nconst listRemotes = async (config: ResolvedLocalGitConfig, cwd: string): Promise<string[]> => {\n  const { stdout } = await execFileAsync(config.git, [\"remote\"], { cwd, maxBuffer: MAX_BUFFER });\n  return stdout\n    .split(/\\r?\\n/)\n    .map((remote) => remote.trim())\n    .filter((remote) => remote.length > 0);\n};\n\nconst collectRepo = (\n  config: ResolvedLocalGitConfig,\n  stdout: string,\n  commits: Map<string, CommitInfo>,\n  identities: readonly GitAuthorIdentity[],\n): void => {\n  for (const record of stdout.split(\"\\0\")) {\n    if (record.length === 0) continue;\n    const [sha, date, authorName, authorEmail, blob = \"\"] = record.split(UNIT);\n    if (!sha || !date || commits.has(sha)) continue;\n\n    const author = { name: authorName ?? \"\", email: authorEmail ?? \"\" };\n    const coAuthors = blob\n      .split(RECORD)\n      .map((value) => (value.trim().length === 0 ? null : parseCoAuthorValue(value)))\n      .filter((coAuthor): coAuthor is CoAuthor => coAuthor !== null);\n    const belongsToUser = [author, ...coAuthors].some((person) =>\n      matchesAnyIdentity(person, identities),\n    );\n    if (!belongsToUser) continue;\n\n    const keys = new Set<string>();\n    for (const person of [author, ...coAuthors]) {\n      const key = matchAgent(person, config.rules);\n      if (key) keys.add(key);\n    }\n\n    commits.set(sha, { date, keys });\n  }\n};\n\nconst toDays = (\n  commits: Map<string, CommitInfo>,\n  start: string,\n  end: string,\n): ContributionDay[] => {\n  const buckets = new Map<string, { count: number; sources: Record<string, number> }>();\n\n  for (const { date, keys } of commits.values()) {\n    if (keys.size === 0 || date < start || date > end) continue;\n    const bucket = buckets.get(date) ?? { count: 0, sources: {} };\n    bucket.count += 1;\n    for (const key of keys) bucket.sources[key] = (bucket.sources[key] ?? 0) + 1;\n    buckets.set(date, bucket);\n  }\n\n  return Array.from(buckets.entries()).map(([date, { count, sources }]) => ({\n    date,\n    count,\n    sources,\n  }));\n};\n\nconst discoverRepos = (root: string, maxDepth: number): string[] => {\n  const found: string[] = [];\n\n  const walk = (dir: string, depth: number): void => {\n    let entries: import(\"node:fs\").Dirent[];\n    try {\n      entries = readdirSync(dir, { withFileTypes: true });\n    } catch {\n      return;\n    }\n\n    if (entries.some((entry) => entry.name === \".git\")) {\n      found.push(dir);\n      return;\n    }\n\n    if (depth >= maxDepth) return;\n\n    for (const entry of entries) {\n      if (!entry.isDirectory() || entry.name === \"node_modules\" || entry.name === \".git\") continue;\n      walk(join(dir, entry.name), depth + 1);\n    }\n  };\n\n  walk(root, 0);\n  return found;\n};\n\nconst hasIdentityMatcher = (identity: GitAuthorIdentity): boolean =>\n  [identity.name, identity.email].some((value) =>\n    typeof value === \"string\" ? value.trim().length > 0 : value instanceof RegExp,\n  );\n\nconst matchesIdentityField = (value: string, expected: string | RegExp | undefined): boolean => {\n  if (expected === undefined) return true;\n  if (expected instanceof RegExp) return testStateless(expected, value);\n  return value.toLowerCase() === expected.trim().toLowerCase();\n};\n\nconst matchesAnyIdentity = (person: CoAuthor, identities: readonly GitAuthorIdentity[]): boolean =>\n  identities.some(\n    (identity) =>\n      hasIdentityMatcher(identity) &&\n      matchesIdentityField(person.name, identity.name) &&\n      matchesIdentityField(person.email, identity.email),\n  );\n","import type { CliRunner, Provider } from \"./types\";\nimport { parseCliJson, runAuthenticatedCli, runLocalCli } from \"./local-cli\";\nimport {\n  CONTRIBUTIONS_QUERY,\n  fetchContributionCalendar,\n  type GitHubGraphQLRequest,\n  type GitHubGraphQLResponse,\n} from \"./shared/github-graphql\";\n\nexport interface GitHubCliProviderOptions {\n  host?: string;\n  cli?: string;\n  runner?: CliRunner;\n  name?: string;\n}\n\nexport const githubCliProvider = (options: GitHubCliProviderOptions = {}): Provider => {\n  const host = options.host ?? \"github.com\";\n  const cli = options.cli ?? \"gh\";\n  const runner = options.runner ?? runLocalCli;\n\n  const request: GitHubGraphQLRequest = async (variables) => {\n    const output = await runAuthenticatedCli(\n      \"GitHub\",\n      `Run \\`${cli} auth login --hostname ${host}\\` locally.`,\n      runner,\n      cli,\n      [\n        \"api\",\n        \"--hostname\",\n        host,\n        \"graphql\",\n        \"-f\",\n        `query=${CONTRIBUTIONS_QUERY}`,\n        \"-F\",\n        `login=${variables.login}`,\n        \"-F\",\n        `from=${variables.from}`,\n        \"-F\",\n        `to=${variables.to}`,\n      ],\n    );\n    return parseCliJson(\"GitHub\", output) as GitHubGraphQLResponse;\n  };\n\n  return {\n    name: options.name ?? \"github\",\n    fetchEvents: (params) => fetchContributionCalendar(request, params),\n  };\n};\n","import type { CliRunner, Provider } from \"./types\";\nimport { parseCliJson, runAuthenticatedCli, runLocalCli } from \"./local-cli\";\nimport { resolveAgentMatches } from \"./trailers\";\nimport {\n  fetchCoAuthorDays,\n  PER_PAGE,\n  type CommitSearchRequest,\n  type CommitSearchResponse,\n} from \"./shared/commit-search\";\n\nexport interface GitHubCliCoAuthorProviderOptions {\n  agents?: string[];\n  host?: string;\n  cli?: string;\n  runner?: CliRunner;\n  name?: string;\n}\n\nexport const githubCliCoAuthorProvider = (\n  options: GitHubCliCoAuthorProviderOptions = {},\n): Provider => {\n  const matches = resolveAgentMatches(options.agents);\n  const host = options.host ?? \"github.com\";\n  const cli = options.cli ?? \"gh\";\n  const runner = options.runner ?? runLocalCli;\n\n  const request: CommitSearchRequest = async (query, page) => {\n    const output = await runAuthenticatedCli(\n      \"GitHub\",\n      `Run \\`${cli} auth login --hostname ${host}\\` locally.`,\n      runner,\n      cli,\n      [\n        \"api\",\n        \"--hostname\",\n        host,\n        \"--method\",\n        \"GET\",\n        \"search/commits\",\n        \"-f\",\n        `q=${query}`,\n        \"-f\",\n        `per_page=${PER_PAGE}`,\n        \"-f\",\n        `page=${page}`,\n      ],\n    );\n    return parseCliJson(\"GitHub\", output) as CommitSearchResponse;\n  };\n\n  return {\n    name: options.name ?? \"github-agents\",\n    fetchEvents: (params) => fetchCoAuthorDays(request, matches, params),\n  };\n};\n","import type { CliRunner, Provider } from \"./types\";\nimport { parseCliJson, runAuthenticatedCli, runLocalCli } from \"./local-cli\";\nimport { fetchGitLabDays, type GitLabRequest } from \"./shared/gitlab-events\";\n\nexport interface GitLabCliProviderOptions {\n  host?: string;\n  cli?: string;\n  runner?: CliRunner;\n  name?: string;\n}\n\nexport const gitlabCliProvider = (options: GitLabCliProviderOptions = {}): Provider => {\n  const host = options.host ?? \"gitlab.com\";\n  const cli = options.cli ?? \"glab\";\n  const runner = options.runner ?? runLocalCli;\n\n  const request: GitLabRequest = async <T>(path: string): Promise<T> => {\n    const output = await runAuthenticatedCli(\n      \"GitLab\",\n      `Run \\`${cli} auth login --hostname ${host} --use-keyring\\` locally.`,\n      runner,\n      cli,\n      [\"api\", \"--hostname\", host, path],\n    );\n    return parseCliJson(\"GitLab\", output) as T;\n  };\n\n  return {\n    name: options.name ?? \"gitlab\",\n    fetchEvents: (params) => fetchGitLabDays(request, params),\n  };\n};\n","import type { ContributionDay } from \"../types\";\nimport { isValidDateString, validateDateRange } from \"../core/date\";\n\nexport const STREAKR_SNAPSHOT_SCHEMA_VERSION = 1 as const;\n\nexport interface PublicStreakrSnapshot {\n  schemaVersion: typeof STREAKR_SNAPSHOT_SCHEMA_VERSION;\n  generatedAt: string;\n  range: { start: string; end: string };\n  activity: Record<string, PublicContributionDay[]>;\n  agents: PublicAgentDay[];\n}\n\nexport interface PublicContributionDay {\n  date: string;\n  count: number;\n}\n\nexport interface PublicAgentDay extends PublicContributionDay {\n  sources: Record<string, number>;\n}\n\nexport interface CreatePublicSnapshotOptions {\n  generatedAt?: string;\n  range: { start: string; end: string };\n  activity: Record<string, readonly ContributionDay[]>;\n  agents: readonly ContributionDay[];\n}\n\nconst SOURCE_KEY = /^[a-z0-9][a-z0-9._-]*$/i;\n\nexport const createPublicSnapshot = (\n  options: CreatePublicSnapshotOptions,\n): PublicStreakrSnapshot => {\n  validateDateRange(options.range.start, options.range.end);\n  const generatedAt = options.generatedAt ?? new Date().toISOString();\n  if (Number.isNaN(Date.parse(generatedAt))) throw new Error(\"Invalid snapshot generation date\");\n\n  const activity = Object.fromEntries(\n    Object.entries(options.activity).map(([source, days]) => {\n      validateSourceKey(source);\n      return [source, sanitizeDays(days, options.range)];\n    }),\n  );\n  const agents = sanitizeAgentDays(options.agents, options.range);\n\n  return {\n    schemaVersion: STREAKR_SNAPSHOT_SCHEMA_VERSION,\n    generatedAt,\n    range: { ...options.range },\n    activity,\n    agents,\n  };\n};\n\nconst sanitizeDays = (\n  days: readonly ContributionDay[],\n  range: CreatePublicSnapshotOptions[\"range\"],\n): PublicContributionDay[] =>\n  days\n    .map(({ date, count }) => {\n      validateDay(date, count, range);\n      return { date, count };\n    })\n    .filter(({ count }) => count > 0)\n    .sort((left, right) => left.date.localeCompare(right.date));\n\nconst sanitizeAgentDays = (\n  days: readonly ContributionDay[],\n  range: CreatePublicSnapshotOptions[\"range\"],\n): PublicAgentDay[] =>\n  days\n    .map(({ date, count, sources = {} }) => {\n      validateDay(date, count, range);\n      const publicSources = Object.fromEntries(\n        Object.entries(sources)\n          .map(([source, sourceCount]) => {\n            validateSourceKey(source);\n            validateCount(sourceCount);\n            return [source, sourceCount] as const;\n          })\n          .filter(([, sourceCount]) => sourceCount > 0),\n      );\n      return { date, count, sources: publicSources };\n    })\n    .filter(({ count, sources }) => count > 0 && Object.keys(sources).length > 0)\n    .sort((left, right) => left.date.localeCompare(right.date));\n\nconst validateDay = (\n  date: string,\n  count: number,\n  range: CreatePublicSnapshotOptions[\"range\"],\n): void => {\n  if (!isValidDateString(date)) throw new Error(`Invalid contribution date: ${date}`);\n  if (date < range.start || date > range.end) {\n    throw new Error(`Contribution date ${date} is outside snapshot range`);\n  }\n  validateCount(count);\n};\n\nconst validateCount = (count: number): void => {\n  if (!Number.isSafeInteger(count) || count < 0) {\n    throw new Error(\"Contribution count must be a non-negative integer\");\n  }\n};\n\nconst validateSourceKey = (source: string): void => {\n  if (!SOURCE_KEY.test(source)) throw new Error(`Invalid public source key: ${source}`);\n};\n","import { randomUUID } from \"node:crypto\";\nimport { mkdir, rename, rm, writeFile } from \"node:fs/promises\";\nimport { basename, dirname, join } from \"node:path\";\n\nimport type { PublicStreakrSnapshot } from \"./create\";\n\nexport const writePublicSnapshot = async (\n  outputPath: string,\n  snapshot: PublicStreakrSnapshot,\n): Promise<void> => {\n  const directory = dirname(outputPath);\n  await mkdir(directory, { recursive: true });\n  const temporary = join(directory, `.${basename(outputPath)}.${randomUUID()}.tmp`);\n  try {\n    await writeFile(temporary, `${JSON.stringify(snapshot, null, 2)}\\n`, {\n      encoding: \"utf8\",\n      mode: 0o600,\n    });\n    await rename(temporary, outputPath);\n  } finally {\n    await rm(temporary, { force: true });\n  }\n};\n"],"mappings":"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"}