@almadar/integrations 2.25.0 → 2.26.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,4 +1,4 @@
1
- import { e as IntegrationParams, B as BaseIntegration, I as IntegrationConfig, f as IntegrationResult } from '../../BaseIntegration-MA-b4fh8.js';
1
+ import { g as IntegrationParams, B as BaseIntegration, a as IntegrationConfig, h as IntegrationResult } from '../../BaseIntegration-C_5q54DM.js';
2
2
  import '@almadar/core';
3
3
 
4
4
  /**
@@ -22,6 +22,7 @@ var ConsoleLogger = class {
22
22
  this.log.error(message, meta);
23
23
  }
24
24
  };
25
+ var RESERVED_ENVELOPE_KEYS = /* @__PURE__ */ new Set(["emit", "onSuccess", "onError", "timeout"]);
25
26
  function validateParams(integration, action, params) {
26
27
  const typedRegistry = integratorsRegistry;
27
28
  const registry = typedRegistry.integrators[integration];
@@ -44,6 +45,16 @@ function validateParams(integration, action, params) {
44
45
  };
45
46
  }
46
47
  const errors = [];
48
+ const declaredNames = new Set(actionDef.params.map((p) => p.name));
49
+ for (const key of Object.keys(params)) {
50
+ if (RESERVED_ENVELOPE_KEYS.has(key)) continue;
51
+ if (!declaredNames.has(key)) {
52
+ errors.push({
53
+ param: key,
54
+ message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(", ")})`
55
+ });
56
+ }
57
+ }
47
58
  for (const paramDef of actionDef.params) {
48
59
  if (paramDef.required && !(paramDef.name in params)) {
49
60
  errors.push({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/core/logger.ts","../../../src/core/validation.ts","../../../src/core/retry.ts","../../../src/core/BaseIntegration.ts","../../../src/types.ts","../../../src/integrations/github/github-git.ts","../../../src/integrations/github/github-api.ts","../../../src/integrations/github/index.ts"],"names":["fs"],"mappings":"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","file":"index.js","sourcesContent":["import { createLogger, type Logger } from '@almadar/logger';\nimport type { IntegrationLogger, LogMeta } from '../types';\n\n/**\n * Console-based logger implementation.\n *\n * Routes through `@almadar/logger`'s shared gate so namespace filtering\n * (`ALMADAR_DEBUG`, `globalThis.__ALMADAR_DEBUG__`) and the production\n * level default (WARN+) apply uniformly with the rest of `@almadar/*`.\n *\n * The constructor's `level` argument is retained for backwards\n * compatibility but is now a no-op — the active level is owned by the\n * shared logger (compile-time + env). To filter integration logs at\n * runtime, set `globalThis.__ALMADAR_DEBUG__ = 'almadar:integrations:*'`.\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private readonly log: Logger;\n\n constructor(_level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n void _level;\n this.log = createLogger('almadar:integrations');\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.log.debug(message, meta);\n }\n info(message: string, meta?: LogMeta): void {\n this.log.info(message, meta);\n }\n warn(message: string, meta?: LogMeta): void {\n this.log.warn(message, meta);\n }\n error(message: string, meta?: LogMeta): void {\n this.log.error(message, meta);\n }\n}\n","import type { ValidationResult, ValidationError, IntegrationParams } from '../types';\n\n// Import integrators registry from the package main export (JSON is inlined in the bundle)\nimport { integratorsRegistry } from '@almadar/core/patterns';\n\ninterface ActionParam {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\ninterface ActionDef {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface IntegratorEntry {\n name: string;\n description?: string;\n category?: string;\n actions: ActionDef[];\n}\n\ntype IntegratorsRegistry = Record<string, {\n version?: string;\n exportedAt?: string;\n integrators: Record<string, IntegratorEntry>;\n}>;\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: IntegrationParams,\n): ValidationResult {\n const typedRegistry = integratorsRegistry as IntegratorsRegistry[string];\n const registry = typedRegistry.integrators[integration];\n\n if (!registry) {\n return {\n valid: false,\n errors: [\n {\n param: 'integration',\n message: `Unknown integration: ${integration}`,\n },\n ],\n };\n }\n\n const actionDef = registry.actions.find((a: ActionDef) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n IntegrationParams,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action\n */\n abstract execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: IntegrationParams,\n ): ReturnType<typeof validateParams> {\n return validateParams(this.config.name, action, params);\n }\n\n /**\n * Handle errors uniformly\n */\n protected handleError(action: string, error: unknown): IntegrationResult {\n this.logger.error(`Integration error in ${this.config.name}.${action}`, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n const integrationError =\n error instanceof Error\n ? error\n : new Error(String(error));\n\n return {\n success: false,\n error: integrationError as IntegrationError,\n metadata: this.createMetadata(action, 0, 0),\n };\n }\n\n /**\n * Create metadata for result\n */\n protected createMetadata(\n action: string,\n duration: number,\n retries: number = 0,\n ): IntegrationResult['metadata'] {\n return {\n integration: this.config.name,\n action,\n duration,\n retries,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute with retry logic\n */\n protected async executeWithRetry<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n if (!this.config.retry) {\n return fn();\n }\n\n return withRetry(fn, {\n maxAttempts: this.config.retry.maxAttempts,\n backoffMs: this.config.retry.backoffMs,\n maxBackoffMs: this.config.retry.maxBackoffMs,\n retryableErrors: [\n 'TIMEOUT_ERROR',\n 'NETWORK_ERROR',\n 'RATE_LIMIT_ERROR',\n ],\n });\n }\n}\n","/**\n * Core types for Almadar integrations\n */\n\n/**\n * Configuration for an integration instance\n */\nexport interface IntegrationConfig {\n /** Integration name (matches registry) */\n name: string;\n\n /** Environment variables (API keys, secrets) */\n env: Record<string, string>;\n\n /** Optional logger */\n logger?: IntegrationLogger;\n\n /** Optional rate limiting config */\n rateLimit?: {\n requestsPerSecond: number;\n burstSize: number;\n };\n\n /** Optional timeout (ms) */\n timeout?: number;\n\n /** Optional retry config */\n retry?: {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n };\n}\n\n/**\n * Result of an integration action call\n */\nexport interface IntegrationResult<T = unknown> {\n /** Success flag */\n success: boolean;\n\n /** Response data (on success) */\n data?: T;\n\n /** Error (on failure) */\n error?: IntegrationError;\n\n /** Metadata (timing, retries, etc.) */\n metadata: {\n integration: string;\n action: string;\n duration: number;\n retries: number;\n timestamp: number;\n };\n}\n\n/**\n * Integration error codes\n */\nexport type IntegrationErrorCode =\n | 'VALIDATION_ERROR'\n | 'AUTH_ERROR'\n | 'RATE_LIMIT_ERROR'\n | 'TIMEOUT_ERROR'\n | 'NETWORK_ERROR'\n | 'SERVICE_ERROR'\n | 'UNKNOWN_ERROR';\n\n/**\n * Integration error\n */\nexport class IntegrationError extends Error {\n code: IntegrationErrorCode;\n integration?: string;\n action?: string;\n details?: unknown;\n\n constructor(\n message: string,\n code: IntegrationErrorCode = 'UNKNOWN_ERROR',\n details?: unknown,\n ) {\n super(message);\n this.name = 'IntegrationError';\n this.code = code;\n this.details = details;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n integration: this.integration,\n action: this.action,\n details: this.details,\n };\n }\n}\n\nimport type { LogMeta } from '@almadar/core';\n\n/** Re-export LogMeta from @almadar/core as the canonical log metadata type. */\nexport type { LogMeta };\n\n/**\n * Logger interface\n */\nexport interface IntegrationLogger {\n debug(message: string, meta?: LogMeta): void;\n info(message: string, meta?: LogMeta): void;\n warn(message: string, meta?: LogMeta): void;\n error(message: string, meta?: LogMeta): void;\n}\n\n/**\n * Integration action parameters.\n * Each integration's execute() method receives params as this type.\n * Individual methods cast to specific param shapes from their contracts.\n *\n * Per-key value union is widened to admit `@almadar/core`'s `FieldValue`\n * shape (entity / payload values flowing into call-service args): `Date`\n * for date fields, `IntegrationParams[]` for nested object arrays, and a\n * raw-value array catch-all so `string[]` / `number[]` / mixed payload\n * arrays satisfy the index signature without requiring `as unknown as`\n * casts at the call site. Adapters narrow these to their canonical input\n * types (typically JSON-string serialisation for `Date`).\n */\nexport type IntegrationParamValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | ReadonlyArray<IntegrationParamValue>\n | { readonly [key: string]: IntegrationParamValue };\n\nexport interface IntegrationParams {\n [key: string]: IntegrationParamValue;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n param: string;\n message: string;\n}\n","/**\n * Git CLI operations for GitHub integration\n */\n\nimport { spawn } from 'child_process';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubInitParams,\n GitHubPullParams,\n GitHubPullResult,\n GitHubAddRemoteParams,\n GitHubSetUserConfigParams,\n GitHubRenameBranchParams,\n} from './types';\nimport type { GitHubCommit } from './github-api';\n\n/**\n * Execute a git command\n */\nasync function execGit(\n args: string[],\n cwd: string,\n env?: Record<string, string>\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const proc = spawn('git', args, {\n cwd,\n env: { ...process.env, ...env },\n stdio: 'pipe',\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n } else {\n reject(\n new IntegrationError(\n `Git command failed: ${args.join(' ')}\\n${stderr}`,\n 'SERVICE_ERROR',\n { code, stderr }\n )\n );\n }\n });\n\n proc.on('error', (error) => {\n reject(\n new IntegrationError(\n `Failed to execute git: ${error.message}`,\n 'SERVICE_ERROR',\n { error }\n )\n );\n });\n });\n}\n\n/**\n * Clone a repository\n */\nexport async function cloneRepo(\n params: GitHubCloneParams,\n token: string\n): Promise<void> {\n const { repoUrl, targetDir, branch, depth = 1 } = params;\n\n // Inject token into URL for authentication\n const authUrl = injectTokenIntoUrl(repoUrl, token);\n\n const args = ['clone'];\n\n if (depth > 0) {\n args.push('--depth', depth.toString());\n }\n\n if (branch) {\n args.push('--branch', branch);\n }\n\n args.push(authUrl, targetDir);\n\n try {\n await execGit(args, process.cwd());\n\n // Immediately scrub the token from git config\n await scrubTokenFromRemote(targetDir, repoUrl);\n } catch (error) {\n throw new IntegrationError(\n `Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { repoUrl, error }\n );\n }\n}\n\n/**\n * Create a new branch\n */\nexport async function createBranch(\n params: GitHubCreateBranchParams,\n workDir: string\n): Promise<void> {\n const { branchName, baseBranch } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // If baseBranch is specified, check it out first\n if (baseBranch) {\n await execGit(['checkout', baseBranch], cwd);\n }\n\n // Create and checkout new branch\n await execGit(['checkout', '-b', branchName], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to create branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, baseBranch, error }\n );\n }\n}\n\n/**\n * Commit changes\n */\nexport async function commit(\n params: GitHubCommitParams,\n workDir: string\n): Promise<void> {\n const { message, files } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // Stage files\n if (files && files.length > 0) {\n await execGit(['add', ...files], cwd);\n } else {\n // Stage all changes\n await execGit(['add', '.'], cwd);\n }\n\n // Commit\n await execGit(['commit', '-m', message], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { message, error }\n );\n }\n}\n\n/**\n * Push branch to remote\n */\nexport async function push(\n params: GitHubPushParams,\n workDir: string,\n token: string\n): Promise<void> {\n const { branchName, force = false } = params;\n const cwd = params.workDir || workDir;\n\n // Security: Never allow force push to protected branches\n const protectedBranches = ['main', 'master', 'production', 'prod'];\n if (force && protectedBranches.includes(branchName.toLowerCase())) {\n throw new IntegrationError(\n `Force push to protected branch '${branchName}' is not allowed`,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // Create a temporary credential helper script\n const credHelper = await createTempCredentialHelper(token);\n\n const args = ['push'];\n\n if (force) {\n args.push('--force');\n }\n\n args.push('-u', 'origin', branchName);\n\n // Use GIT_ASKPASS for authentication\n await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n\n // Clean up credential helper\n await fs.unlink(credHelper);\n } catch (error) {\n throw new IntegrationError(\n `Failed to push: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, error }\n );\n }\n}\n\n/**\n * Inject token into repository URL for authentication\n */\nfunction injectTokenIntoUrl(repoUrl: string, token: string): string {\n const url = new URL(repoUrl);\n url.username = 'x-access-token';\n url.password = token;\n return url.toString();\n}\n\n/**\n * Remove token from git remote URL (security measure)\n */\nasync function scrubTokenFromRemote(workDir: string, originalUrl: string): Promise<void> {\n try {\n // Parse the URL to ensure it's clean (no credentials)\n const url = new URL(originalUrl);\n url.username = '';\n url.password = '';\n const cleanUrl = url.toString();\n\n await execGit(['remote', 'set-url', 'origin', cleanUrl], workDir);\n } catch (error) {\n // Log but don't fail - the clone succeeded\n console.error('Warning: Failed to scrub token from remote URL:', error);\n }\n}\n\n/**\n * Create a temporary credential helper script for GIT_ASKPASS\n */\nasync function createTempCredentialHelper(token: string): Promise<string> {\n const tmpDir = process.env.TMPDIR || '/tmp';\n const helperPath = join(tmpDir, `git-cred-${Date.now()}.sh`);\n\n const script = `#!/bin/sh\\necho \"${token}\"`;\n\n await fs.writeFile(helperPath, script, { mode: 0o700 });\n\n return helperPath;\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['branch', '--show-current'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get current branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Check if working directory has uncommitted changes\n */\nexport async function hasUncommittedChanges(workDir: string): Promise<boolean> {\n try {\n const { stdout } = await execGit(['status', '--porcelain'], workDir);\n return stdout.trim().length > 0;\n } catch (error) {\n throw new IntegrationError(\n `Failed to check git status: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Initialize a git repository in `workDir`. No-op when `.git/` already\n * exists. The default initial branch is `main` to match what GitHub\n * creates for new repos.\n */\nexport async function init(params: GitHubInitParams): Promise<void> {\n const { workDir, initialBranch = 'main' } = params;\n try {\n // `git init -b <branch>` works on git >= 2.28; the runtime ships 2.x.\n // The command is idempotent — re-running on an existing repo just\n // re-asserts the initial branch ref (no error).\n await execGit(['init', '-b', initialBranch], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to git init: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { workDir, error }\n );\n }\n}\n\n/**\n * Add a remote to the repository. Used after `init` to attach the\n * freshly-created GitHub remote as `origin`.\n */\nexport async function addRemote(params: GitHubAddRemoteParams): Promise<void> {\n const { name, url, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n throw new IntegrationError(\n `addRemote requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n try {\n await execGit(['remote', 'add', name, url], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to add remote ${name}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { name, error }\n );\n }\n}\n\n/**\n * Set `user.name` and `user.email` for git commits. Scope defaults to\n * per-repo (`--local`) so each workspace can carry the GitHub identity\n * of the user who owns it — global config would clobber the developer's\n * own machine settings.\n */\nexport async function setUserConfig(params: GitHubSetUserConfigParams): Promise<void> {\n const { userName, userEmail, scope = 'local', workDir } = params;\n const scopeFlag = scope === 'global' ? '--global' : '--local';\n if (scope === 'local' && !workDir) {\n throw new IntegrationError(\n `setUserConfig with scope='local' requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n const cwd = workDir ?? process.cwd();\n try {\n await execGit(['config', scopeFlag, 'user.name', userName], cwd);\n await execGit(['config', scopeFlag, 'user.email', userEmail], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to set git user config: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Pull from the remote. Returns a structured outcome so callers can\n * tell \"the workspace advanced\" from \"nothing changed because <X>\"\n * without parsing git's stderr. Best-effort posture: network / conflict\n * / no-upstream all resolve cleanly rather than throwing — the caller\n * decides whether to surface the no-op as user-facing.\n */\nexport async function pull(\n params: GitHubPullParams,\n token: string,\n): Promise<GitHubPullResult> {\n const { branchName, ffOnly = true, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n return { updated: false, reason: 'no-upstream' };\n }\n\n let credHelper: string | null = null;\n try {\n credHelper = await createTempCredentialHelper(token);\n const args = ['pull'];\n if (ffOnly) args.push('--ff-only');\n args.push('origin', branchName);\n\n const { stdout } = await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n // `git pull` prints \"Already up to date.\" when there's nothing to\n // fetch. Anything else (Updating, Fast-forward, +n -m line) means\n // the working tree actually moved.\n const updated = !/^Already up to date\\.?\\s*$/m.test(stdout.trim());\n return updated ? { updated: true } : { updated: false, reason: 'up-to-date' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Heuristics on git's stderr text — exit codes are too coarse to\n // discriminate the cases.\n if (/no upstream|no such ref|couldn't find remote ref/i.test(message)) {\n return { updated: false, reason: 'no-upstream' };\n }\n if (/conflict|not possible to fast-forward|divergent/i.test(message)) {\n return { updated: false, reason: 'conflict' };\n }\n return { updated: false, reason: 'network' };\n } finally {\n if (credHelper) {\n try { await fs.unlink(credHelper); } catch { /* best-effort */ }\n }\n }\n}\n\n/**\n * Return the current HEAD commit sha (full 40-char). Throws when the\n * workspace has no commits yet (caller decides whether that's an error\n * or an \"init, then commit, then read\" sequencing issue).\n */\nexport async function getHeadSha(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['rev-parse', 'HEAD'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get HEAD sha: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Return the current HEAD commit as a `GitHubCommit` shape. Reuses the\n * canonical type from the REST module (no parallel `LocalCommit`\n * interface). `stats` is absent — that's GitHub-API-only and would\n * require a separate fetch to populate.\n *\n * The format string uses NUL (`%x00`) as a field separator so commit\n * messages containing newlines / pipes can't break parsing.\n */\nexport async function getHeadCommit(workDir: string): Promise<GitHubCommit> {\n try {\n const FORMAT = '%H%x00%an%x00%ae%x00%aI%x00%B';\n const { stdout } = await execGit(\n ['show', '--no-patch', `--format=${FORMAT}`, 'HEAD'],\n workDir,\n );\n const [sha, name, email, date, ...messageParts] = stdout.split('\\x00');\n return {\n sha: sha.trim(),\n message: messageParts.join('\\x00').trimEnd(),\n author: {\n name: name?.trim() ?? '',\n email: email?.trim() ?? '',\n date: date?.trim() ?? '',\n },\n };\n } catch (error) {\n throw new IntegrationError(\n `Failed to read HEAD commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Rename the current branch with `git branch -M <newName>`. The `-M`\n * (capital) flag forces the rename even if a branch with that name\n * already exists, which is fine for our use case (aligning a fresh\n * local workspace's branch with the linked repo's default branch).\n */\nexport async function renameCurrentBranch(params: GitHubRenameBranchParams): Promise<void> {\n const { newName, workDir } = params;\n try {\n await execGit(['branch', '-M', newName], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to rename branch to ${newName}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { newName, error }\n );\n }\n}\n","/**\n * GitHub REST API client\n */\n\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCreateRepoParams,\n GitHubRepoCreated,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n GitHubPullRequest,\n GitHubIssue,\n GitHubComment,\n GitHubRateLimit,\n} from './types';\n\n/**\n * GitHub API client configuration\n */\nexport interface GitHubAPIConfig {\n token: string;\n owner: string;\n repo: string;\n}\n\n/**\n * GitHub API response\n */\ninterface GitHubAPIResponse<T> {\n data: T;\n rateLimit: GitHubRateLimit;\n}\n\n/**\n * Execute a GitHub API request\n */\nasync function githubFetch<T>(\n endpoint: string,\n config: GitHubAPIConfig,\n options: RequestInit = {}\n): Promise<GitHubAPIResponse<T>> {\n const url = `https://api.github.com${endpoint}`;\n\n const headers = {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...options.headers,\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n // Extract rate limit info\n const rateLimit: GitHubRateLimit = {\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\n limit: parseInt(response.headers.get('x-ratelimit-limit') || '5000', 10),\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\n };\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }));\n\n // Handle rate limiting\n if (response.status === 429) {\n throw new IntegrationError(\n 'GitHub API rate limit exceeded',\n 'RATE_LIMIT_ERROR',\n { rateLimit, error }\n );\n }\n\n // Handle authentication errors\n if (response.status === 401 || response.status === 403) {\n throw new IntegrationError(\n `GitHub API authentication failed: ${error.message || response.statusText}`,\n 'AUTH_ERROR',\n { status: response.status, error }\n );\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error.message || response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status, error }\n );\n }\n\n const data = await response.json();\n\n return { data, rateLimit };\n } catch (error) {\n if (error instanceof IntegrationError) {\n throw error;\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { error }\n );\n }\n}\n\n/**\n * GAP-104/105: Create a new repository for the authenticated user.\n * The token must have the `repo` scope.\n */\nexport async function createRepo(\n params: GitHubCreateRepoParams,\n token: string,\n): Promise<GitHubRepoCreated> {\n const { name, isPrivate = true, description, autoInit = true } = params;\n\n const response = await fetch('https://api.github.com/user/repos', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n body: JSON.stringify({\n name,\n private: isPrivate,\n description: description ?? 'Generated by Almadar Studio',\n auto_init: autoInit,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new IntegrationError(\n `Failed to create GitHub repository \"${name}\": ${response.status} ${err}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n const repo = await response.json() as {\n clone_url: string;\n owner: { login: string };\n name: string;\n default_branch: string;\n full_name: string;\n };\n\n return {\n repoUrl: repo.clone_url,\n owner: repo.owner.login,\n repo: repo.name,\n defaultBranch: repo.default_branch,\n fullName: repo.full_name,\n };\n}\n\n/**\n * GAP-104/105: List the file tree of a repository using the Git Trees API.\n * Returns a flat list of all files in one request (recursive=1).\n */\nexport async function listRepoTree(\n config: GitHubAPIConfig,\n branch?: string,\n): Promise<Array<{ path: string; type: 'blob' | 'tree'; size?: number }>> {\n const ref = branch ?? 'main';\n const { data } = await githubFetch<{ tree: Array<{ path: string; type: string; size?: number }> }>(\n `/repos/${config.owner}/${config.repo}/git/trees/${ref}?recursive=1`,\n config,\n );\n return data.tree.map(entry => ({\n path: entry.path,\n type: entry.type as 'blob' | 'tree',\n size: entry.size,\n }));\n}\n\n/**\n * GAP-104/105: Read a single file's content from a repository.\n */\nexport async function readRepoFile(\n config: GitHubAPIConfig,\n filePath: string,\n branch?: string,\n): Promise<string | null> {\n const ref = branch ? `?ref=${branch}` : '';\n try {\n const response = await fetch(\n `https://api.github.com/repos/${config.owner}/${config.repo}/contents/${filePath}${ref}`,\n {\n headers: {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n },\n );\n if (!response.ok) return null;\n return await response.text();\n } catch {\n return null;\n }\n}\n\n/**\n * Create a pull request\n */\nexport async function createPR(\n params: GitHubCreatePRParams,\n config: GitHubAPIConfig\n): Promise<GitHubPullRequest> {\n const { title, body, baseBranch, headBranch, draft = false } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls`;\n\n const { data } = await githubFetch<GitHubPullRequest>(endpoint, config, {\n method: 'POST',\n body: JSON.stringify({\n title,\n body,\n base: baseBranch,\n head: headBranch,\n draft,\n }),\n });\n\n return data;\n}\n\n/**\n * Get pull request comments\n */\nexport async function getPRComments(\n params: GitHubGetPRCommentsParams,\n config: GitHubAPIConfig\n): Promise<GitHubComment[]> {\n const { prNumber } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls/${prNumber}/comments`;\n\n const { data } = await githubFetch<GitHubComment[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * List repository issues\n */\nexport async function listIssues(\n params: GitHubListIssuesParams,\n config: GitHubAPIConfig\n): Promise<GitHubIssue[]> {\n const { state = 'open', labels = [], limit = 30 } = params;\n\n const queryParams = new URLSearchParams({\n state,\n per_page: Math.min(limit, 100).toString(),\n });\n\n if (labels.length > 0) {\n queryParams.append('labels', labels.join(','));\n }\n\n const endpoint = `/repos/${config.owner}/${config.repo}/issues?${queryParams}`;\n\n const { data } = await githubFetch<GitHubIssue[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * Get issue details\n */\nexport async function getIssue(\n params: GitHubGetIssueParams,\n config: GitHubAPIConfig\n): Promise<{ issue: GitHubIssue; comments: GitHubComment[] }> {\n const { issueNumber } = params;\n\n // Get issue details\n const issueEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}`;\n const { data: issue } = await githubFetch<GitHubIssue>(issueEndpoint, config);\n\n // Get issue comments\n const commentsEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}/comments`;\n const { data: comments } = await githubFetch<GitHubComment[]>(commentsEndpoint, config);\n\n return { issue, comments };\n}\n\n/**\n * Get current rate limit status\n */\nexport async function getRateLimit(config: GitHubAPIConfig): Promise<GitHubRateLimit> {\n const endpoint = '/rate_limit';\n\n const { data } = await githubFetch<{ rate: GitHubRateLimit }>(endpoint, config);\n\n return data.rate;\n}\n\n// ============================================================================\n// Git History API\n// ============================================================================\n\n/**\n * A commit from the GitHub API with optional stats.\n */\nexport interface GitHubCommit {\n sha: string;\n message: string;\n author: { name: string; email: string; date: string };\n stats?: { additions: number; deletions: number; total: number };\n}\n\n/**\n * List commits for a repository, optionally filtered by file path.\n */\nexport async function listCommits(\n config: GitHubAPIConfig,\n options?: { path?: string; perPage?: number; page?: number },\n): Promise<GitHubCommit[]> {\n const params = new URLSearchParams();\n if (options?.path) params.set('path', options.path);\n if (options?.perPage) params.set('per_page', options.perPage.toString());\n if (options?.page) params.set('page', options.page.toString());\n\n const queryStr = params.toString();\n const endpoint = `/repos/${config.owner}/${config.repo}/commits${queryStr ? `?${queryStr}` : ''}`;\n\n const { data } = await githubFetch<Array<{\n sha: string;\n commit: {\n message: string;\n author: { name: string; email: string; date: string };\n };\n stats?: { additions: number; deletions: number; total: number };\n }>>(endpoint, config);\n\n return data.map((item) => ({\n sha: item.sha,\n message: item.commit.message,\n author: item.commit.author,\n stats: item.stats,\n }));\n}\n\n/**\n * Get the diff for a specific commit as a unified diff string.\n */\nexport async function getCommitDiff(\n config: GitHubAPIConfig,\n sha: string,\n): Promise<string> {\n const url = `https://api.github.com/repos/${config.owner}/${config.repo}/commits/${sha}`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.diff',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n throw new IntegrationError(\n `GitHub API request failed: ${response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n return response.text();\n}\n\n/**\n * Get a file's content at a specific commit SHA.\n * Returns null if the file doesn't exist at that commit.\n */\nexport async function getFileAtCommit(\n config: GitHubAPIConfig,\n path: string,\n sha: string,\n): Promise<string | null> {\n const endpoint = `/repos/${config.owner}/${config.repo}/contents/${path}?ref=${sha}`;\n\n try {\n const response = await fetch(`https://api.github.com${endpoint}`, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) return null;\n throw new Error(`${response.status}: ${response.statusText}`);\n }\n\n return response.text();\n } catch (error) {\n if (error instanceof IntegrationError) throw error;\n throw new IntegrationError(\n `Failed to get file at commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { path, sha, error },\n );\n }\n}\n\n/**\n * Parse repository owner and name from URL\n */\nexport function parseRepoUrl(repoUrl: string): { owner: string; repo: string } {\n try {\n const url = new URL(repoUrl);\n const pathParts = url.pathname.split('/').filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error('Invalid repository URL format');\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1].replace(/\\.git$/, '');\n\n return { owner, repo };\n } catch (error) {\n throw new IntegrationError(\n `Failed to parse repository URL: ${repoUrl}`,\n 'VALIDATION_ERROR',\n { error }\n );\n }\n}\n","/**\n * GitHub Integration for Almadar\n * Provides git operations and GitHub API access for the agent\n */\n\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport * as GitOps from './github-git';\nimport * as GitHubAPI from './github-api';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n} from './types';\n\n/**\n * GitHub integration class\n */\nexport class GitHubIntegration extends BaseIntegration {\n private token: string;\n private owner: string;\n private repo: string;\n private workDir: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.token = config.env.GITHUB_TOKEN;\n if (!this.token) {\n throw new Error('GITHUB_TOKEN not configured');\n }\n\n this.owner = config.env.GITHUB_OWNER || '';\n this.repo = config.env.GITHUB_REPO || '';\n this.workDir = config.env.GITHUB_WORK_DIR || process.cwd();\n\n this.logger.info('GitHub integration initialized', {\n owner: this.owner,\n repo: this.repo,\n });\n }\n\n /**\n * Execute a GitHub action\n */\n async execute(\n action: string,\n params: IntegrationParams\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'cloneRepo':\n data = await this.executeWithRetry(() =>\n this.cloneRepo(params as GitHubCloneParams)\n );\n break;\n\n case 'createBranch':\n data = await this.executeWithRetry(() =>\n this.createBranch(params as GitHubCreateBranchParams)\n );\n break;\n\n case 'commit':\n data = await this.executeWithRetry(() =>\n this.commit(params as GitHubCommitParams)\n );\n break;\n\n case 'push':\n data = await this.executeWithRetry(() =>\n this.push(params as GitHubPushParams)\n );\n break;\n\n case 'createPR':\n data = await this.executeWithRetry(() =>\n this.createPR(params as GitHubCreatePRParams)\n );\n break;\n\n case 'getPRComments':\n data = await this.executeWithRetry(() =>\n this.getPRComments(params as GitHubGetPRCommentsParams)\n );\n break;\n\n case 'listIssues':\n data = await this.executeWithRetry(() =>\n this.listIssues(params as GitHubListIssuesParams)\n );\n break;\n\n case 'getIssue':\n data = await this.executeWithRetry(() =>\n this.getIssue(params as GitHubGetIssueParams)\n );\n break;\n\n default:\n throw new Error(`Unknown GitHub action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /**\n * Clone a repository\n */\n private async cloneRepo(params: GitHubCloneParams): Promise<{ message: string }> {\n this.logger.debug('Cloning repository', { repoUrl: params.repoUrl });\n\n // If owner/repo not set, parse from URL\n if (!this.owner || !this.repo) {\n const parsed = GitHubAPI.parseRepoUrl(params.repoUrl);\n this.owner = parsed.owner;\n this.repo = parsed.repo;\n }\n\n await GitOps.cloneRepo(params, this.token);\n\n return {\n message: `Successfully cloned ${params.repoUrl} to ${params.targetDir}`,\n };\n }\n\n /**\n * Create a branch\n */\n private async createBranch(params: GitHubCreateBranchParams): Promise<{ message: string }> {\n this.logger.debug('Creating branch', { branchName: params.branchName });\n\n await GitOps.createBranch(params, this.workDir);\n\n return {\n message: `Successfully created branch: ${params.branchName}`,\n };\n }\n\n /**\n * Commit changes\n */\n private async commit(params: GitHubCommitParams): Promise<{ message: string }> {\n this.logger.debug('Committing changes', { message: params.message });\n\n await GitOps.commit(params, this.workDir);\n\n return {\n message: `Successfully committed changes: ${params.message}`,\n };\n }\n\n /**\n * Push branch\n */\n private async push(params: GitHubPushParams): Promise<{ message: string }> {\n this.logger.debug('Pushing branch', { branchName: params.branchName });\n\n await GitOps.push(params, this.workDir, this.token);\n\n return {\n message: `Successfully pushed branch: ${params.branchName}`,\n };\n }\n\n /**\n * Create a pull request\n */\n private async createPR(params: GitHubCreatePRParams) {\n this.logger.debug('Creating pull request', { title: params.title });\n\n const apiConfig = this.getAPIConfig();\n const pr = await GitHubAPI.createPR(params, apiConfig);\n\n this.logger.info('Pull request created', { number: pr.number, url: pr.url });\n\n return pr;\n }\n\n /**\n * Get PR comments\n */\n private async getPRComments(params: GitHubGetPRCommentsParams) {\n this.logger.debug('Getting PR comments', { prNumber: params.prNumber });\n\n const apiConfig = this.getAPIConfig();\n const comments = await GitHubAPI.getPRComments(params, apiConfig);\n\n return { comments };\n }\n\n /**\n * List issues\n */\n private async listIssues(params: GitHubListIssuesParams) {\n this.logger.debug('Listing issues', { state: params.state, labels: params.labels?.join(', '), limit: params.limit });\n\n const apiConfig = this.getAPIConfig();\n const issues = await GitHubAPI.listIssues(params, apiConfig);\n\n return { issues };\n }\n\n /**\n * Get issue details\n */\n private async getIssue(params: GitHubGetIssueParams) {\n this.logger.debug('Getting issue', { issueNumber: params.issueNumber });\n\n const apiConfig = this.getAPIConfig();\n const result = await GitHubAPI.getIssue(params, apiConfig);\n\n return result;\n }\n\n /**\n * Get API config for GitHub API calls\n */\n private getAPIConfig(): GitHubAPI.GitHubAPIConfig {\n if (!this.owner || !this.repo) {\n throw new Error(\n 'GitHub owner and repo must be configured. Either set GITHUB_OWNER/GITHUB_REPO or clone a repository first.'\n );\n }\n\n return {\n token: this.token,\n owner: this.owner,\n repo: this.repo,\n };\n }\n}\n\n// Auto-register the integration\nregisterIntegration('github', GitHubIntegration);\n\n// Export types\nexport * from './types';\n\n// Export git CLI operations (clone, push, commit, branch)\nexport {\n cloneRepo,\n createBranch,\n commit,\n push,\n getCurrentBranch,\n hasUncommittedChanges,\n init,\n pull,\n addRemote,\n setUserConfig,\n getHeadSha,\n getHeadCommit,\n renameCurrentBranch,\n} from './github-git';\n\n// Export GitHub REST API functions\nexport {\n createRepo,\n listRepoTree,\n readRepoFile,\n createPR,\n getPRComments,\n listIssues,\n getIssue,\n getRateLimit,\n parseRepoUrl,\n listCommits,\n getCommitDiff,\n getFileAtCommit,\n type GitHubAPIConfig,\n type GitHubCommit,\n} from './github-api';\n"]}
1
+ {"version":3,"sources":["../../../src/core/logger.ts","../../../src/core/validation.ts","../../../src/core/retry.ts","../../../src/core/BaseIntegration.ts","../../../src/types.ts","../../../src/integrations/github/github-git.ts","../../../src/integrations/github/github-api.ts","../../../src/integrations/github/index.ts"],"names":["fs"],"mappings":"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","file":"index.js","sourcesContent":["import { createLogger, type Logger } from '@almadar/logger';\nimport type { IntegrationLogger, LogMeta } from '../types';\n\n/**\n * Console-based logger implementation.\n *\n * Routes through `@almadar/logger`'s shared gate so namespace filtering\n * (`ALMADAR_DEBUG`, `globalThis.__ALMADAR_DEBUG__`) and the production\n * level default (WARN+) apply uniformly with the rest of `@almadar/*`.\n *\n * The constructor's `level` argument is retained for backwards\n * compatibility but is now a no-op — the active level is owned by the\n * shared logger (compile-time + env). To filter integration logs at\n * runtime, set `globalThis.__ALMADAR_DEBUG__ = 'almadar:integrations:*'`.\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private readonly log: Logger;\n\n constructor(_level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n void _level;\n this.log = createLogger('almadar:integrations');\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.log.debug(message, meta);\n }\n info(message: string, meta?: LogMeta): void {\n this.log.info(message, meta);\n }\n warn(message: string, meta?: LogMeta): void {\n this.log.warn(message, meta);\n }\n error(message: string, meta?: LogMeta): void {\n this.log.error(message, meta);\n }\n}\n","import type { ValidationResult, ValidationError, IntegrationParams } from '../types';\n\n// Import integrators registry from the package main export (JSON is inlined in the bundle)\nimport { integratorsRegistry } from '@almadar/core/patterns';\n\ninterface ActionParam {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\ninterface ActionDef {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface IntegratorEntry {\n name: string;\n description?: string;\n category?: string;\n actions: ActionDef[];\n}\n\ntype IntegratorsRegistry = Record<string, {\n version?: string;\n exportedAt?: string;\n integrators: Record<string, IntegratorEntry>;\n}>;\n\n/** Envelope keys owned by the call-service form, never action params. */\nconst RESERVED_ENVELOPE_KEYS = new Set(['emit', 'onSuccess', 'onError', 'timeout']);\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: IntegrationParams,\n): ValidationResult {\n const typedRegistry = integratorsRegistry as IntegratorsRegistry[string];\n const registry = typedRegistry.integrators[integration];\n\n if (!registry) {\n return {\n valid: false,\n errors: [\n {\n param: 'integration',\n message: `Unknown integration: ${integration}`,\n },\n ],\n };\n }\n\n const actionDef = registry.actions.find((a: ActionDef) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Unknown-key check (I-13 runtime parity with orb validate): a param the\n // contract does not declare is an error, not a silent drop. Envelope keys\n // belong to the call-service form itself, never to the action contract.\n const declaredNames = new Set(actionDef.params.map((p: ActionParam) => p.name));\n for (const key of Object.keys(params)) {\n if (RESERVED_ENVELOPE_KEYS.has(key)) continue;\n if (!declaredNames.has(key)) {\n errors.push({\n param: key,\n message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(', ')})`,\n });\n }\n }\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n IntegrationParams,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\nimport type { IntegrationCallContext } from '../factory';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action. `context` carries the caller's identity when the host\n * supplies one; integrations that gate actions by role read it and fail\n * closed when it is absent.\n */\n abstract execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: IntegrationParams,\n ): ReturnType<typeof validateParams> {\n return validateParams(this.config.name, action, params);\n }\n\n /**\n * Handle errors uniformly\n */\n protected handleError(action: string, error: unknown): IntegrationResult {\n this.logger.error(`Integration error in ${this.config.name}.${action}`, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n const integrationError =\n error instanceof Error\n ? error\n : new Error(String(error));\n\n return {\n success: false,\n error: integrationError as IntegrationError,\n metadata: this.createMetadata(action, 0, 0),\n };\n }\n\n /**\n * Create metadata for result\n */\n protected createMetadata(\n action: string,\n duration: number,\n retries: number = 0,\n ): IntegrationResult['metadata'] {\n return {\n integration: this.config.name,\n action,\n duration,\n retries,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute with retry logic\n */\n protected async executeWithRetry<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n if (!this.config.retry) {\n return fn();\n }\n\n return withRetry(fn, {\n maxAttempts: this.config.retry.maxAttempts,\n backoffMs: this.config.retry.backoffMs,\n maxBackoffMs: this.config.retry.maxBackoffMs,\n retryableErrors: [\n 'TIMEOUT_ERROR',\n 'NETWORK_ERROR',\n 'RATE_LIMIT_ERROR',\n ],\n });\n }\n}\n","/**\n * Core types for Almadar integrations\n */\n\n/**\n * Configuration for an integration instance\n */\nexport interface IntegrationConfig {\n /** Integration name (matches registry) */\n name: string;\n\n /** Environment variables (API keys, secrets) */\n env: Record<string, string>;\n\n /** Optional logger */\n logger?: IntegrationLogger;\n\n /** Optional rate limiting config */\n rateLimit?: {\n requestsPerSecond: number;\n burstSize: number;\n };\n\n /** Optional timeout (ms) */\n timeout?: number;\n\n /** Optional retry config */\n retry?: {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n };\n}\n\n/**\n * Result of an integration action call\n */\nexport interface IntegrationResult<T = unknown> {\n /** Success flag */\n success: boolean;\n\n /** Response data (on success) */\n data?: T;\n\n /** Error (on failure) */\n error?: IntegrationError;\n\n /** Metadata (timing, retries, etc.) */\n metadata: {\n integration: string;\n action: string;\n duration: number;\n retries: number;\n timestamp: number;\n };\n}\n\n/**\n * Integration error codes\n */\nexport type IntegrationErrorCode =\n | 'VALIDATION_ERROR'\n | 'AUTH_ERROR'\n | 'RATE_LIMIT_ERROR'\n | 'TIMEOUT_ERROR'\n | 'NETWORK_ERROR'\n | 'SERVICE_ERROR'\n | 'UNKNOWN_ERROR';\n\n/**\n * Integration error\n */\nexport class IntegrationError extends Error {\n code: IntegrationErrorCode;\n integration?: string;\n action?: string;\n details?: unknown;\n\n constructor(\n message: string,\n code: IntegrationErrorCode = 'UNKNOWN_ERROR',\n details?: unknown,\n ) {\n super(message);\n this.name = 'IntegrationError';\n this.code = code;\n this.details = details;\n }\n\n toJSON() {\n return {\n name: this.name,\n message: this.message,\n code: this.code,\n integration: this.integration,\n action: this.action,\n details: this.details,\n };\n }\n}\n\nimport type { LogMeta } from '@almadar/core';\n\n/** Re-export LogMeta from @almadar/core as the canonical log metadata type. */\nexport type { LogMeta };\n\n/**\n * Logger interface\n */\nexport interface IntegrationLogger {\n debug(message: string, meta?: LogMeta): void;\n info(message: string, meta?: LogMeta): void;\n warn(message: string, meta?: LogMeta): void;\n error(message: string, meta?: LogMeta): void;\n}\n\n/**\n * Integration action parameters.\n * Each integration's execute() method receives params as this type.\n * Individual methods cast to specific param shapes from their contracts.\n *\n * Per-key value union is widened to admit `@almadar/core`'s `FieldValue`\n * shape (entity / payload values flowing into call-service args): `Date`\n * for date fields, `IntegrationParams[]` for nested object arrays, and a\n * raw-value array catch-all so `string[]` / `number[]` / mixed payload\n * arrays satisfy the index signature without requiring `as unknown as`\n * casts at the call site. Adapters narrow these to their canonical input\n * types (typically JSON-string serialisation for `Date`).\n */\nexport type IntegrationParamValue =\n | string\n | number\n | boolean\n | Date\n | null\n | undefined\n | ReadonlyArray<IntegrationParamValue>\n | { readonly [key: string]: IntegrationParamValue };\n\nexport interface IntegrationParams {\n [key: string]: IntegrationParamValue;\n}\n\n/**\n * Validation result\n */\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[];\n}\n\n/**\n * Validation error\n */\nexport interface ValidationError {\n param: string;\n message: string;\n}\n","/**\n * Git CLI operations for GitHub integration\n */\n\nimport { spawn } from 'child_process';\nimport { promises as fs } from 'fs';\nimport { join } from 'path';\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubInitParams,\n GitHubPullParams,\n GitHubPullResult,\n GitHubAddRemoteParams,\n GitHubSetUserConfigParams,\n GitHubRenameBranchParams,\n} from './types';\nimport type { GitHubCommit } from './github-api';\n\n/**\n * Execute a git command\n */\nasync function execGit(\n args: string[],\n cwd: string,\n env?: Record<string, string>\n): Promise<{ stdout: string; stderr: string }> {\n return new Promise((resolve, reject) => {\n const proc = spawn('git', args, {\n cwd,\n env: { ...process.env, ...env },\n stdio: 'pipe',\n });\n\n let stdout = '';\n let stderr = '';\n\n proc.stdout?.on('data', (data) => {\n stdout += data.toString();\n });\n\n proc.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.on('close', (code) => {\n if (code === 0) {\n resolve({ stdout, stderr });\n } else {\n reject(\n new IntegrationError(\n `Git command failed: ${args.join(' ')}\\n${stderr}`,\n 'SERVICE_ERROR',\n { code, stderr }\n )\n );\n }\n });\n\n proc.on('error', (error) => {\n reject(\n new IntegrationError(\n `Failed to execute git: ${error.message}`,\n 'SERVICE_ERROR',\n { error }\n )\n );\n });\n });\n}\n\n/**\n * Clone a repository\n */\nexport async function cloneRepo(\n params: GitHubCloneParams,\n token: string\n): Promise<void> {\n const { repoUrl, targetDir, branch, depth = 1 } = params;\n\n // Inject token into URL for authentication\n const authUrl = injectTokenIntoUrl(repoUrl, token);\n\n const args = ['clone'];\n\n if (depth > 0) {\n args.push('--depth', depth.toString());\n }\n\n if (branch) {\n args.push('--branch', branch);\n }\n\n args.push(authUrl, targetDir);\n\n try {\n await execGit(args, process.cwd());\n\n // Immediately scrub the token from git config\n await scrubTokenFromRemote(targetDir, repoUrl);\n } catch (error) {\n throw new IntegrationError(\n `Failed to clone repository: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { repoUrl, error }\n );\n }\n}\n\n/**\n * Create a new branch\n */\nexport async function createBranch(\n params: GitHubCreateBranchParams,\n workDir: string\n): Promise<void> {\n const { branchName, baseBranch } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // If baseBranch is specified, check it out first\n if (baseBranch) {\n await execGit(['checkout', baseBranch], cwd);\n }\n\n // Create and checkout new branch\n await execGit(['checkout', '-b', branchName], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to create branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, baseBranch, error }\n );\n }\n}\n\n/**\n * Commit changes\n */\nexport async function commit(\n params: GitHubCommitParams,\n workDir: string\n): Promise<void> {\n const { message, files } = params;\n const cwd = params.workDir || workDir;\n\n try {\n // Stage files\n if (files && files.length > 0) {\n await execGit(['add', ...files], cwd);\n } else {\n // Stage all changes\n await execGit(['add', '.'], cwd);\n }\n\n // Commit\n await execGit(['commit', '-m', message], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { message, error }\n );\n }\n}\n\n/**\n * Push branch to remote\n */\nexport async function push(\n params: GitHubPushParams,\n workDir: string,\n token: string\n): Promise<void> {\n const { branchName, force = false } = params;\n const cwd = params.workDir || workDir;\n\n // Security: Never allow force push to protected branches\n const protectedBranches = ['main', 'master', 'production', 'prod'];\n if (force && protectedBranches.includes(branchName.toLowerCase())) {\n throw new IntegrationError(\n `Force push to protected branch '${branchName}' is not allowed`,\n 'VALIDATION_ERROR'\n );\n }\n\n try {\n // Create a temporary credential helper script\n const credHelper = await createTempCredentialHelper(token);\n\n const args = ['push'];\n\n if (force) {\n args.push('--force');\n }\n\n args.push('-u', 'origin', branchName);\n\n // Use GIT_ASKPASS for authentication\n await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n\n // Clean up credential helper\n await fs.unlink(credHelper);\n } catch (error) {\n throw new IntegrationError(\n `Failed to push: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { branchName, error }\n );\n }\n}\n\n/**\n * Inject token into repository URL for authentication\n */\nfunction injectTokenIntoUrl(repoUrl: string, token: string): string {\n const url = new URL(repoUrl);\n url.username = 'x-access-token';\n url.password = token;\n return url.toString();\n}\n\n/**\n * Remove token from git remote URL (security measure)\n */\nasync function scrubTokenFromRemote(workDir: string, originalUrl: string): Promise<void> {\n try {\n // Parse the URL to ensure it's clean (no credentials)\n const url = new URL(originalUrl);\n url.username = '';\n url.password = '';\n const cleanUrl = url.toString();\n\n await execGit(['remote', 'set-url', 'origin', cleanUrl], workDir);\n } catch (error) {\n // Log but don't fail - the clone succeeded\n console.error('Warning: Failed to scrub token from remote URL:', error);\n }\n}\n\n/**\n * Create a temporary credential helper script for GIT_ASKPASS\n */\nasync function createTempCredentialHelper(token: string): Promise<string> {\n const tmpDir = process.env.TMPDIR || '/tmp';\n const helperPath = join(tmpDir, `git-cred-${Date.now()}.sh`);\n\n const script = `#!/bin/sh\\necho \"${token}\"`;\n\n await fs.writeFile(helperPath, script, { mode: 0o700 });\n\n return helperPath;\n}\n\n/**\n * Get current branch name\n */\nexport async function getCurrentBranch(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['branch', '--show-current'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get current branch: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Check if working directory has uncommitted changes\n */\nexport async function hasUncommittedChanges(workDir: string): Promise<boolean> {\n try {\n const { stdout } = await execGit(['status', '--porcelain'], workDir);\n return stdout.trim().length > 0;\n } catch (error) {\n throw new IntegrationError(\n `Failed to check git status: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Initialize a git repository in `workDir`. No-op when `.git/` already\n * exists. The default initial branch is `main` to match what GitHub\n * creates for new repos.\n */\nexport async function init(params: GitHubInitParams): Promise<void> {\n const { workDir, initialBranch = 'main' } = params;\n try {\n // `git init -b <branch>` works on git >= 2.28; the runtime ships 2.x.\n // The command is idempotent — re-running on an existing repo just\n // re-asserts the initial branch ref (no error).\n await execGit(['init', '-b', initialBranch], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to git init: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { workDir, error }\n );\n }\n}\n\n/**\n * Add a remote to the repository. Used after `init` to attach the\n * freshly-created GitHub remote as `origin`.\n */\nexport async function addRemote(params: GitHubAddRemoteParams): Promise<void> {\n const { name, url, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n throw new IntegrationError(\n `addRemote requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n try {\n await execGit(['remote', 'add', name, url], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to add remote ${name}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { name, error }\n );\n }\n}\n\n/**\n * Set `user.name` and `user.email` for git commits. Scope defaults to\n * per-repo (`--local`) so each workspace can carry the GitHub identity\n * of the user who owns it — global config would clobber the developer's\n * own machine settings.\n */\nexport async function setUserConfig(params: GitHubSetUserConfigParams): Promise<void> {\n const { userName, userEmail, scope = 'local', workDir } = params;\n const scopeFlag = scope === 'global' ? '--global' : '--local';\n if (scope === 'local' && !workDir) {\n throw new IntegrationError(\n `setUserConfig with scope='local' requires workDir`,\n 'VALIDATION_ERROR',\n { params }\n );\n }\n const cwd = workDir ?? process.cwd();\n try {\n await execGit(['config', scopeFlag, 'user.name', userName], cwd);\n await execGit(['config', scopeFlag, 'user.email', userEmail], cwd);\n } catch (error) {\n throw new IntegrationError(\n `Failed to set git user config: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Pull from the remote. Returns a structured outcome so callers can\n * tell \"the workspace advanced\" from \"nothing changed because <X>\"\n * without parsing git's stderr. Best-effort posture: network / conflict\n * / no-upstream all resolve cleanly rather than throwing — the caller\n * decides whether to surface the no-op as user-facing.\n */\nexport async function pull(\n params: GitHubPullParams,\n token: string,\n): Promise<GitHubPullResult> {\n const { branchName, ffOnly = true, workDir } = params;\n const cwd = workDir || params.workDir;\n if (!cwd) {\n return { updated: false, reason: 'no-upstream' };\n }\n\n let credHelper: string | null = null;\n try {\n credHelper = await createTempCredentialHelper(token);\n const args = ['pull'];\n if (ffOnly) args.push('--ff-only');\n args.push('origin', branchName);\n\n const { stdout } = await execGit(args, cwd, {\n GIT_ASKPASS: credHelper,\n GIT_TERMINAL_PROMPT: '0',\n });\n // `git pull` prints \"Already up to date.\" when there's nothing to\n // fetch. Anything else (Updating, Fast-forward, +n -m line) means\n // the working tree actually moved.\n const updated = !/^Already up to date\\.?\\s*$/m.test(stdout.trim());\n return updated ? { updated: true } : { updated: false, reason: 'up-to-date' };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n // Heuristics on git's stderr text — exit codes are too coarse to\n // discriminate the cases.\n if (/no upstream|no such ref|couldn't find remote ref/i.test(message)) {\n return { updated: false, reason: 'no-upstream' };\n }\n if (/conflict|not possible to fast-forward|divergent/i.test(message)) {\n return { updated: false, reason: 'conflict' };\n }\n return { updated: false, reason: 'network' };\n } finally {\n if (credHelper) {\n try { await fs.unlink(credHelper); } catch { /* best-effort */ }\n }\n }\n}\n\n/**\n * Return the current HEAD commit sha (full 40-char). Throws when the\n * workspace has no commits yet (caller decides whether that's an error\n * or an \"init, then commit, then read\" sequencing issue).\n */\nexport async function getHeadSha(workDir: string): Promise<string> {\n try {\n const { stdout } = await execGit(['rev-parse', 'HEAD'], workDir);\n return stdout.trim();\n } catch (error) {\n throw new IntegrationError(\n `Failed to get HEAD sha: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Return the current HEAD commit as a `GitHubCommit` shape. Reuses the\n * canonical type from the REST module (no parallel `LocalCommit`\n * interface). `stats` is absent — that's GitHub-API-only and would\n * require a separate fetch to populate.\n *\n * The format string uses NUL (`%x00`) as a field separator so commit\n * messages containing newlines / pipes can't break parsing.\n */\nexport async function getHeadCommit(workDir: string): Promise<GitHubCommit> {\n try {\n const FORMAT = '%H%x00%an%x00%ae%x00%aI%x00%B';\n const { stdout } = await execGit(\n ['show', '--no-patch', `--format=${FORMAT}`, 'HEAD'],\n workDir,\n );\n const [sha, name, email, date, ...messageParts] = stdout.split('\\x00');\n return {\n sha: sha.trim(),\n message: messageParts.join('\\x00').trimEnd(),\n author: {\n name: name?.trim() ?? '',\n email: email?.trim() ?? '',\n date: date?.trim() ?? '',\n },\n };\n } catch (error) {\n throw new IntegrationError(\n `Failed to read HEAD commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { error }\n );\n }\n}\n\n/**\n * Rename the current branch with `git branch -M <newName>`. The `-M`\n * (capital) flag forces the rename even if a branch with that name\n * already exists, which is fine for our use case (aligning a fresh\n * local workspace's branch with the linked repo's default branch).\n */\nexport async function renameCurrentBranch(params: GitHubRenameBranchParams): Promise<void> {\n const { newName, workDir } = params;\n try {\n await execGit(['branch', '-M', newName], workDir);\n } catch (error) {\n throw new IntegrationError(\n `Failed to rename branch to ${newName}: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { newName, error }\n );\n }\n}\n","/**\n * GitHub REST API client\n */\n\nimport { IntegrationError } from '../../types';\nimport type {\n GitHubCreateRepoParams,\n GitHubRepoCreated,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n GitHubPullRequest,\n GitHubIssue,\n GitHubComment,\n GitHubRateLimit,\n} from './types';\n\n/**\n * GitHub API client configuration\n */\nexport interface GitHubAPIConfig {\n token: string;\n owner: string;\n repo: string;\n}\n\n/**\n * GitHub API response\n */\ninterface GitHubAPIResponse<T> {\n data: T;\n rateLimit: GitHubRateLimit;\n}\n\n/**\n * Execute a GitHub API request\n */\nasync function githubFetch<T>(\n endpoint: string,\n config: GitHubAPIConfig,\n options: RequestInit = {}\n): Promise<GitHubAPIResponse<T>> {\n const url = `https://api.github.com${endpoint}`;\n\n const headers = {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n ...options.headers,\n };\n\n try {\n const response = await fetch(url, {\n ...options,\n headers,\n });\n\n // Extract rate limit info\n const rateLimit: GitHubRateLimit = {\n remaining: parseInt(response.headers.get('x-ratelimit-remaining') || '0', 10),\n limit: parseInt(response.headers.get('x-ratelimit-limit') || '5000', 10),\n reset: parseInt(response.headers.get('x-ratelimit-reset') || '0', 10),\n };\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ message: response.statusText }));\n\n // Handle rate limiting\n if (response.status === 429) {\n throw new IntegrationError(\n 'GitHub API rate limit exceeded',\n 'RATE_LIMIT_ERROR',\n { rateLimit, error }\n );\n }\n\n // Handle authentication errors\n if (response.status === 401 || response.status === 403) {\n throw new IntegrationError(\n `GitHub API authentication failed: ${error.message || response.statusText}`,\n 'AUTH_ERROR',\n { status: response.status, error }\n );\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error.message || response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status, error }\n );\n }\n\n const data = await response.json();\n\n return { data, rateLimit };\n } catch (error) {\n if (error instanceof IntegrationError) {\n throw error;\n }\n\n throw new IntegrationError(\n `GitHub API request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { error }\n );\n }\n}\n\n/**\n * GAP-104/105: Create a new repository for the authenticated user.\n * The token must have the `repo` scope.\n */\nexport async function createRepo(\n params: GitHubCreateRepoParams,\n token: string,\n): Promise<GitHubRepoCreated> {\n const { name, isPrivate = true, description, autoInit = true } = params;\n\n const response = await fetch('https://api.github.com/user/repos', {\n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${token}`,\n 'Content-Type': 'application/json',\n 'Accept': 'application/vnd.github+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n body: JSON.stringify({\n name,\n private: isPrivate,\n description: description ?? 'Generated by Almadar Studio',\n auto_init: autoInit,\n }),\n });\n\n if (!response.ok) {\n const err = await response.text();\n throw new IntegrationError(\n `Failed to create GitHub repository \"${name}\": ${response.status} ${err}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n const repo = await response.json() as {\n clone_url: string;\n owner: { login: string };\n name: string;\n default_branch: string;\n full_name: string;\n };\n\n return {\n repoUrl: repo.clone_url,\n owner: repo.owner.login,\n repo: repo.name,\n defaultBranch: repo.default_branch,\n fullName: repo.full_name,\n };\n}\n\n/**\n * GAP-104/105: List the file tree of a repository using the Git Trees API.\n * Returns a flat list of all files in one request (recursive=1).\n */\nexport async function listRepoTree(\n config: GitHubAPIConfig,\n branch?: string,\n): Promise<Array<{ path: string; type: 'blob' | 'tree'; size?: number }>> {\n const ref = branch ?? 'main';\n const { data } = await githubFetch<{ tree: Array<{ path: string; type: string; size?: number }> }>(\n `/repos/${config.owner}/${config.repo}/git/trees/${ref}?recursive=1`,\n config,\n );\n return data.tree.map(entry => ({\n path: entry.path,\n type: entry.type as 'blob' | 'tree',\n size: entry.size,\n }));\n}\n\n/**\n * GAP-104/105: Read a single file's content from a repository.\n */\nexport async function readRepoFile(\n config: GitHubAPIConfig,\n filePath: string,\n branch?: string,\n): Promise<string | null> {\n const ref = branch ? `?ref=${branch}` : '';\n try {\n const response = await fetch(\n `https://api.github.com/repos/${config.owner}/${config.repo}/contents/${filePath}${ref}`,\n {\n headers: {\n 'Authorization': `Bearer ${config.token}`,\n 'Accept': 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n },\n );\n if (!response.ok) return null;\n return await response.text();\n } catch {\n return null;\n }\n}\n\n/**\n * Create a pull request\n */\nexport async function createPR(\n params: GitHubCreatePRParams,\n config: GitHubAPIConfig\n): Promise<GitHubPullRequest> {\n const { title, body, baseBranch, headBranch, draft = false } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls`;\n\n const { data } = await githubFetch<GitHubPullRequest>(endpoint, config, {\n method: 'POST',\n body: JSON.stringify({\n title,\n body,\n base: baseBranch,\n head: headBranch,\n draft,\n }),\n });\n\n return data;\n}\n\n/**\n * Get pull request comments\n */\nexport async function getPRComments(\n params: GitHubGetPRCommentsParams,\n config: GitHubAPIConfig\n): Promise<GitHubComment[]> {\n const { prNumber } = params;\n\n const endpoint = `/repos/${config.owner}/${config.repo}/pulls/${prNumber}/comments`;\n\n const { data } = await githubFetch<GitHubComment[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * List repository issues\n */\nexport async function listIssues(\n params: GitHubListIssuesParams,\n config: GitHubAPIConfig\n): Promise<GitHubIssue[]> {\n const { state = 'open', labels = [], limit = 30 } = params;\n\n const queryParams = new URLSearchParams({\n state,\n per_page: Math.min(limit, 100).toString(),\n });\n\n if (labels.length > 0) {\n queryParams.append('labels', labels.join(','));\n }\n\n const endpoint = `/repos/${config.owner}/${config.repo}/issues?${queryParams}`;\n\n const { data } = await githubFetch<GitHubIssue[]>(endpoint, config);\n\n return data;\n}\n\n/**\n * Get issue details\n */\nexport async function getIssue(\n params: GitHubGetIssueParams,\n config: GitHubAPIConfig\n): Promise<{ issue: GitHubIssue; comments: GitHubComment[] }> {\n const { issueNumber } = params;\n\n // Get issue details\n const issueEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}`;\n const { data: issue } = await githubFetch<GitHubIssue>(issueEndpoint, config);\n\n // Get issue comments\n const commentsEndpoint = `/repos/${config.owner}/${config.repo}/issues/${issueNumber}/comments`;\n const { data: comments } = await githubFetch<GitHubComment[]>(commentsEndpoint, config);\n\n return { issue, comments };\n}\n\n/**\n * Get current rate limit status\n */\nexport async function getRateLimit(config: GitHubAPIConfig): Promise<GitHubRateLimit> {\n const endpoint = '/rate_limit';\n\n const { data } = await githubFetch<{ rate: GitHubRateLimit }>(endpoint, config);\n\n return data.rate;\n}\n\n// ============================================================================\n// Git History API\n// ============================================================================\n\n/**\n * A commit from the GitHub API with optional stats.\n */\nexport interface GitHubCommit {\n sha: string;\n message: string;\n author: { name: string; email: string; date: string };\n stats?: { additions: number; deletions: number; total: number };\n}\n\n/**\n * List commits for a repository, optionally filtered by file path.\n */\nexport async function listCommits(\n config: GitHubAPIConfig,\n options?: { path?: string; perPage?: number; page?: number },\n): Promise<GitHubCommit[]> {\n const params = new URLSearchParams();\n if (options?.path) params.set('path', options.path);\n if (options?.perPage) params.set('per_page', options.perPage.toString());\n if (options?.page) params.set('page', options.page.toString());\n\n const queryStr = params.toString();\n const endpoint = `/repos/${config.owner}/${config.repo}/commits${queryStr ? `?${queryStr}` : ''}`;\n\n const { data } = await githubFetch<Array<{\n sha: string;\n commit: {\n message: string;\n author: { name: string; email: string; date: string };\n };\n stats?: { additions: number; deletions: number; total: number };\n }>>(endpoint, config);\n\n return data.map((item) => ({\n sha: item.sha,\n message: item.commit.message,\n author: item.commit.author,\n stats: item.stats,\n }));\n}\n\n/**\n * Get the diff for a specific commit as a unified diff string.\n */\nexport async function getCommitDiff(\n config: GitHubAPIConfig,\n sha: string,\n): Promise<string> {\n const url = `https://api.github.com/repos/${config.owner}/${config.repo}/commits/${sha}`;\n\n const response = await fetch(url, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.diff',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n throw new IntegrationError(\n `GitHub API request failed: ${response.statusText}`,\n 'SERVICE_ERROR',\n { status: response.status },\n );\n }\n\n return response.text();\n}\n\n/**\n * Get a file's content at a specific commit SHA.\n * Returns null if the file doesn't exist at that commit.\n */\nexport async function getFileAtCommit(\n config: GitHubAPIConfig,\n path: string,\n sha: string,\n): Promise<string | null> {\n const endpoint = `/repos/${config.owner}/${config.repo}/contents/${path}?ref=${sha}`;\n\n try {\n const response = await fetch(`https://api.github.com${endpoint}`, {\n headers: {\n Authorization: `Bearer ${config.token}`,\n Accept: 'application/vnd.github.raw+json',\n 'X-GitHub-Api-Version': '2022-11-28',\n },\n });\n\n if (!response.ok) {\n if (response.status === 404) return null;\n throw new Error(`${response.status}: ${response.statusText}`);\n }\n\n return response.text();\n } catch (error) {\n if (error instanceof IntegrationError) throw error;\n throw new IntegrationError(\n `Failed to get file at commit: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { path, sha, error },\n );\n }\n}\n\n/**\n * Parse repository owner and name from URL\n */\nexport function parseRepoUrl(repoUrl: string): { owner: string; repo: string } {\n try {\n const url = new URL(repoUrl);\n const pathParts = url.pathname.split('/').filter(Boolean);\n\n if (pathParts.length < 2) {\n throw new Error('Invalid repository URL format');\n }\n\n const owner = pathParts[0];\n const repo = pathParts[1].replace(/\\.git$/, '');\n\n return { owner, repo };\n } catch (error) {\n throw new IntegrationError(\n `Failed to parse repository URL: ${repoUrl}`,\n 'VALIDATION_ERROR',\n { error }\n );\n }\n}\n","/**\n * GitHub Integration for Almadar\n * Provides git operations and GitHub API access for the agent\n */\n\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport * as GitOps from './github-git';\nimport * as GitHubAPI from './github-api';\nimport type {\n GitHubCloneParams,\n GitHubCreateBranchParams,\n GitHubCommitParams,\n GitHubPushParams,\n GitHubCreatePRParams,\n GitHubGetPRCommentsParams,\n GitHubListIssuesParams,\n GitHubGetIssueParams,\n} from './types';\n\n/**\n * GitHub integration class\n */\nexport class GitHubIntegration extends BaseIntegration {\n private token: string;\n private owner: string;\n private repo: string;\n private workDir: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.token = config.env.GITHUB_TOKEN;\n if (!this.token) {\n throw new Error('GITHUB_TOKEN not configured');\n }\n\n this.owner = config.env.GITHUB_OWNER || '';\n this.repo = config.env.GITHUB_REPO || '';\n this.workDir = config.env.GITHUB_WORK_DIR || process.cwd();\n\n this.logger.info('GitHub integration initialized', {\n owner: this.owner,\n repo: this.repo,\n });\n }\n\n /**\n * Execute a GitHub action\n */\n async execute(\n action: string,\n params: IntegrationParams\n ): Promise<IntegrationResult> {\n // Validate params against registry\n const validation = this.validateParams(action, params);\n if (!validation.valid) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: 'Validation failed',\n code: 'VALIDATION_ERROR',\n details: validation.errors,\n } as IntegrationError,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n const startTime = Date.now();\n let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'cloneRepo':\n data = await this.executeWithRetry(() =>\n this.cloneRepo(params as GitHubCloneParams)\n );\n break;\n\n case 'createBranch':\n data = await this.executeWithRetry(() =>\n this.createBranch(params as GitHubCreateBranchParams)\n );\n break;\n\n case 'commit':\n data = await this.executeWithRetry(() =>\n this.commit(params as GitHubCommitParams)\n );\n break;\n\n case 'push':\n data = await this.executeWithRetry(() =>\n this.push(params as GitHubPushParams)\n );\n break;\n\n case 'createPR':\n data = await this.executeWithRetry(() =>\n this.createPR(params as GitHubCreatePRParams)\n );\n break;\n\n case 'getPRComments':\n data = await this.executeWithRetry(() =>\n this.getPRComments(params as GitHubGetPRCommentsParams)\n );\n break;\n\n case 'listIssues':\n data = await this.executeWithRetry(() =>\n this.listIssues(params as GitHubListIssuesParams)\n );\n break;\n\n case 'getIssue':\n data = await this.executeWithRetry(() =>\n this.getIssue(params as GitHubGetIssueParams)\n );\n break;\n\n default:\n throw new Error(`Unknown GitHub action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime, retries),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /**\n * Clone a repository\n */\n private async cloneRepo(params: GitHubCloneParams): Promise<{ message: string }> {\n this.logger.debug('Cloning repository', { repoUrl: params.repoUrl });\n\n // If owner/repo not set, parse from URL\n if (!this.owner || !this.repo) {\n const parsed = GitHubAPI.parseRepoUrl(params.repoUrl);\n this.owner = parsed.owner;\n this.repo = parsed.repo;\n }\n\n await GitOps.cloneRepo(params, this.token);\n\n return {\n message: `Successfully cloned ${params.repoUrl} to ${params.targetDir}`,\n };\n }\n\n /**\n * Create a branch\n */\n private async createBranch(params: GitHubCreateBranchParams): Promise<{ message: string }> {\n this.logger.debug('Creating branch', { branchName: params.branchName });\n\n await GitOps.createBranch(params, this.workDir);\n\n return {\n message: `Successfully created branch: ${params.branchName}`,\n };\n }\n\n /**\n * Commit changes\n */\n private async commit(params: GitHubCommitParams): Promise<{ message: string }> {\n this.logger.debug('Committing changes', { message: params.message });\n\n await GitOps.commit(params, this.workDir);\n\n return {\n message: `Successfully committed changes: ${params.message}`,\n };\n }\n\n /**\n * Push branch\n */\n private async push(params: GitHubPushParams): Promise<{ message: string }> {\n this.logger.debug('Pushing branch', { branchName: params.branchName });\n\n await GitOps.push(params, this.workDir, this.token);\n\n return {\n message: `Successfully pushed branch: ${params.branchName}`,\n };\n }\n\n /**\n * Create a pull request\n */\n private async createPR(params: GitHubCreatePRParams) {\n this.logger.debug('Creating pull request', { title: params.title });\n\n const apiConfig = this.getAPIConfig();\n const pr = await GitHubAPI.createPR(params, apiConfig);\n\n this.logger.info('Pull request created', { number: pr.number, url: pr.url });\n\n return pr;\n }\n\n /**\n * Get PR comments\n */\n private async getPRComments(params: GitHubGetPRCommentsParams) {\n this.logger.debug('Getting PR comments', { prNumber: params.prNumber });\n\n const apiConfig = this.getAPIConfig();\n const comments = await GitHubAPI.getPRComments(params, apiConfig);\n\n return { comments };\n }\n\n /**\n * List issues\n */\n private async listIssues(params: GitHubListIssuesParams) {\n this.logger.debug('Listing issues', { state: params.state, labels: params.labels?.join(', '), limit: params.limit });\n\n const apiConfig = this.getAPIConfig();\n const issues = await GitHubAPI.listIssues(params, apiConfig);\n\n return { issues };\n }\n\n /**\n * Get issue details\n */\n private async getIssue(params: GitHubGetIssueParams) {\n this.logger.debug('Getting issue', { issueNumber: params.issueNumber });\n\n const apiConfig = this.getAPIConfig();\n const result = await GitHubAPI.getIssue(params, apiConfig);\n\n return result;\n }\n\n /**\n * Get API config for GitHub API calls\n */\n private getAPIConfig(): GitHubAPI.GitHubAPIConfig {\n if (!this.owner || !this.repo) {\n throw new Error(\n 'GitHub owner and repo must be configured. Either set GITHUB_OWNER/GITHUB_REPO or clone a repository first.'\n );\n }\n\n return {\n token: this.token,\n owner: this.owner,\n repo: this.repo,\n };\n }\n}\n\n// Auto-register the integration\nregisterIntegration('github', GitHubIntegration);\n\n// Export types\nexport * from './types';\n\n// Export git CLI operations (clone, push, commit, branch)\nexport {\n cloneRepo,\n createBranch,\n commit,\n push,\n getCurrentBranch,\n hasUncommittedChanges,\n init,\n pull,\n addRemote,\n setUserConfig,\n getHeadSha,\n getHeadCommit,\n renameCurrentBranch,\n} from './github-git';\n\n// Export GitHub REST API functions\nexport {\n createRepo,\n listRepoTree,\n readRepoFile,\n createPR,\n getPRComments,\n listIssues,\n getIssue,\n getRateLimit,\n parseRepoUrl,\n listCommits,\n getCommitDiff,\n getFileAtCommit,\n type GitHubAPIConfig,\n type GitHubCommit,\n} from './github-api';\n"]}
@@ -1,5 +1,4 @@
1
- import { B as BaseIntegration, I as IntegrationConfig, e as IntegrationParams, f as IntegrationResult } from '../BaseIntegration-MA-b4fh8.js';
2
- import { a as IntegrationFactory } from '../factory-BPVhvv5q.js';
1
+ import { B as BaseIntegration, a as IntegrationConfig, g as IntegrationParams, h as IntegrationResult, d as IntegrationFactory } from '../BaseIntegration-C_5q54DM.js';
3
2
  import '@almadar/core';
4
3
 
5
4
  /**
@@ -19,6 +19,7 @@ var ConsoleLogger = class {
19
19
  this.log.error(message, meta);
20
20
  }
21
21
  };
22
+ var RESERVED_ENVELOPE_KEYS = /* @__PURE__ */ new Set(["emit", "onSuccess", "onError", "timeout"]);
22
23
  function validateParams(integration, action, params) {
23
24
  const typedRegistry = integratorsRegistry;
24
25
  const registry = typedRegistry.integrators[integration];
@@ -41,6 +42,16 @@ function validateParams(integration, action, params) {
41
42
  };
42
43
  }
43
44
  const errors = [];
45
+ const declaredNames = new Set(actionDef.params.map((p) => p.name));
46
+ for (const key of Object.keys(params)) {
47
+ if (RESERVED_ENVELOPE_KEYS.has(key)) continue;
48
+ if (!declaredNames.has(key)) {
49
+ errors.push({
50
+ param: key,
51
+ message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(", ")})`
52
+ });
53
+ }
54
+ }
44
55
  for (const paramDef of actionDef.params) {
45
56
  if (paramDef.required && !(paramDef.name in params)) {
46
57
  errors.push({
@@ -296,7 +307,7 @@ var IntegrationFactory = class {
296
307
  */
297
308
  async execute(integration, action, params, context) {
298
309
  const instance = this.get(integration, context?.principal);
299
- return await instance.execute(action, params);
310
+ return await instance.execute(action, params, context);
300
311
  }
301
312
  /**
302
313
  * Check if integration is configured