@almadar/integrations 2.15.0 → 2.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/integrations/github/index.js +1 -1
- package/dist/integrations/github/index.js.map +1 -1
- package/dist/mocks/index.js +1 -1
- package/dist/mocks/index.js.map +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +3 -3
- package/dist/runtime/index.js.map +1 -1
- package/package.json +5 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/logger.ts","../src/core/validation.ts","../src/core/retry.ts","../src/core/BaseIntegration.ts","../src/registry.ts","../src/factory.ts","../src/integrations/stripe/webhooks.ts","../src/integrations/stripe/index.ts","../src/integrations/youtube/index.ts","../src/integrations/twilio/index.ts","../src/integrations/email/index.ts","../src/integrations/llm/index.ts","../src/integrations/deepagent/index.ts","../src/types.ts","../src/integrations/github/github-git.ts","../src/integrations/github/github-api.ts","../src/integrations/github/index.ts","../src/integrations/cli/index.ts","../src/integrations/redis/index.ts","../src/integrations/queue/index.ts","../src/integrations/otel/index.ts","../src/integrations/oauth/index.ts","../src/integrations/storage/index.ts","../src/integrations/docker/index.ts"],"names":["STRIPE_API_VERSION","isoFromUnix","priceToTier","mapStatus","shapeSubscription","Stripe","sub","fs","join"],"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/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","import type { IntegrationConfig } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\n\n/**\n * Integration constructor type\n */\nexport type IntegrationConstructor = new (\n config: IntegrationConfig,\n) => BaseIntegration;\n\n/**\n * Integration registry (populated as integrations are imported)\n */\nexport const INTEGRATION_REGISTRY: Record<string, IntegrationConstructor> = {};\n\n/**\n * Register an integration\n */\nexport function registerIntegration(\n name: string,\n constructor: IntegrationConstructor,\n): void {\n INTEGRATION_REGISTRY[name] = constructor;\n}\n\n/**\n * Get integration constructor by name\n */\nexport function getIntegration(\n name: string,\n): IntegrationConstructor | undefined {\n return INTEGRATION_REGISTRY[name];\n}\n\n/**\n * Check if integration is known\n */\nexport function isKnownIntegration(name: string): boolean {\n return name in INTEGRATION_REGISTRY;\n}\n\n/**\n * Get all registered integration names\n */\nexport function getRegisteredIntegrations(): string[] {\n return Object.keys(INTEGRATION_REGISTRY);\n}\n","import type { IntegrationConfig, IntegrationResult, IntegrationParams } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\nimport { getIntegration } from './registry';\n\n/**\n * Factory for creating and managing integration instances\n */\nexport class IntegrationFactory {\n private instances: Map<string, BaseIntegration> = new Map();\n private configs: Map<string, IntegrationConfig> = new Map();\n\n /**\n * Configure an integration (doesn't instantiate yet)\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>): void {\n this.configs.set(name, { name, ...config });\n }\n\n /**\n * Get or create an integration instance\n */\n get(name: string): BaseIntegration {\n // Return existing instance\n if (this.instances.has(name)) {\n return this.instances.get(name)!;\n }\n\n // Get constructor\n const Constructor = getIntegration(name);\n if (!Constructor) {\n throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);\n }\n\n // Get config\n const config = this.configs.get(name);\n if (!config) {\n throw new Error(\n `Integration not configured: ${name}. Call configure() first.`,\n );\n }\n\n // Create instance\n const instance = new Constructor(config);\n this.instances.set(name, instance);\n\n return instance;\n }\n\n /**\n * Execute an action on an integration\n */\n async execute(\n integration: string,\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration);\n return await instance.execute(action, params);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string): boolean {\n return this.configs.has(name);\n }\n\n /**\n * Register an integration instance directly (used by mock infrastructure)\n */\n registerInstance(name: string, instance: BaseIntegration): void {\n this.instances.set(name, instance);\n }\n\n /**\n * Clear all instances (useful for testing)\n */\n clear(): void {\n this.instances.clear();\n }\n\n /**\n * Clear all instances and configs\n */\n reset(): void {\n this.instances.clear();\n this.configs.clear();\n }\n}\n\nlet _factory: IntegrationFactory | null = null;\n\nexport function getIntegrationFactory(): IntegrationFactory {\n if (!_factory) {\n _factory = new IntegrationFactory();\n }\n return _factory;\n}\n\nexport function resetIntegrationFactory(): void {\n _factory?.reset();\n _factory = null;\n}\n","/**\n * Verify + parse Stripe webhook signatures into canonical Almadar\n * events. Apps/builder calls this from its `/billing/stripe-webhook`\n * route and switches on the returned discriminated union — it never\n * imports the `stripe` SDK or any `Stripe.*` shape.\n *\n * The five handled event types mirror docs §5.2 / `Almadar_Studio_Subscriptions.md`:\n * - customer.subscription.created\n * - customer.subscription.updated\n * - customer.subscription.deleted\n * - invoice.payment_succeeded\n * - invoice.payment_failed\n *\n * Anything else returns `{ error: 'unknown-event-type', stripeType: … }`\n * so the route can acknowledge with 200 + a log line (Stripe stops\n * retrying acknowledged events).\n */\n\nimport Stripe from 'stripe';\nimport type {\n AlmadarStripeEvent,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n StripePriceMap,\n} from './types';\n\nexport interface VerifyAndParseInput {\n rawBody: string | Buffer;\n signature: string;\n /** Stripe webhook secret (`whsec_…`). */\n secret: string;\n /** Map of provisioned Stripe Price IDs → Almadar tier. */\n prices: StripePriceMap;\n}\n\nconst STRIPE_API_VERSION: Stripe.LatestApiVersion = '2025-02-24.acacia';\n\nfunction priceToTier(priceId: string, prices: StripePriceMap): AlmadarTier | null {\n if (priceId === prices.solo) return 'solo';\n if (priceId === prices.teams) return 'teams';\n return null;\n}\n\nfunction mapStatus(status: Stripe.Subscription.Status): AlmadarSubscriptionStatus {\n switch (status) {\n case 'active':\n case 'past_due':\n case 'canceled':\n case 'incomplete':\n case 'incomplete_expired':\n case 'trialing':\n case 'unpaid':\n return status;\n case 'paused':\n return 'unpaid';\n default: {\n const _exhaustive: never = status;\n void _exhaustive;\n return 'incomplete';\n }\n }\n}\n\nfunction isoFromUnix(seconds: number): string {\n return new Date(seconds * 1000).toISOString();\n}\n\nfunction shapeSubscription(\n sub: Stripe.Subscription,\n prices: StripePriceMap,\n): AlmadarSubscription {\n const firstItem = sub.items.data[0];\n const priceId = firstItem?.price.id ?? '';\n const quantity = firstItem?.quantity ?? 1;\n const customerId =\n typeof sub.customer === 'string' ? sub.customer : sub.customer.id;\n\n return {\n subscriptionId: sub.id,\n customerId,\n status: mapStatus(sub.status),\n priceId,\n quantity,\n currentPeriodStart: isoFromUnix(sub.current_period_start),\n currentPeriodEnd: isoFromUnix(sub.current_period_end),\n cancelAtPeriodEnd: sub.cancel_at_period_end,\n tier: priceToTier(priceId, prices),\n };\n}\n\nfunction customerIdOf(\n customer: string | Stripe.Customer | Stripe.DeletedCustomer | null,\n): string {\n if (customer === null) return '';\n return typeof customer === 'string' ? customer : customer.id;\n}\n\n/**\n * Verify Stripe's signature header against the raw body and shape the\n * payload into a canonical `AlmadarStripeEvent`. The `stripe` SDK is\n * only used inside this module.\n */\nexport function verifyAndParseStripeEvent(\n input: VerifyAndParseInput,\n): AlmadarStripeEvent {\n // Constructed lazily — `webhooks` is a stateless utility on the\n // Stripe client. We need an instance to access `constructEvent`.\n const stripe = new Stripe('placeholder-only-for-webhook-utility', {\n apiVersion: STRIPE_API_VERSION,\n });\n\n let event: Stripe.Event;\n try {\n event = stripe.webhooks.constructEvent(\n input.rawBody,\n input.signature,\n input.secret,\n );\n } catch {\n return { error: 'bad-signature' };\n }\n\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as Stripe.Subscription;\n return {\n type: 'subscription.created',\n eventId: event.id,\n data: shapeSubscription(sub, input.prices),\n };\n }\n case 'customer.subscription.updated': {\n const sub = event.data.object as Stripe.Subscription;\n return {\n type: 'subscription.updated',\n eventId: event.id,\n data: shapeSubscription(sub, input.prices),\n };\n }\n case 'customer.subscription.deleted': {\n const sub = event.data.object as Stripe.Subscription;\n return {\n type: 'subscription.deleted',\n eventId: event.id,\n data: {\n subscriptionId: sub.id,\n customerId: customerIdOf(sub.customer),\n },\n };\n }\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as Stripe.Invoice;\n const subRef = invoice.subscription;\n return {\n type: 'invoice.payment_succeeded',\n eventId: event.id,\n data: {\n customerId: customerIdOf(invoice.customer),\n subscriptionId:\n typeof subRef === 'string' ? subRef : subRef?.id ?? null,\n paidAt: isoFromUnix(invoice.status_transitions.paid_at ?? invoice.created),\n amountUsd: invoice.amount_paid / 100,\n },\n };\n }\n case 'invoice.payment_failed': {\n const invoice = event.data.object as Stripe.Invoice;\n const subRef = invoice.subscription;\n return {\n type: 'invoice.payment_failed',\n eventId: event.id,\n data: {\n customerId: customerIdOf(invoice.customer),\n subscriptionId:\n typeof subRef === 'string' ? subRef : subRef?.id ?? null,\n failedAt: isoFromUnix(invoice.created),\n reason:\n invoice.last_finalization_error?.message ??\n 'Payment failed; reason not provided by Stripe.',\n },\n };\n }\n default:\n return { error: 'unknown-event-type', stripeType: event.type };\n }\n}\n","import Stripe from 'stripe';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationError,\n IntegrationParams,\n} from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n AlmadarInvoicePayment,\n AlmadarInvoiceFailure,\n AlmadarStripeEvent,\n AlmadarStripeEventOk,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport { verifyAndParseStripeEvent } from './webhooks';\nexport type { VerifyAndParseInput } from './webhooks';\n\nconst STRIPE_API_VERSION: Stripe.LatestApiVersion = '2025-02-24.acacia';\n\nfunction isoFromUnix(seconds: number): string {\n return new Date(seconds * 1000).toISOString();\n}\n\nfunction priceToTier(priceId: string, prices: StripePriceMap): AlmadarTier | null {\n if (priceId === prices.solo) return 'solo';\n if (priceId === prices.teams) return 'teams';\n return null;\n}\n\nfunction mapStatus(status: Stripe.Subscription.Status): AlmadarSubscriptionStatus {\n switch (status) {\n case 'active':\n case 'past_due':\n case 'canceled':\n case 'incomplete':\n case 'incomplete_expired':\n case 'trialing':\n case 'unpaid':\n return status;\n case 'paused':\n return 'unpaid';\n default: {\n const _exhaustive: never = status;\n void _exhaustive;\n return 'incomplete';\n }\n }\n}\n\nfunction shapeSubscription(\n sub: Stripe.Subscription,\n prices: StripePriceMap,\n): AlmadarSubscription {\n const firstItem = sub.items.data[0];\n const priceId = firstItem?.price.id ?? '';\n const quantity = firstItem?.quantity ?? 1;\n const customerId =\n typeof sub.customer === 'string' ? sub.customer : sub.customer.id;\n return {\n subscriptionId: sub.id,\n customerId,\n status: mapStatus(sub.status),\n priceId,\n quantity,\n currentPeriodStart: isoFromUnix(sub.current_period_start),\n currentPeriodEnd: isoFromUnix(sub.current_period_end),\n cancelAtPeriodEnd: sub.cancel_at_period_end,\n tier: priceToTier(priceId, prices),\n };\n}\n\nfunction shapeCustomer(customer: Stripe.Customer): AlmadarCustomer {\n return {\n customerId: customer.id,\n email: customer.email ?? null,\n almadarUid: customer.metadata?.almadarUid ?? null,\n };\n}\n\n/**\n * Stripe integration for payment processing and subscription billing.\n *\n * Two surfaces:\n * - Legacy `execute(action, params)` switch for the original three\n * PaymentIntent actions (kept for back-compat).\n * - New typed methods (`createCustomer`, `createCheckoutSession`,\n * `createSubscription`, etc.) that return canonical `Almadar*`\n * types. Consumers MUST prefer these — `Stripe.*` types never leak.\n */\nexport class StripeIntegration extends BaseIntegration {\n private client: Stripe;\n private prices: StripePriceMap;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('STRIPE_SECRET_KEY not configured');\n }\n\n this.client = new Stripe(apiKey, {\n apiVersion: STRIPE_API_VERSION,\n });\n\n this.prices = {\n solo: config.env.STRIPE_PRICE_SOLO ?? '',\n teams: config.env.STRIPE_PRICE_TEAMS ?? '',\n };\n\n this.logger.info('Stripe integration initialized');\n }\n\n /** Provisioned Price IDs the integration was constructed with. */\n getPrices(): StripePriceMap {\n return this.prices;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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 const retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'createPaymentIntent':\n data = await this.executeWithRetry(() =>\n this.createPaymentIntent(params),\n );\n break;\n case 'confirmPayment':\n data = await this.executeWithRetry(() => this.confirmPayment(params));\n break;\n case 'refund':\n data = await this.executeWithRetry(() => this.refund(params));\n break;\n default:\n throw new Error(`Unknown 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 private async createPaymentIntent(params: IntegrationParams) {\n const { amount, currency, metadata } = params;\n this.logger.debug('Creating payment intent', {\n amount: Number(amount),\n currency: String(currency ?? ''),\n });\n return await this.client.paymentIntents.create({\n amount: amount as number,\n currency: currency as string,\n metadata: metadata as Stripe.MetadataParam | undefined,\n });\n }\n\n private async confirmPayment(params: IntegrationParams) {\n const { paymentIntentId } = params;\n this.logger.debug('Confirming payment', {\n paymentIntentId: String(paymentIntentId ?? ''),\n });\n return await this.client.paymentIntents.confirm(paymentIntentId as string);\n }\n\n private async refund(params: IntegrationParams) {\n const { paymentIntentId, amount } = params;\n this.logger.debug('Creating refund', {\n paymentIntentId: String(paymentIntentId ?? ''),\n amount: Number(amount),\n });\n return await this.client.refunds.create({\n payment_intent: paymentIntentId as string,\n amount: amount as number | undefined,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────\n // Typed action surface — canonical Almadar shapes only.\n // ───────────────────────────────────────────────────────────────────\n\n /** Look up an existing customer by Stripe ID. */\n async getCustomer(customerId: string): Promise<AlmadarCustomer | null> {\n this.logger.debug('Fetching customer', { customerId });\n const customer = await this.client.customers.retrieve(customerId);\n if (customer.deleted === true) return null;\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe Customer for the given Almadar user. `almadarUid` is\n * stored as Stripe metadata so webhook handlers can resolve back to\n * the right `users/{uid}` document.\n */\n async createCustomer(input: CreateCustomerInput): Promise<AlmadarCustomer> {\n this.logger.debug('Creating customer', { almadarUid: input.almadarUid });\n const customer = await this.client.customers.create({\n email: input.email,\n name: input.displayName ?? undefined,\n metadata: { almadarUid: input.almadarUid },\n });\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe-hosted Checkout Session for the given tier. Client\n * redirects the user to the returned `url`; on success Stripe fires\n * `customer.subscription.created`, which the apps/builder webhook\n * handler turns into a `users/{uid}.tier` write.\n */\n async createCheckoutSession(\n input: CreateCheckoutInput,\n ): Promise<AlmadarCheckoutSession> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n\n this.logger.debug('Creating Checkout session', {\n tier: input.tier,\n quantity: input.quantity,\n hasCustomer: input.customerId !== null,\n });\n\n const session = await this.client.checkout.sessions.create({\n mode: 'subscription',\n customer: input.customerId ?? undefined,\n line_items: [{ price, quantity: input.quantity }],\n success_url: input.successUrl,\n cancel_url: input.cancelUrl,\n subscription_data: {\n metadata: input.metadata,\n },\n automatic_tax: { enabled: true },\n allow_promotion_codes: true,\n });\n\n return {\n url: session.url ?? '',\n sessionId: session.id,\n customerId:\n typeof session.customer === 'string'\n ? session.customer\n : session.customer?.id ?? null,\n };\n }\n\n /** Create a Billing Portal session for self-service plan management. */\n async createBillingPortalSession(\n input: CreatePortalInput,\n ): Promise<AlmadarPortalSession> {\n this.logger.debug('Creating Portal session', { customerId: input.customerId });\n const session = await this.client.billingPortal.sessions.create({\n customer: input.customerId,\n return_url: input.returnUrl,\n });\n return {\n url: session.url,\n customerId: input.customerId,\n };\n }\n\n /** Fetch a subscription and shape it into the canonical form. */\n async getSubscription(subscriptionId: string): Promise<AlmadarSubscription> {\n this.logger.debug('Fetching subscription', { subscriptionId });\n const sub = await this.client.subscriptions.retrieve(subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Create a subscription directly (server-side, no Checkout). Used by\n * P13.3 Solo → Teams upgrade flow.\n */\n async createSubscription(input: {\n customerId: string;\n tier: 'solo' | 'teams';\n quantity: number;\n metadata: Record<string, string>;\n }): Promise<AlmadarSubscription> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n this.logger.debug('Creating subscription', {\n customerId: input.customerId,\n tier: input.tier,\n quantity: input.quantity,\n });\n const sub = await this.client.subscriptions.create({\n customer: input.customerId,\n items: [{ price, quantity: input.quantity }],\n metadata: input.metadata,\n proration_behavior: 'create_prorations',\n automatic_tax: { enabled: true },\n });\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Update quantity or cancel-at-period-end. Used for Teams seat resize\n * and Solo → Teams transition.\n */\n async updateSubscription(\n input: UpdateSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Updating subscription', { subscriptionId: input.subscriptionId });\n const update: Stripe.SubscriptionUpdateParams = {\n proration_behavior: 'create_prorations',\n };\n if (typeof input.quantity === 'number') {\n const existing = await this.client.subscriptions.retrieve(input.subscriptionId);\n const itemId = existing.items.data[0]?.id;\n if (itemId !== undefined) {\n update.items = [{ id: itemId, quantity: input.quantity }];\n }\n }\n if (typeof input.cancelAtPeriodEnd === 'boolean') {\n update.cancel_at_period_end = input.cancelAtPeriodEnd;\n }\n const sub = await this.client.subscriptions.update(\n input.subscriptionId,\n update,\n );\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Cancel a subscription. Defaults to `atPeriodEnd: true` so the user\n * keeps access until the current period ends.\n */\n async cancelSubscription(\n input: CancelSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Canceling subscription', {\n subscriptionId: input.subscriptionId,\n atPeriodEnd: input.atPeriodEnd,\n });\n if (input.atPeriodEnd) {\n const sub = await this.client.subscriptions.update(input.subscriptionId, {\n cancel_at_period_end: true,\n });\n return shapeSubscription(sub, this.prices);\n }\n const sub = await this.client.subscriptions.cancel(input.subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n}\n\n// Auto-register\nregisterIntegration('stripe', StripeIntegration);\n","import { google, youtube_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * YouTube Data API integration\n */\nexport class YouTubeIntegration extends BaseIntegration {\n private client: youtube_v3.Youtube;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.YOUTUBE_API_KEY;\n if (!apiKey) {\n throw new Error('YOUTUBE_API_KEY not configured');\n }\n\n this.client = google.youtube({\n version: 'v3',\n auth: apiKey,\n });\n\n this.logger.info('YouTube integration initialized');\n }\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 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getVideo':\n data = await this.executeWithRetry(() => this.getVideo(params));\n break;\n case 'getChannel':\n data = await this.executeWithRetry(() => this.getChannel(params));\n break;\n default:\n throw new Error(`Unknown 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 private async search(params: IntegrationParams) {\n const { query, maxResults, type } = params;\n\n this.logger.debug('Searching YouTube', { query: String(query ?? ''), maxResults: Number(maxResults ?? 10), type: String(type ?? '') });\n\n const response = await this.client.search.list({\n part: ['snippet'],\n q: query as string,\n maxResults: (maxResults as number) || 10,\n type: type ? [type as string] : undefined,\n });\n\n return response.data.items?.map((item) => ({\n videoId: item.id?.videoId,\n title: item.snippet?.title,\n thumbnail: item.snippet?.thumbnails?.default?.url,\n description: item.snippet?.description,\n }));\n }\n\n private async getVideo(params: IntegrationParams) {\n const { videoId } = params;\n\n this.logger.debug('Getting video details', { videoId: String(videoId ?? '') });\n\n const response = await this.client.videos.list({\n part: ['snippet', 'statistics'],\n id: [videoId as string],\n });\n\n const video = response.data.items?.[0];\n if (!video) {\n throw new Error(`Video not found: ${videoId}`);\n }\n\n return {\n title: video.snippet?.title,\n description: video.snippet?.description,\n viewCount: video.statistics?.viewCount,\n likeCount: video.statistics?.likeCount,\n };\n }\n\n private async getChannel(params: IntegrationParams) {\n const { channelId } = params;\n\n this.logger.debug('Getting channel details', { channelId: String(channelId ?? '') });\n\n const response = await this.client.channels.list({\n part: ['snippet', 'statistics'],\n id: [channelId as string],\n });\n\n const channel = response.data.items?.[0];\n if (!channel) {\n throw new Error(`Channel not found: ${channelId}`);\n }\n\n return {\n name: channel.snippet?.title,\n description: channel.snippet?.description,\n subscriberCount: channel.statistics?.subscriberCount,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('youtube', YouTubeIntegration);\n","import twilio from 'twilio';\nimport type { Twilio } from 'twilio';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Twilio messaging integration\n */\nexport class TwilioIntegration extends BaseIntegration {\n private client: Twilio;\n private phoneNumber: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const accountSid = config.env.TWILIO_ACCOUNT_SID;\n const authToken = config.env.TWILIO_AUTH_TOKEN;\n this.phoneNumber = config.env.TWILIO_PHONE_NUMBER || '';\n\n if (!accountSid || !authToken) {\n throw new Error('TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN not configured');\n }\n\n this.client = twilio(accountSid, authToken);\n\n this.logger.info('Twilio integration initialized');\n }\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 'sendSMS':\n data = await this.executeWithRetry(() => this.sendSMS(params));\n break;\n case 'sendWhatsApp':\n data = await this.executeWithRetry(() => this.sendWhatsApp(params));\n break;\n default:\n throw new Error(`Unknown 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 private async sendSMS(params: IntegrationParams) {\n const { to, body } = params;\n\n this.logger.debug('Sending SMS', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: this.phoneNumber,\n to: to as string,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n\n private async sendWhatsApp(params: IntegrationParams) {\n const { to, body } = params;\n\n this.logger.debug('Sending WhatsApp message', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: `whatsapp:${this.phoneNumber}`,\n to: `whatsapp:${to}`,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('twilio', TwilioIntegration);\n","import sgMail from '@sendgrid/mail';\nimport { Resend } from 'resend';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ntype EmailProvider = 'sendgrid' | 'resend';\n\n/**\n * Email integration (SendGrid/Resend)\n */\nexport class EmailIntegration extends BaseIntegration {\n private provider: EmailProvider;\n private fromEmail: string;\n private resendClient?: Resend;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.provider = (config.env.PROVIDER as EmailProvider) || 'sendgrid';\n this.fromEmail = config.env.FROM_EMAIL || 'noreply@example.com';\n\n if (this.provider === 'sendgrid') {\n const apiKey = config.env.SENDGRID_API_KEY;\n if (!apiKey) {\n throw new Error('SENDGRID_API_KEY not configured');\n }\n sgMail.setApiKey(apiKey);\n } else if (this.provider === 'resend') {\n const apiKey = config.env.RESEND_API_KEY;\n if (!apiKey) {\n throw new Error('RESEND_API_KEY not configured');\n }\n this.resendClient = new Resend(apiKey);\n }\n\n this.logger.info(`Email integration initialized (${this.provider})`);\n }\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 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new Error(`Unknown 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 private async send(params: IntegrationParams) {\n const { to, subject, body, from } = params;\n\n this.logger.debug('Sending email', { to: String(to), subject: String(subject), provider: this.provider });\n\n if (this.provider === 'sendgrid') {\n return await this.sendViaSendGrid(\n to as string,\n subject as string,\n body as string,\n (from as string) || this.fromEmail,\n );\n } else if (this.provider === 'resend') {\n return await this.sendViaResend(\n to as string,\n subject as string,\n body as string,\n (from as string) || this.fromEmail,\n );\n }\n\n throw new Error(`Unknown email provider: ${this.provider}`);\n }\n\n private async sendViaSendGrid(\n to: string,\n subject: string,\n body: string,\n from: string,\n ) {\n const msg = {\n to,\n from,\n subject,\n html: body,\n };\n\n const response = await sgMail.send(msg);\n\n return {\n id: response[0].headers['x-message-id'],\n status: 'sent',\n };\n }\n\n private async sendViaResend(\n to: string,\n subject: string,\n body: string,\n from: string,\n ) {\n if (!this.resendClient) {\n throw new Error('Resend client not initialized');\n }\n\n const response = await this.resendClient.emails.send({\n from,\n to,\n subject,\n html: body,\n });\n\n return {\n id: response.data?.id,\n status: 'sent',\n };\n }\n}\n\n// Auto-register\nregisterIntegration('email', EmailIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport {\n LLMClient,\n getAvailableProvider,\n type LLMCallOptions,\n type LLMProvider,\n} from '@almadar/llm';\nimport { z } from 'zod';\n\n/**\n * LLM integration using @almadar/llm\n *\n * Provides 4 actions:\n * - generate: Generate text content from a prompt\n * - classify: Classify text into predefined categories\n * - extract: Extract structured data from text using a schema\n * - summarize: Summarize long text content\n */\nexport class LLMIntegration extends BaseIntegration {\n private client: LLMClient | null = null;\n private provider: LLMProvider;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n // Determine provider from config or auto-detect from available API keys\n const configuredProvider = config.env.PROVIDER as LLMProvider | undefined;\n this.provider = configuredProvider || getAvailableProvider() || 'anthropic';\n\n this.logger.info(`LLM integration initialized (provider: ${this.provider})`);\n }\n\n /**\n * Lazily create client — avoids throwing on construction if API key is missing.\n * The client will throw a clear error when actually used without a key.\n */\n private getClient(): LLMClient {\n if (!this.client) {\n this.client = new LLMClient({\n provider: this.provider,\n temperature: 0.7,\n trackTokens: true,\n });\n }\n return this.client;\n }\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'generate':\n data = await this.executeWithRetry(() => this.generate(params));\n break;\n case 'classify':\n data = await this.executeWithRetry(() => this.classify(params));\n break;\n case 'extract':\n data = await this.executeWithRetry(() => this.extract(params));\n break;\n case 'summarize':\n data = await this.executeWithRetry(() => this.summarize(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async generate(params: IntegrationParams) {\n const {\n systemPrompt,\n userPrompt,\n model,\n temperature,\n maxTokens,\n } = params as {\n systemPrompt?: string;\n userPrompt: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n };\n\n this.logger.debug('Generating content', { model, temperature });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: temperature ?? 0.7 })\n : this.getClient();\n\n const response = await client.callWithMetadata<string>({\n systemPrompt: systemPrompt || 'You are a helpful assistant.',\n userPrompt,\n maxTokens: maxTokens ?? 1024,\n temperature,\n skipSchemaValidation: true,\n });\n\n return {\n content: response.data,\n usage: response.usage\n ? {\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n totalTokens: response.usage.totalTokens,\n }\n : { tokens: 0 },\n };\n }\n\n private async classify(params: IntegrationParams) {\n const { text, categories, model } = params as {\n text: string;\n categories: string[];\n model?: string;\n };\n\n this.logger.debug('Classifying text', { categories: categories.join(', ') });\n\n const ClassificationSchema = z.object({\n category: z.enum(categories as [string, ...string[]]),\n confidence: z.number().min(0).max(1),\n reasoning: z.string(),\n });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.1 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text classifier. Classify the given text into one of these categories: ${categories.join(', ')}. Return JSON with: category, confidence (0-1), and reasoning.`,\n userPrompt: text,\n schema: ClassificationSchema,\n temperature: 0.1,\n });\n\n return result;\n }\n\n private async extract(params: IntegrationParams) {\n const { text, schema, model } = params as {\n text: string;\n schema: IntegrationParams;\n model?: string;\n };\n\n this.logger.debug('Extracting structured data', { schema: String(schema ?? '') });\n\n // Build a Zod schema from the JSON schema description.\n // For complex schemas, we use z.record to accept any shape and let the LLM\n // follow the schema description in the prompt.\n const ExtractSchema = z.record(z.unknown());\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.2 })\n : this.getClient();\n\n const schemaDescription = JSON.stringify(schema, null, 2);\n\n const result = await client.call({\n systemPrompt: `You are a structured data extractor. Extract data from the given text according to this schema:\\n\\n${schemaDescription}\\n\\nReturn ONLY valid JSON matching the schema.`,\n userPrompt: text,\n schema: ExtractSchema,\n temperature: 0.2,\n skipSchemaValidation: true,\n });\n\n return result;\n }\n\n private async summarize(params: IntegrationParams) {\n const { text, maxLength, style, model } = params as {\n text: string;\n maxLength?: number;\n style?: string;\n model?: string;\n };\n\n this.logger.debug('Summarizing text', { maxLength, style });\n\n const SummarySchema = z.object({\n summary: z.string(),\n keyPoints: z.array(z.string()),\n });\n\n const styleInstructions = style === 'bullet'\n ? 'Use bullet points.'\n : style === 'detailed'\n ? 'Be thorough and detailed.'\n : 'Be concise.';\n\n const lengthInstructions = maxLength\n ? `Keep the summary under ${maxLength} words.`\n : '';\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.3 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text summarizer. ${styleInstructions} ${lengthInstructions} Return JSON with: summary (string) and keyPoints (array of strings).`,\n userPrompt: text,\n schema: SummarySchema,\n temperature: 0.3,\n });\n\n return result;\n }\n}\n\n// Auto-register\nregisterIntegration('llm', LLMIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * DeepAgent integration for AI code generation\n */\nexport class DeepAgentIntegration extends BaseIntegration {\n private apiUrl: string;\n private apiKey: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.apiUrl = config.env.DEEPAGENT_API_URL || 'http://localhost:3000';\n this.apiKey = config.env.DEEPAGENT_API_KEY || '';\n\n this.logger.info('DeepAgent integration initialized', { apiUrl: this.apiUrl });\n }\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 'sendMessage':\n data = await this.executeWithRetry(() => this.sendMessage(params));\n break;\n case 'cancelGeneration':\n data = await this.executeWithRetry(() =>\n this.cancelGeneration(params),\n );\n break;\n case 'validateSchema':\n data = await this.executeWithRetry(() => this.validateSchema(params));\n break;\n case 'compileSchema':\n data = await this.executeWithRetry(() => this.compileSchema(params));\n break;\n case 'getThreadHistory':\n data = await this.executeWithRetry(() =>\n this.getThreadHistory(params),\n );\n break;\n default:\n throw new Error(`Unknown 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 private async sendMessage(params: IntegrationParams) {\n const { message, threadId, skill, context } = params;\n\n this.logger.debug('Sending message to DeepAgent', { threadId: String(threadId ?? ''), skill: String(skill ?? '') });\n\n const response = await this.request('/api/agent/message', {\n message,\n threadId,\n skill,\n context,\n });\n\n return response;\n }\n\n private async cancelGeneration(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Cancelling generation', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/cancel', {\n threadId,\n });\n\n return response;\n }\n\n private async validateSchema(params: IntegrationParams) {\n const { schema } = params;\n\n this.logger.debug('Validating schema');\n\n const response = await this.request('/api/schema/validate', {\n schema,\n });\n\n return response;\n }\n\n private async compileSchema(params: IntegrationParams) {\n const { schema, shell } = params;\n\n this.logger.debug('Compiling schema', { shell: String(shell ?? '') });\n\n const response = await this.request('/api/schema/compile', {\n schema,\n shell,\n });\n\n return response;\n }\n\n private async getThreadHistory(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Getting thread history', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/history', {\n threadId,\n });\n\n return response;\n }\n\n private async request(endpoint: string, body: IntegrationParams) {\n const url = `${this.apiUrl}${endpoint}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `DeepAgent request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return await response.json();\n }\n}\n\n// Auto-register\nregisterIntegration('deepagent', DeepAgentIntegration);\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","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { execSync } from 'child_process';\nimport { writeFileSync, mkdtempSync, rmSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\n\n/**\n * CLI integration for Almadar CLI commands.\n *\n * Wraps `@almadar/cli` commands (validate, compile) as integration actions.\n * This runs server-side and executes CLI commands as child processes.\n *\n * Actions:\n * - validate: Validate an orbital schema and return structured results\n */\nexport class CLIIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('CLI integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'validate':\n data = await this.validate(params);\n break;\n default:\n throw new Error(`Unknown CLI action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async validate(params: IntegrationParams) {\n const { schema } = params as { schema: string };\n\n if (!schema || typeof schema !== 'string') {\n throw new Error('validate requires a \"schema\" parameter (string)');\n }\n\n // Create temp directory for the schema file\n const tempDir = mkdtempSync(join(tmpdir(), 'almadar-validate-'));\n const schemaPath = join(tempDir, 'schema.orb');\n\n try {\n // Write schema content to temp file\n writeFileSync(schemaPath, schema, 'utf-8');\n\n this.logger.debug('Validating schema', { path: schemaPath });\n\n // Run CLI validation\n const output = execSync(\n `npx @almadar/cli validate \"${schemaPath}\" --format=json`,\n {\n encoding: 'utf-8',\n timeout: 30000,\n cwd: tempDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n // Parse JSON output\n const result = JSON.parse(output.trim());\n\n return {\n valid: result.valid ?? true,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch (error: unknown) {\n // CLI may return non-zero exit code for validation failures\n const execError = error as { stdout?: string; stderr?: string; message?: string };\n if (execError.stdout) {\n try {\n const result = JSON.parse(execError.stdout.trim());\n return {\n valid: false,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch {\n // stdout wasn't valid JSON, fall through\n }\n }\n\n // Actual execution failure\n throw new Error(\n `CLI validation failed: ${execError.message || String(error)}`,\n );\n } finally {\n // Cleanup temp directory\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n }\n}\n\n// Auto-register\nregisterIntegration('cli', CLIIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored entry in the in-memory cache */\ninterface CacheEntry {\n value: unknown;\n expiresAt?: number;\n}\n\n/** Callback type for pub/sub subscribers */\ntype SubscriberCallback = (msg: unknown) => void;\n\n/**\n * Redis / Cache integration with in-memory default backend.\n *\n * When `REDIS_URL` is provided in `config.env`, a warning is logged and the\n * integration falls back to the in-memory store (real Redis client support is\n * not yet implemented). When `REDIS_URL` is absent the in-memory store is\n * used silently — this is the expected development mode.\n */\nexport class RedisIntegration extends BaseIntegration {\n private store: Map<string, CacheEntry> = new Map();\n private locks: Map<string, string> = new Map();\n private channels: Map<string, Set<SubscriberCallback>> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const redisUrl = config.env.REDIS_URL;\n if (redisUrl) {\n this.logger.warn(\n 'REDIS_URL is configured but real Redis client is not yet implemented. ' +\n 'Falling back to in-memory store.',\n { redisUrl },\n );\n }\n\n this.logger.info('Redis integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'get':\n data = await this.executeWithRetry(() => this.getKey(params));\n break;\n case 'set':\n data = await this.executeWithRetry(() => this.setKey(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteKey(params));\n break;\n case 'lock':\n data = await this.executeWithRetry(() => this.acquireLock(params));\n break;\n case 'unlock':\n data = await this.executeWithRetry(() => this.releaseLock(params));\n break;\n case 'increment':\n data = await this.executeWithRetry(() => this.incrementKey(params));\n break;\n case 'expire':\n data = await this.executeWithRetry(() => this.expireKey(params));\n break;\n case 'publish':\n data = await this.executeWithRetry(() => this.publishMessage(params));\n break;\n case 'subscribe':\n data = await this.executeWithRetry(() =>\n this.subscribeChannel(params),\n );\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Remove expired entries on access and return whether a key is alive. */\n private isAlive(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) return false;\n if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n /** Generate a unique lock identifier. */\n private generateLockId(): string {\n return `lock_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async getKey(\n params: IntegrationParams,\n ): Promise<{ value: unknown }> {\n const key = params.key as string;\n\n this.logger.debug('Cache GET', { key });\n\n if (!this.isAlive(key)) {\n return { value: null };\n }\n\n const entry = this.store.get(key);\n return { value: entry ? entry.value : null };\n }\n\n private async setKey(\n params: IntegrationParams,\n ): Promise<{ ok: boolean }> {\n const key = params.key as string;\n const value = params.value;\n const ttl = params.ttl as number | undefined;\n\n this.logger.debug('Cache SET', { key, ttl });\n\n const entry: CacheEntry = { value };\n if (ttl !== undefined && ttl > 0) {\n entry.expiresAt = Date.now() + ttl * 1000;\n }\n\n this.store.set(key, entry);\n return { ok: true };\n }\n\n private async deleteKey(\n params: IntegrationParams,\n ): Promise<{ deleted: boolean }> {\n const key = params.key as string;\n\n this.logger.debug('Cache DELETE', { key });\n\n const existed = this.store.has(key);\n this.store.delete(key);\n return { deleted: existed };\n }\n\n private async acquireLock(\n params: IntegrationParams,\n ): Promise<{ acquired: boolean; lockId: string }> {\n const key = params.key as string;\n const ttl = (params.ttl as number | undefined) ?? 30_000;\n\n this.logger.debug('Cache LOCK', { key, ttl });\n\n // Check if the lock already exists and is still alive\n const existingLockId = this.locks.get(key);\n if (existingLockId) {\n // The lock key in the store tracks its expiry\n if (this.isAlive(`__lock:${key}`)) {\n return { acquired: false, lockId: '' };\n }\n // Expired — clean up\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n }\n\n const lockId = this.generateLockId();\n this.locks.set(key, lockId);\n // Store the lock with a TTL (ttl param is in ms, expiresAt is epoch ms)\n this.store.set(`__lock:${key}`, {\n value: lockId,\n expiresAt: Date.now() + ttl,\n });\n\n return { acquired: true, lockId };\n }\n\n private async releaseLock(\n params: IntegrationParams,\n ): Promise<{ released: boolean }> {\n const key = params.key as string;\n const lockId = params.lockId as string;\n\n this.logger.debug('Cache UNLOCK', { key, lockId });\n\n const currentLockId = this.locks.get(key);\n if (currentLockId !== lockId) {\n return { released: false };\n }\n\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n return { released: true };\n }\n\n private async incrementKey(\n params: IntegrationParams,\n ): Promise<{ value: number }> {\n const key = params.key as string;\n const by = (params.by as number | undefined) ?? 1;\n\n this.logger.debug('Cache INCR', { key, by });\n\n let current = 0;\n\n if (this.isAlive(key)) {\n const entry = this.store.get(key);\n if (entry) {\n current = typeof entry.value === 'number' ? entry.value : 0;\n }\n }\n\n const newValue = current + by;\n // Preserve existing TTL if the key already exists\n const existing = this.store.get(key);\n this.store.set(key, {\n value: newValue,\n expiresAt: existing?.expiresAt,\n });\n\n return { value: newValue };\n }\n\n private async expireKey(\n params: IntegrationParams,\n ): Promise<{ set: boolean }> {\n const key = params.key as string;\n const ttl = params.ttl as number;\n\n this.logger.debug('Cache EXPIRE', { key, ttl });\n\n if (!this.isAlive(key)) {\n return { set: false };\n }\n\n const entry = this.store.get(key);\n if (!entry) {\n return { set: false };\n }\n\n entry.expiresAt = Date.now() + ttl * 1000;\n this.store.set(key, entry);\n return { set: true };\n }\n\n private async publishMessage(\n params: IntegrationParams,\n ): Promise<{ receivers: number }> {\n const channel = params.channel as string;\n const message = params.message;\n\n this.logger.debug('Cache PUBLISH', { channel });\n\n const subscribers = this.channels.get(channel);\n if (!subscribers || subscribers.size === 0) {\n return { receivers: 0 };\n }\n\n for (const callback of subscribers) {\n try {\n callback(message);\n } catch (err) {\n this.logger.error('Subscriber callback error', {\n channel,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { receivers: subscribers.size };\n }\n\n private async subscribeChannel(\n params: IntegrationParams,\n ): Promise<{ subscribed: boolean }> {\n const channel = params.channel as string;\n\n this.logger.debug('Cache SUBSCRIBE', { channel });\n\n if (!this.channels.has(channel)) {\n this.channels.set(channel, new Set());\n }\n\n // The in-memory subscribe registers the channel but the actual callback\n // would be wired via a higher-level API. For the integration contract we\n // simply confirm the subscription was created.\n return { subscribed: true };\n }\n}\n\n// Auto-register\nregisterIntegration('redis', RedisIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Job status values */\ntype JobStatus = 'pending' | 'processing' | 'completed' | 'failed';\n\n/** Internal job representation */\ninterface QueueJob {\n id: string;\n queue: string;\n payload: unknown;\n priority: number;\n status: JobStatus;\n enqueuedAt: number;\n delay: number;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Queue integration with in-memory backend.\n *\n * Provides job queue semantics: enqueue, dequeue, status tracking,\n * completion, failure, cancellation, and size queries.\n */\nexport class QueueIntegration extends BaseIntegration {\n /** Map from queue name to ordered list of job IDs */\n private queues: Map<string, string[]> = new Map();\n\n /** Map from job ID to job data */\n private jobs: Map<string, QueueJob> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Queue integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'enqueue':\n data = await this.executeWithRetry(() => this.enqueue(params));\n break;\n case 'dequeue':\n data = await this.executeWithRetry(() => this.dequeue(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'complete':\n data = await this.executeWithRetry(() => this.complete(params));\n break;\n case 'fail':\n data = await this.executeWithRetry(() => this.failJob(params));\n break;\n case 'cancel':\n data = await this.executeWithRetry(() => this.cancel(params));\n break;\n case 'size':\n data = await this.executeWithRetry(() => this.size(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a unique job identifier. */\n private generateJobId(): string {\n return `job_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /** Get or create the queue array for a given queue name. */\n private getQueue(name: string): string[] {\n let queue = this.queues.get(name);\n if (!queue) {\n queue = [];\n this.queues.set(name, queue);\n }\n return queue;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async enqueue(\n params: IntegrationParams,\n ): Promise<{ jobId: string; position: number }> {\n const queueName = params.queue as string;\n const payload = params.payload;\n const delay = (params.delay as number | undefined) ?? 0;\n const priority = (params.priority as number | undefined) ?? 0;\n\n this.logger.debug('Queue ENQUEUE', { queue: queueName, delay, priority });\n\n const jobId = this.generateJobId();\n const job: QueueJob = {\n id: jobId,\n queue: queueName,\n payload,\n priority,\n status: 'pending',\n enqueuedAt: Date.now(),\n delay,\n };\n\n this.jobs.set(jobId, job);\n\n const queue = this.getQueue(queueName);\n\n // Insert respecting priority (higher priority = earlier in queue)\n let insertIndex = queue.length;\n for (let i = 0; i < queue.length; i++) {\n const existingJob = this.jobs.get(queue[i]);\n if (existingJob && existingJob.priority < priority) {\n insertIndex = i;\n break;\n }\n }\n queue.splice(insertIndex, 0, jobId);\n\n return { jobId, position: insertIndex };\n }\n\n private async dequeue(\n params: IntegrationParams,\n ): Promise<{ job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue DEQUEUE', { queue: queueName });\n\n const queue = this.getQueue(queueName);\n const now = Date.now();\n\n // Find first pending job whose delay has elapsed\n for (let i = 0; i < queue.length; i++) {\n const job = this.jobs.get(queue[i]);\n if (!job || job.status !== 'pending') continue;\n\n const readyAt = job.enqueuedAt + job.delay;\n if (now < readyAt) continue;\n\n // Mark as processing and remove from queue\n job.status = 'processing';\n queue.splice(i, 1);\n\n return {\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n return { job: null };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{ status: JobStatus; job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue STATUS', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job) {\n return { status: 'pending', job: null };\n }\n\n return {\n status: job.status,\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n private async complete(\n params: IntegrationParams,\n ): Promise<{ completed: boolean }> {\n const jobId = params.jobId as string;\n const result = params.result;\n\n this.logger.debug('Queue COMPLETE', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { completed: false };\n }\n\n job.status = 'completed';\n job.result = result;\n return { completed: true };\n }\n\n private async failJob(\n params: IntegrationParams,\n ): Promise<{ failed: boolean }> {\n const jobId = params.jobId as string;\n const error = params.error as string | undefined;\n\n this.logger.debug('Queue FAIL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { failed: false };\n }\n\n job.status = 'failed';\n job.error = error;\n return { failed: true };\n }\n\n private async cancel(\n params: IntegrationParams,\n ): Promise<{ cancelled: boolean }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue CANCEL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'pending') {\n return { cancelled: false };\n }\n\n // Remove from queue\n const queue = this.queues.get(job.queue);\n if (queue) {\n const idx = queue.indexOf(jobId);\n if (idx !== -1) {\n queue.splice(idx, 1);\n }\n }\n\n this.jobs.delete(jobId);\n return { cancelled: true };\n }\n\n private async size(\n params: IntegrationParams,\n ): Promise<{ size: number; pending: number; processing: number }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue SIZE', { queue: queueName });\n\n let pending = 0;\n let processing = 0;\n\n for (const job of this.jobs.values()) {\n if (job.queue !== queueName) continue;\n if (job.status === 'pending') pending++;\n if (job.status === 'processing') processing++;\n }\n\n return { size: pending + processing, pending, processing };\n }\n}\n\n// Auto-register\nregisterIntegration('queue', QueueIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** In-memory span representation */\ninterface Span {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n events: Array<{ name: string; timestamp: number; attributes?: IntegrationParams }>;\n}\n\n/** Shape of a stored metric */\ninterface Metric {\n name: string;\n type: 'counter' | 'gauge' | 'histogram';\n value: number;\n values: number[];\n labels: IntegrationParams;\n}\n\n/** Generate a random hex id of the given byte-length. */\nfunction randomHexId(bytes: number): string {\n const arr: string[] = [];\n for (let i = 0; i < bytes; i++) {\n arr.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return arr.join('');\n}\n\n/**\n * OpenTelemetry integration with in-memory backend.\n *\n * Tracks spans and metrics internally for development and testing purposes.\n * No actual OpenTelemetry SDK dependency is required.\n */\nexport class OtelIntegration extends BaseIntegration {\n private spans: Map<string, Span> = new Map();\n private metrics: Map<string, Metric> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('OTel integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'startSpan':\n data = await this.executeWithRetry(() => this.startSpan(params));\n break;\n case 'endSpan':\n data = await this.executeWithRetry(() => this.endSpan(params));\n break;\n case 'addEvent':\n data = await this.executeWithRetry(() => this.addEvent(params));\n break;\n case 'recordMetric':\n data = await this.executeWithRetry(() => this.recordMetric(params));\n break;\n case 'getSpan':\n data = await this.executeWithRetry(() => this.getSpan(params));\n break;\n case 'getMetrics':\n data = await this.executeWithRetry(() => this.getAllMetrics());\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async startSpan(\n params: IntegrationParams,\n ): Promise<{ spanId: string; traceId: string }> {\n const name = params.name as string;\n const attributes = (params.attributes as IntegrationParams | undefined) ?? {};\n const spanId = randomHexId(8);\n const traceId = (params.traceId as string | undefined) ?? randomHexId(16);\n\n const span: Span = {\n spanId,\n traceId,\n name,\n startTime: Date.now(),\n attributes,\n events: [],\n };\n\n this.spans.set(spanId, span);\n this.logger.debug('Span started', { spanId, traceId, name });\n\n return { spanId, traceId };\n }\n\n private async endSpan(\n params: IntegrationParams,\n ): Promise<{ ended: boolean }> {\n const spanId = params.spanId as string;\n const status = params.status as 'ok' | 'error' | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('endSpan called for unknown span', { spanId });\n return { ended: false };\n }\n\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n }\n\n this.logger.debug('Span ended', { spanId, status, duration: span.endTime - span.startTime });\n return { ended: true };\n }\n\n private async addEvent(\n params: IntegrationParams,\n ): Promise<{ added: boolean }> {\n const spanId = params.spanId as string;\n const name = params.name as string;\n const attributes = params.attributes as IntegrationParams | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('addEvent called for unknown span', { spanId });\n return { added: false };\n }\n\n span.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n\n this.logger.debug('Event added to span', { spanId, eventName: name });\n return { added: true };\n }\n\n private async recordMetric(\n params: IntegrationParams,\n ): Promise<{ recorded: boolean }> {\n const name = params.name as string;\n const value = params.value as number;\n const type = (params.type as 'counter' | 'gauge' | 'histogram' | undefined) ?? 'counter';\n const labels = (params.labels as IntegrationParams | undefined) ?? {};\n\n const existing = this.metrics.get(name);\n\n if (existing) {\n switch (type) {\n case 'counter':\n existing.value += value;\n break;\n case 'gauge':\n existing.value = value;\n break;\n case 'histogram':\n existing.values.push(value);\n break;\n }\n existing.labels = labels;\n } else {\n this.metrics.set(name, {\n name,\n type,\n value: type === 'histogram' ? 0 : value,\n values: type === 'histogram' ? [value] : [],\n labels,\n });\n }\n\n this.logger.debug('Metric recorded', { name, value, type });\n return { recorded: true };\n }\n\n private async getSpan(\n params: IntegrationParams,\n ): Promise<Span | null> {\n const spanId = params.spanId as string;\n const span = this.spans.get(spanId);\n return span ?? null;\n }\n\n private async getAllMetrics(): Promise<Record<string, Metric>> {\n const result: Record<string, Metric> = {};\n for (const [key, metric] of this.metrics) {\n result[key] = metric;\n }\n return result;\n }\n}\n\n// Auto-register\nregisterIntegration('otel', OtelIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Supported OAuth providers */\ntype OAuthProvider = 'google' | 'github' | 'auth0';\n\n/** Mock provider authorization endpoints */\nconst PROVIDER_AUTH_URLS: Record<OAuthProvider, string> = {\n google: 'https://accounts.google.com/o/oauth2/v2/auth',\n github: 'https://github.com/login/oauth/authorize',\n auth0: 'https://auth.example.com/authorize',\n};\n\n/** Stored token set */\ninterface TokenSet {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n}\n\n/** Mock user profile */\ninterface UserInfo {\n sub: string;\n email: string;\n name: string;\n picture: string;\n}\n\n/**\n * OAuth2/OIDC integration with in-memory mock backend.\n *\n * This is a development/mock implementation. No actual OAuth library is used.\n * State tokens, access tokens, and refresh tokens are generated in-memory and\n * tracked via Maps. Useful for testing OAuth flows without external providers.\n */\nexport class OAuthIntegration extends BaseIntegration {\n /** Maps state token -> provider for pending authorization flows */\n private states: Map<string, OAuthProvider> = new Map();\n\n /** Maps access token -> token set */\n private tokens: Map<string, TokenSet> = new Map();\n\n /** Maps refresh token -> access token for refresh lookups */\n private refreshIndex: Map<string, string> = new Map();\n\n /** Maps access token -> mock user session */\n private sessions: Map<string, UserInfo> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('OAuth integration initialized (mock backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'authorize':\n data = await this.executeWithRetry(() => this.authorize(params));\n break;\n case 'token':\n data = await this.executeWithRetry(() => this.token(params));\n break;\n case 'refresh':\n data = await this.executeWithRetry(() => this.refresh(params));\n break;\n case 'revoke':\n data = await this.executeWithRetry(() => this.revoke(params));\n break;\n case 'userinfo':\n data = await this.executeWithRetry(() => this.userinfo(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex token of the given byte length. */\n private generateToken(bytes: number = 32): string {\n const chars = 'abcdef0123456789';\n let result = '';\n for (let i = 0; i < bytes * 2; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n }\n\n /** Generate a mock user profile from a provider and access token. */\n private generateMockUser(provider: OAuthProvider, sub: string): UserInfo {\n return {\n sub,\n email: `user-${sub.slice(0, 8)}@${provider}.example.com`,\n name: `Mock User (${provider})`,\n picture: `https://${provider}.example.com/avatar/${sub.slice(0, 8)}.png`,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async authorize(\n params: IntegrationParams,\n ): Promise<{ authUrl: string; state: string }> {\n const provider = params.provider as OAuthProvider;\n const scopes = params.scopes as string[];\n const redirectUri = params.redirectUri as string;\n\n this.logger.debug('OAuth AUTHORIZE', { provider, scopes: scopes.join(', '), redirectUri });\n\n const state = this.generateToken(16);\n this.states.set(state, provider);\n\n const baseUrl = PROVIDER_AUTH_URLS[provider];\n const queryParams = new URLSearchParams({\n response_type: 'code',\n scope: scopes.join(' '),\n redirect_uri: redirectUri,\n state,\n client_id: this.config.env.CLIENT_ID ?? 'mock-client-id',\n });\n\n const authUrl = `${baseUrl}?${queryParams.toString()}`;\n\n return { authUrl, state };\n }\n\n private async token(\n params: IntegrationParams,\n ): Promise<{\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n tokenType: 'bearer';\n }> {\n const code = params.code as string;\n const state = params.state as string;\n\n this.logger.debug('OAuth TOKEN', { code, state });\n\n const provider = this.states.get(state);\n if (!provider) {\n throw new Error(\n `Invalid or expired state token: ${state}`,\n );\n }\n\n // Consume the state (one-time use)\n this.states.delete(state);\n\n const accessToken = this.generateToken(32);\n const refreshToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(accessToken, tokenSet);\n this.refreshIndex.set(refreshToken, accessToken);\n\n // Generate and store a mock user session\n const sub = this.generateToken(8);\n this.sessions.set(accessToken, this.generateMockUser(provider, sub));\n\n return { accessToken, refreshToken, expiresIn, tokenType: 'bearer' };\n }\n\n private async refresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n\n this.logger.debug('OAuth REFRESH', { refreshToken: refreshToken.slice(0, 8) + '...' });\n\n const oldAccessToken = this.refreshIndex.get(refreshToken);\n if (!oldAccessToken) {\n throw new Error('Invalid refresh token');\n }\n\n // Carry over user session to the new access token\n const userInfo = this.sessions.get(oldAccessToken);\n\n // Clean up old access token\n this.tokens.delete(oldAccessToken);\n this.sessions.delete(oldAccessToken);\n\n // Issue new access token\n const newAccessToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken: newAccessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(newAccessToken, tokenSet);\n this.refreshIndex.set(refreshToken, newAccessToken);\n\n if (userInfo) {\n this.sessions.set(newAccessToken, userInfo);\n }\n\n return { accessToken: newAccessToken, expiresIn };\n }\n\n private async revoke(\n params: IntegrationParams,\n ): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n\n this.logger.debug('OAuth REVOKE', { token: token.slice(0, 8) + '...' });\n\n // Check if it is an access token\n const tokenSet = this.tokens.get(token);\n if (tokenSet) {\n this.refreshIndex.delete(tokenSet.refreshToken);\n this.tokens.delete(token);\n this.sessions.delete(token);\n return { revoked: true };\n }\n\n // Check if it is a refresh token\n const accessToken = this.refreshIndex.get(token);\n if (accessToken) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n this.refreshIndex.delete(token);\n return { revoked: true };\n }\n\n return { revoked: false };\n }\n\n private async userinfo(\n params: IntegrationParams,\n ): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n\n this.logger.debug('OAuth USERINFO', { accessToken: accessToken.slice(0, 8) + '...' });\n\n const tokenSet = this.tokens.get(accessToken);\n if (!tokenSet) {\n throw new Error('Invalid access token');\n }\n\n if (Date.now() > tokenSet.expiresAt) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n throw new Error('Access token expired');\n }\n\n const userInfo = this.sessions.get(accessToken);\n if (!userInfo) {\n throw new Error('No session found for access token');\n }\n\n return userInfo;\n }\n}\n\n// Auto-register\nregisterIntegration('oauth', OAuthIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored object in the in-memory store */\ninterface StoredObject {\n content: unknown;\n contentType: string;\n size: number;\n metadata: IntegrationParams;\n lastModified: number;\n etag: string;\n}\n\n/**\n * Storage integration with in-memory backend for development/testing.\n *\n * Provides S3-compatible object storage operations (upload, download, list,\n * delete, getSignedUrl) backed by an in-memory Map. No cloud SDK dependencies\n * are required.\n */\nexport class StorageIntegration extends BaseIntegration {\n private objects: Map<string, StoredObject> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const storageUrl = config.env.STORAGE_URL;\n if (storageUrl) {\n this.logger.warn(\n 'STORAGE_URL is configured but real storage client is not yet implemented. ' +\n 'Falling back to in-memory store.',\n { storageUrl },\n );\n }\n\n this.logger.info('Storage integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'upload':\n data = await this.executeWithRetry(() => this.upload(params));\n break;\n case 'download':\n data = await this.executeWithRetry(() => this.download(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteObject(params));\n break;\n case 'getSignedUrl':\n data = await this.executeWithRetry(() => this.getSignedUrl(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Build a composite key from bucket and object key. */\n private compositeKey(bucket: string, key: string): string {\n return `${bucket}/${key}`;\n }\n\n /** Generate a deterministic etag from content. */\n private generateEtag(content: unknown): string {\n const raw = typeof content === 'string' ? content : JSON.stringify(content);\n // Simple hash — good enough for in-memory dev usage\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n const ch = raw.charCodeAt(i);\n hash = ((hash << 5) - hash + ch) | 0;\n }\n return `\"${Math.abs(hash).toString(16).padStart(8, '0')}\"`;\n }\n\n /** Compute the byte size of content. */\n private computeSize(content: unknown): number {\n if (typeof content === 'string') {\n return new TextEncoder().encode(content).byteLength;\n }\n return JSON.stringify(content).length;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async upload(\n params: IntegrationParams,\n ): Promise<{ key: string; bucket: string; size: number; etag: string }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n const content = params.content;\n const contentType = (params.contentType as string | undefined) ?? 'application/octet-stream';\n const metadata = (params.metadata as IntegrationParams | undefined) ?? {};\n\n this.logger.debug('Storage UPLOAD', { bucket, key, contentType });\n\n const size = this.computeSize(content);\n const etag = this.generateEtag(content);\n\n const obj: StoredObject = {\n content,\n contentType,\n size,\n metadata,\n lastModified: Date.now(),\n etag,\n };\n\n this.objects.set(this.compositeKey(bucket, key), obj);\n\n return { key, bucket, size, etag };\n }\n\n private async download(\n params: IntegrationParams,\n ): Promise<{\n content: unknown;\n contentType: string;\n size: number;\n metadata: IntegrationParams;\n }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n\n this.logger.debug('Storage DOWNLOAD', { bucket, key });\n\n const obj = this.objects.get(this.compositeKey(bucket, key));\n if (!obj) {\n throw new Error(`Object not found: ${bucket}/${key}`);\n }\n\n return {\n content: obj.content,\n contentType: obj.contentType,\n size: obj.size,\n metadata: obj.metadata,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{\n keys: Array<{ key: string; size: number; lastModified: number }>;\n truncated: boolean;\n }> {\n const bucket = params.bucket as string;\n const prefix = (params.prefix as string | undefined) ?? '';\n const maxKeys = (params.maxKeys as number | undefined) ?? 1000;\n\n this.logger.debug('Storage LIST', { bucket, prefix, maxKeys });\n\n const bucketPrefix = `${bucket}/`;\n const fullPrefix = `${bucket}/${prefix}`;\n const results: Array<{ key: string; size: number; lastModified: number }> = [];\n\n for (const [compositeKey, obj] of this.objects) {\n if (!compositeKey.startsWith(fullPrefix)) continue;\n\n // Strip the bucket prefix to get the object key\n const objectKey = compositeKey.slice(bucketPrefix.length);\n results.push({\n key: objectKey,\n size: obj.size,\n lastModified: obj.lastModified,\n });\n }\n\n // Sort by key for deterministic output\n results.sort((a, b) => a.key.localeCompare(b.key));\n\n const truncated = results.length > maxKeys;\n return {\n keys: results.slice(0, maxKeys),\n truncated,\n };\n }\n\n private async deleteObject(\n params: IntegrationParams,\n ): Promise<{ deleted: boolean }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n\n this.logger.debug('Storage DELETE', { bucket, key });\n\n const existed = this.objects.has(this.compositeKey(bucket, key));\n this.objects.delete(this.compositeKey(bucket, key));\n return { deleted: existed };\n }\n\n private async getSignedUrl(\n params: IntegrationParams,\n ): Promise<{ url: string; expiresAt: number }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n const expiresIn = (params.expiresIn as number | undefined) ?? 3600;\n const operation = (params.operation as 'get' | 'put' | undefined) ?? 'get';\n\n this.logger.debug('Storage GET_SIGNED_URL', { bucket, key, expiresIn, operation });\n\n const expiresAt = Date.now() + expiresIn * 1000;\n const token = Math.random().toString(36).slice(2, 18);\n const url =\n `https://storage.mock.local/${bucket}/${key}` +\n `?X-Amz-Algorithm=MOCK-HMAC-SHA256` +\n `&X-Amz-Expires=${expiresIn}` +\n `&X-Amz-SignedHeaders=host` +\n `&X-Amz-Signature=${token}` +\n `&operation=${operation}`;\n\n return { url, expiresAt };\n }\n}\n\n// Auto-register\nregisterIntegration('storage', StorageIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Represents a container in the in-memory store */\ninterface SimulatedContainer {\n id: string;\n name: string;\n image: string;\n status: 'created' | 'running' | 'paused' | 'exited' | 'dead';\n ports: Array<{ host: number; container: number; protocol: string }>;\n env: Record<string, string>;\n volumes: Array<{ host: string; container: string }>;\n command: string;\n labels: Record<string, string>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n logs: string[];\n}\n\n/** Represents a built image in the in-memory store */\ninterface SimulatedImage {\n id: string;\n tag: string;\n dockerfile: string;\n size: number;\n createdAt: number;\n}\n\n/**\n * Docker/Container integration with in-memory backend for development/testing.\n *\n * Provides container lifecycle operations (build, run, stop, remove, logs,\n * status, list) backed by an in-memory Map. No Docker SDK or daemon connection\n * is required.\n */\nexport class DockerIntegration extends BaseIntegration {\n private containers: Map<string, SimulatedContainer> = new Map();\n private images: Map<string, SimulatedImage> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const dockerHost = config.env.DOCKER_HOST;\n if (dockerHost) {\n this.logger.warn(\n 'DOCKER_HOST is configured but real Docker client is not yet implemented. ' +\n 'Falling back to in-memory simulation.',\n { dockerHost },\n );\n }\n\n this.logger.info('Docker integration initialized (in-memory simulation)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'build':\n data = await this.executeWithRetry(() => this.build(params));\n break;\n case 'run':\n data = await this.executeWithRetry(() => this.run(params));\n break;\n case 'stop':\n data = await this.executeWithRetry(() => this.stop(params));\n break;\n case 'remove':\n data = await this.executeWithRetry(() => this.removeContainer(params));\n break;\n case 'logs':\n data = await this.executeWithRetry(() => this.logs(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex container/image ID. */\n private generateId(): string {\n const segments: string[] = [];\n for (let i = 0; i < 16; i++) {\n segments.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return segments.join('');\n }\n\n /** Find a container by ID (prefix match supported). */\n private findContainer(containerId: string): SimulatedContainer | undefined {\n // Exact match first\n const exact = this.containers.get(containerId);\n if (exact) return exact;\n\n // Prefix match (like real Docker)\n for (const [id, container] of this.containers) {\n if (id.startsWith(containerId)) {\n return container;\n }\n }\n\n return undefined;\n }\n\n /** Generate realistic log lines for a container. */\n private generateLogLines(container: SimulatedContainer, count: number): string[] {\n const lines: string[] = [...container.logs];\n const baseTime = container.startedAt ?? container.createdAt;\n\n while (lines.length < count) {\n const ts = new Date(baseTime + lines.length * 1000).toISOString();\n lines.push(`${ts} [info] Container ${container.name} — heartbeat #${lines.length + 1}`);\n }\n\n return lines;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async build(\n params: IntegrationParams,\n ): Promise<{ imageId: string; tag: string; size: number; buildTime: number }> {\n const dockerfile = (params.dockerfile as string | undefined) ?? 'Dockerfile';\n const tag = params.tag as string;\n const context = (params.context as string | undefined) ?? '.';\n const buildArgs = (params.buildArgs as Record<string, string> | undefined) ?? {};\n\n this.logger.debug('Docker BUILD', { dockerfile, tag, context, buildArgs });\n\n const imageId = `sha256:${this.generateId()}`;\n const size = 150_000_000 + Math.floor(Math.random() * 350_000_000); // 150–500 MB\n const buildTime = 2000 + Math.floor(Math.random() * 8000); // 2–10s simulated\n\n const image: SimulatedImage = {\n id: imageId,\n tag,\n dockerfile,\n size,\n createdAt: Date.now(),\n };\n\n this.images.set(tag, image);\n\n return { imageId, tag, size, buildTime };\n }\n\n private async run(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n }> {\n const image = params.image as string;\n const name = (params.name as string | undefined) ?? `container-${this.generateId().slice(0, 12)}`;\n const rawPorts = (params.ports as Array<{ host: number; container: number; protocol?: string }> | undefined) ?? [];\n const env = (params.env as Record<string, string> | undefined) ?? {};\n const rawVolumes = (params.volumes as Array<{ host: string; container: string }> | undefined) ?? [];\n const command = (params.command as string | undefined) ?? '';\n\n this.logger.debug('Docker RUN', { image, name, ports: rawPorts.map(p => `${p.host}:${p.container}`).join(', '), volumes: rawVolumes.map(v => `${v.host}:${v.container}`).join(', '), command });\n\n const containerId = this.generateId();\n\n const ports = rawPorts.map((p) => ({\n host: p.host,\n container: p.container,\n protocol: p.protocol ?? 'tcp',\n }));\n\n const volumes = rawVolumes.map((v) => ({\n host: v.host,\n container: v.container,\n }));\n\n const container: SimulatedContainer = {\n id: containerId,\n name,\n image,\n status: 'running',\n ports,\n env,\n volumes,\n command,\n labels: {},\n createdAt: Date.now(),\n startedAt: Date.now(),\n stoppedAt: null,\n logs: [\n `${new Date().toISOString()} [info] Starting container ${name} from image ${image}`,\n `${new Date().toISOString()} [info] Container ${name} is now running`,\n ],\n };\n\n this.containers.set(containerId, container);\n\n return {\n containerId,\n name,\n status: container.status,\n ports,\n };\n }\n\n private async stop(\n params: IntegrationParams,\n ): Promise<{ containerId: string; status: string; stoppedAt: number }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STOP', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status !== 'running' && container.status !== 'paused') {\n throw new Error(`Container ${containerId} is not running (current status: ${container.status})`);\n }\n\n container.status = 'exited';\n container.stoppedAt = Date.now();\n container.logs.push(\n `${new Date().toISOString()} [info] Container ${container.name} stopped`,\n );\n\n return {\n containerId: container.id,\n status: container.status,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async removeContainer(\n params: IntegrationParams,\n ): Promise<{ containerId: string; removed: boolean }> {\n const containerId = params.containerId as string;\n const force = (params.force as boolean | undefined) ?? false;\n\n this.logger.debug('Docker REMOVE', { containerId, force });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status === 'running' && !force) {\n throw new Error(\n `Container ${containerId} is running. Stop it first or use force=true.`,\n );\n }\n\n this.containers.delete(container.id);\n\n return { containerId: container.id, removed: true };\n }\n\n private async logs(\n params: IntegrationParams,\n ): Promise<{ containerId: string; logs: string[]; lineCount: number }> {\n const containerId = params.containerId as string;\n const tail = (params.tail as number | undefined) ?? 100;\n const since = (params.since as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LOGS', { containerId, tail, since });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n let logLines = this.generateLogLines(container, tail);\n\n // Filter by since timestamp if provided\n if (since) {\n const sinceMs = new Date(since).getTime();\n logLines = logLines.filter((line) => {\n const timestampMatch = /^\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z/.exec(line);\n if (!timestampMatch) return true;\n return new Date(timestampMatch[0]).getTime() >= sinceMs;\n });\n }\n\n // Apply tail limit\n const tailedLines = logLines.slice(-tail);\n\n return {\n containerId: container.id,\n logs: tailedLines,\n lineCount: tailedLines.length,\n };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STATUS', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n return {\n containerId: container.id,\n name: container.name,\n image: container.image,\n status: container.status,\n ports: container.ports,\n createdAt: container.createdAt,\n startedAt: container.startedAt,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{\n containers: Array<{\n id: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n }>;\n total: number;\n }> {\n const showAll = (params.all as boolean | undefined) ?? false;\n const filterByLabel = (params.filterByLabel as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LIST', { all: showAll, filterByLabel });\n\n let entries = Array.from(this.containers.values());\n\n // By default, only show running containers (like `docker ps`)\n if (!showAll) {\n entries = entries.filter((c) => c.status === 'running');\n }\n\n // Filter by label if specified\n if (filterByLabel) {\n const [labelKey, labelValue] = filterByLabel.split('=');\n entries = entries.filter((c) => {\n if (labelValue !== undefined) {\n return c.labels[labelKey] === labelValue;\n }\n return labelKey in c.labels;\n });\n }\n\n // Sort by creation time (newest first)\n entries.sort((a, b) => b.createdAt - a.createdAt);\n\n const containers = entries.map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image,\n status: c.status,\n ports: c.ports,\n createdAt: c.createdAt,\n }));\n\n return { containers, total: containers.length };\n }\n}\n\n// Auto-register\nregisterIntegration('docker', DockerIntegration);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/logger.ts","../src/core/validation.ts","../src/core/retry.ts","../src/core/BaseIntegration.ts","../src/registry.ts","../src/factory.ts","../src/integrations/stripe/webhooks.ts","../src/integrations/stripe/index.ts","../src/integrations/youtube/index.ts","../src/integrations/twilio/index.ts","../src/integrations/email/index.ts","../src/integrations/llm/index.ts","../src/integrations/deepagent/index.ts","../src/types.ts","../src/integrations/github/github-git.ts","../src/integrations/github/github-api.ts","../src/integrations/github/index.ts","../src/integrations/cli/index.ts","../src/integrations/redis/index.ts","../src/integrations/queue/index.ts","../src/integrations/otel/index.ts","../src/integrations/oauth/index.ts","../src/integrations/storage/index.ts","../src/integrations/docker/index.ts"],"names":["STRIPE_API_VERSION","isoFromUnix","priceToTier","mapStatus","shapeSubscription","Stripe","sub","fs","join"],"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","import type { IntegrationConfig } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\n\n/**\n * Integration constructor type\n */\nexport type IntegrationConstructor = new (\n config: IntegrationConfig,\n) => BaseIntegration;\n\n/**\n * Integration registry (populated as integrations are imported)\n */\nexport const INTEGRATION_REGISTRY: Record<string, IntegrationConstructor> = {};\n\n/**\n * Register an integration\n */\nexport function registerIntegration(\n name: string,\n constructor: IntegrationConstructor,\n): void {\n INTEGRATION_REGISTRY[name] = constructor;\n}\n\n/**\n * Get integration constructor by name\n */\nexport function getIntegration(\n name: string,\n): IntegrationConstructor | undefined {\n return INTEGRATION_REGISTRY[name];\n}\n\n/**\n * Check if integration is known\n */\nexport function isKnownIntegration(name: string): boolean {\n return name in INTEGRATION_REGISTRY;\n}\n\n/**\n * Get all registered integration names\n */\nexport function getRegisteredIntegrations(): string[] {\n return Object.keys(INTEGRATION_REGISTRY);\n}\n","import type { IntegrationConfig, IntegrationResult, IntegrationParams } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\nimport { getIntegration } from './registry';\n\n/**\n * Factory for creating and managing integration instances\n */\nexport class IntegrationFactory {\n private instances: Map<string, BaseIntegration> = new Map();\n private configs: Map<string, IntegrationConfig> = new Map();\n\n /**\n * Configure an integration (doesn't instantiate yet)\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>): void {\n this.configs.set(name, { name, ...config });\n }\n\n /**\n * Get or create an integration instance\n */\n get(name: string): BaseIntegration {\n // Return existing instance\n if (this.instances.has(name)) {\n return this.instances.get(name)!;\n }\n\n // Get constructor\n const Constructor = getIntegration(name);\n if (!Constructor) {\n throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);\n }\n\n // Get config\n const config = this.configs.get(name);\n if (!config) {\n throw new Error(\n `Integration not configured: ${name}. Call configure() first.`,\n );\n }\n\n // Create instance\n const instance = new Constructor(config);\n this.instances.set(name, instance);\n\n return instance;\n }\n\n /**\n * Execute an action on an integration\n */\n async execute(\n integration: string,\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration);\n return await instance.execute(action, params);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string): boolean {\n return this.configs.has(name);\n }\n\n /**\n * Register an integration instance directly (used by mock infrastructure)\n */\n registerInstance(name: string, instance: BaseIntegration): void {\n this.instances.set(name, instance);\n }\n\n /**\n * Clear all instances (useful for testing)\n */\n clear(): void {\n this.instances.clear();\n }\n\n /**\n * Clear all instances and configs\n */\n reset(): void {\n this.instances.clear();\n this.configs.clear();\n }\n}\n\nlet _factory: IntegrationFactory | null = null;\n\nexport function getIntegrationFactory(): IntegrationFactory {\n if (!_factory) {\n _factory = new IntegrationFactory();\n }\n return _factory;\n}\n\nexport function resetIntegrationFactory(): void {\n _factory?.reset();\n _factory = null;\n}\n","/**\n * Verify + parse Stripe webhook signatures into canonical Almadar\n * events. Apps/builder calls this from its `/billing/stripe-webhook`\n * route and switches on the returned discriminated union — it never\n * imports the `stripe` SDK or any `Stripe.*` shape.\n *\n * The five handled event types mirror docs §5.2 / `Almadar_Studio_Subscriptions.md`:\n * - customer.subscription.created\n * - customer.subscription.updated\n * - customer.subscription.deleted\n * - invoice.payment_succeeded\n * - invoice.payment_failed\n *\n * Anything else returns `{ error: 'unknown-event-type', stripeType: … }`\n * so the route can acknowledge with 200 + a log line (Stripe stops\n * retrying acknowledged events).\n */\n\nimport Stripe from 'stripe';\nimport type {\n AlmadarStripeEvent,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n StripePriceMap,\n} from './types';\n\nexport interface VerifyAndParseInput {\n rawBody: string | Buffer;\n signature: string;\n /** Stripe webhook secret (`whsec_…`). */\n secret: string;\n /** Map of provisioned Stripe Price IDs → Almadar tier. */\n prices: StripePriceMap;\n}\n\nconst STRIPE_API_VERSION: Stripe.LatestApiVersion = '2025-02-24.acacia';\n\nfunction priceToTier(priceId: string, prices: StripePriceMap): AlmadarTier | null {\n if (priceId === prices.solo) return 'solo';\n if (priceId === prices.teams) return 'teams';\n return null;\n}\n\nfunction mapStatus(status: Stripe.Subscription.Status): AlmadarSubscriptionStatus {\n switch (status) {\n case 'active':\n case 'past_due':\n case 'canceled':\n case 'incomplete':\n case 'incomplete_expired':\n case 'trialing':\n case 'unpaid':\n return status;\n case 'paused':\n return 'unpaid';\n default: {\n const _exhaustive: never = status;\n void _exhaustive;\n return 'incomplete';\n }\n }\n}\n\nfunction isoFromUnix(seconds: number): string {\n return new Date(seconds * 1000).toISOString();\n}\n\nfunction shapeSubscription(\n sub: Stripe.Subscription,\n prices: StripePriceMap,\n): AlmadarSubscription {\n const firstItem = sub.items.data[0];\n const priceId = firstItem?.price.id ?? '';\n const quantity = firstItem?.quantity ?? 1;\n const customerId =\n typeof sub.customer === 'string' ? sub.customer : sub.customer.id;\n\n return {\n subscriptionId: sub.id,\n customerId,\n status: mapStatus(sub.status),\n priceId,\n quantity,\n currentPeriodStart: isoFromUnix(sub.current_period_start),\n currentPeriodEnd: isoFromUnix(sub.current_period_end),\n cancelAtPeriodEnd: sub.cancel_at_period_end,\n tier: priceToTier(priceId, prices),\n };\n}\n\nfunction customerIdOf(\n customer: string | Stripe.Customer | Stripe.DeletedCustomer | null,\n): string {\n if (customer === null) return '';\n return typeof customer === 'string' ? customer : customer.id;\n}\n\n/**\n * Verify Stripe's signature header against the raw body and shape the\n * payload into a canonical `AlmadarStripeEvent`. The `stripe` SDK is\n * only used inside this module.\n */\nexport function verifyAndParseStripeEvent(\n input: VerifyAndParseInput,\n): AlmadarStripeEvent {\n // Constructed lazily — `webhooks` is a stateless utility on the\n // Stripe client. We need an instance to access `constructEvent`.\n const stripe = new Stripe('placeholder-only-for-webhook-utility', {\n apiVersion: STRIPE_API_VERSION,\n });\n\n let event: Stripe.Event;\n try {\n event = stripe.webhooks.constructEvent(\n input.rawBody,\n input.signature,\n input.secret,\n );\n } catch {\n return { error: 'bad-signature' };\n }\n\n switch (event.type) {\n case 'customer.subscription.created': {\n const sub = event.data.object as Stripe.Subscription;\n return {\n type: 'subscription.created',\n eventId: event.id,\n data: shapeSubscription(sub, input.prices),\n };\n }\n case 'customer.subscription.updated': {\n const sub = event.data.object as Stripe.Subscription;\n return {\n type: 'subscription.updated',\n eventId: event.id,\n data: shapeSubscription(sub, input.prices),\n };\n }\n case 'customer.subscription.deleted': {\n const sub = event.data.object as Stripe.Subscription;\n return {\n type: 'subscription.deleted',\n eventId: event.id,\n data: {\n subscriptionId: sub.id,\n customerId: customerIdOf(sub.customer),\n },\n };\n }\n case 'invoice.payment_succeeded': {\n const invoice = event.data.object as Stripe.Invoice;\n const subRef = invoice.subscription;\n return {\n type: 'invoice.payment_succeeded',\n eventId: event.id,\n data: {\n customerId: customerIdOf(invoice.customer),\n subscriptionId:\n typeof subRef === 'string' ? subRef : subRef?.id ?? null,\n paidAt: isoFromUnix(invoice.status_transitions.paid_at ?? invoice.created),\n amountUsd: invoice.amount_paid / 100,\n },\n };\n }\n case 'invoice.payment_failed': {\n const invoice = event.data.object as Stripe.Invoice;\n const subRef = invoice.subscription;\n return {\n type: 'invoice.payment_failed',\n eventId: event.id,\n data: {\n customerId: customerIdOf(invoice.customer),\n subscriptionId:\n typeof subRef === 'string' ? subRef : subRef?.id ?? null,\n failedAt: isoFromUnix(invoice.created),\n reason:\n invoice.last_finalization_error?.message ??\n 'Payment failed; reason not provided by Stripe.',\n },\n };\n }\n default:\n return { error: 'unknown-event-type', stripeType: event.type };\n }\n}\n","import Stripe from 'stripe';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationError,\n IntegrationParams,\n} from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport type {\n AlmadarCheckoutSession,\n AlmadarCustomer,\n AlmadarPortalSession,\n AlmadarSubscription,\n AlmadarSubscriptionStatus,\n AlmadarTier,\n AlmadarInvoicePayment,\n AlmadarInvoiceFailure,\n AlmadarStripeEvent,\n AlmadarStripeEventOk,\n CancelSubscriptionInput,\n CreateCheckoutInput,\n CreateCustomerInput,\n CreatePortalInput,\n StripePriceMap,\n UpdateSubscriptionInput,\n} from './types';\n\nexport { verifyAndParseStripeEvent } from './webhooks';\nexport type { VerifyAndParseInput } from './webhooks';\n\nconst STRIPE_API_VERSION: Stripe.LatestApiVersion = '2025-02-24.acacia';\n\nfunction isoFromUnix(seconds: number): string {\n return new Date(seconds * 1000).toISOString();\n}\n\nfunction priceToTier(priceId: string, prices: StripePriceMap): AlmadarTier | null {\n if (priceId === prices.solo) return 'solo';\n if (priceId === prices.teams) return 'teams';\n return null;\n}\n\nfunction mapStatus(status: Stripe.Subscription.Status): AlmadarSubscriptionStatus {\n switch (status) {\n case 'active':\n case 'past_due':\n case 'canceled':\n case 'incomplete':\n case 'incomplete_expired':\n case 'trialing':\n case 'unpaid':\n return status;\n case 'paused':\n return 'unpaid';\n default: {\n const _exhaustive: never = status;\n void _exhaustive;\n return 'incomplete';\n }\n }\n}\n\nfunction shapeSubscription(\n sub: Stripe.Subscription,\n prices: StripePriceMap,\n): AlmadarSubscription {\n const firstItem = sub.items.data[0];\n const priceId = firstItem?.price.id ?? '';\n const quantity = firstItem?.quantity ?? 1;\n const customerId =\n typeof sub.customer === 'string' ? sub.customer : sub.customer.id;\n return {\n subscriptionId: sub.id,\n customerId,\n status: mapStatus(sub.status),\n priceId,\n quantity,\n currentPeriodStart: isoFromUnix(sub.current_period_start),\n currentPeriodEnd: isoFromUnix(sub.current_period_end),\n cancelAtPeriodEnd: sub.cancel_at_period_end,\n tier: priceToTier(priceId, prices),\n };\n}\n\nfunction shapeCustomer(customer: Stripe.Customer): AlmadarCustomer {\n return {\n customerId: customer.id,\n email: customer.email ?? null,\n almadarUid: customer.metadata?.almadarUid ?? null,\n };\n}\n\n/**\n * Stripe integration for payment processing and subscription billing.\n *\n * Two surfaces:\n * - Legacy `execute(action, params)` switch for the original three\n * PaymentIntent actions (kept for back-compat).\n * - New typed methods (`createCustomer`, `createCheckoutSession`,\n * `createSubscription`, etc.) that return canonical `Almadar*`\n * types. Consumers MUST prefer these — `Stripe.*` types never leak.\n */\nexport class StripeIntegration extends BaseIntegration {\n private client: Stripe;\n private prices: StripePriceMap;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.STRIPE_SECRET_KEY;\n if (!apiKey) {\n throw new Error('STRIPE_SECRET_KEY not configured');\n }\n\n this.client = new Stripe(apiKey, {\n apiVersion: STRIPE_API_VERSION,\n });\n\n this.prices = {\n solo: config.env.STRIPE_PRICE_SOLO ?? '',\n teams: config.env.STRIPE_PRICE_TEAMS ?? '',\n };\n\n this.logger.info('Stripe integration initialized');\n }\n\n /** Provisioned Price IDs the integration was constructed with. */\n getPrices(): StripePriceMap {\n return this.prices;\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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 const retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'createPaymentIntent':\n data = await this.executeWithRetry(() =>\n this.createPaymentIntent(params),\n );\n break;\n case 'confirmPayment':\n data = await this.executeWithRetry(() => this.confirmPayment(params));\n break;\n case 'refund':\n data = await this.executeWithRetry(() => this.refund(params));\n break;\n default:\n throw new Error(`Unknown 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 private async createPaymentIntent(params: IntegrationParams) {\n const { amount, currency, metadata } = params;\n this.logger.debug('Creating payment intent', {\n amount: Number(amount),\n currency: String(currency ?? ''),\n });\n return await this.client.paymentIntents.create({\n amount: amount as number,\n currency: currency as string,\n metadata: metadata as Stripe.MetadataParam | undefined,\n });\n }\n\n private async confirmPayment(params: IntegrationParams) {\n const { paymentIntentId } = params;\n this.logger.debug('Confirming payment', {\n paymentIntentId: String(paymentIntentId ?? ''),\n });\n return await this.client.paymentIntents.confirm(paymentIntentId as string);\n }\n\n private async refund(params: IntegrationParams) {\n const { paymentIntentId, amount } = params;\n this.logger.debug('Creating refund', {\n paymentIntentId: String(paymentIntentId ?? ''),\n amount: Number(amount),\n });\n return await this.client.refunds.create({\n payment_intent: paymentIntentId as string,\n amount: amount as number | undefined,\n });\n }\n\n // ───────────────────────────────────────────────────────────────────\n // Typed action surface — canonical Almadar shapes only.\n // ───────────────────────────────────────────────────────────────────\n\n /** Look up an existing customer by Stripe ID. */\n async getCustomer(customerId: string): Promise<AlmadarCustomer | null> {\n this.logger.debug('Fetching customer', { customerId });\n const customer = await this.client.customers.retrieve(customerId);\n if (customer.deleted === true) return null;\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe Customer for the given Almadar user. `almadarUid` is\n * stored as Stripe metadata so webhook handlers can resolve back to\n * the right `users/{uid}` document.\n */\n async createCustomer(input: CreateCustomerInput): Promise<AlmadarCustomer> {\n this.logger.debug('Creating customer', { almadarUid: input.almadarUid });\n const customer = await this.client.customers.create({\n email: input.email,\n name: input.displayName ?? undefined,\n metadata: { almadarUid: input.almadarUid },\n });\n return shapeCustomer(customer);\n }\n\n /**\n * Create a Stripe-hosted Checkout Session for the given tier. Client\n * redirects the user to the returned `url`; on success Stripe fires\n * `customer.subscription.created`, which the apps/builder webhook\n * handler turns into a `users/{uid}.tier` write.\n */\n async createCheckoutSession(\n input: CreateCheckoutInput,\n ): Promise<AlmadarCheckoutSession> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n\n this.logger.debug('Creating Checkout session', {\n tier: input.tier,\n quantity: input.quantity,\n hasCustomer: input.customerId !== null,\n });\n\n const session = await this.client.checkout.sessions.create({\n mode: 'subscription',\n customer: input.customerId ?? undefined,\n line_items: [{ price, quantity: input.quantity }],\n success_url: input.successUrl,\n cancel_url: input.cancelUrl,\n subscription_data: {\n metadata: input.metadata,\n },\n automatic_tax: { enabled: true },\n allow_promotion_codes: true,\n });\n\n return {\n url: session.url ?? '',\n sessionId: session.id,\n customerId:\n typeof session.customer === 'string'\n ? session.customer\n : session.customer?.id ?? null,\n };\n }\n\n /** Create a Billing Portal session for self-service plan management. */\n async createBillingPortalSession(\n input: CreatePortalInput,\n ): Promise<AlmadarPortalSession> {\n this.logger.debug('Creating Portal session', { customerId: input.customerId });\n const session = await this.client.billingPortal.sessions.create({\n customer: input.customerId,\n return_url: input.returnUrl,\n });\n return {\n url: session.url,\n customerId: input.customerId,\n };\n }\n\n /** Fetch a subscription and shape it into the canonical form. */\n async getSubscription(subscriptionId: string): Promise<AlmadarSubscription> {\n this.logger.debug('Fetching subscription', { subscriptionId });\n const sub = await this.client.subscriptions.retrieve(subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Create a subscription directly (server-side, no Checkout). Used by\n * P13.3 Solo → Teams upgrade flow.\n */\n async createSubscription(input: {\n customerId: string;\n tier: 'solo' | 'teams';\n quantity: number;\n metadata: Record<string, string>;\n }): Promise<AlmadarSubscription> {\n const price = input.tier === 'solo' ? this.prices.solo : this.prices.teams;\n if (!price) {\n throw new Error(`STRIPE_PRICE_${input.tier.toUpperCase()} not configured`);\n }\n this.logger.debug('Creating subscription', {\n customerId: input.customerId,\n tier: input.tier,\n quantity: input.quantity,\n });\n const sub = await this.client.subscriptions.create({\n customer: input.customerId,\n items: [{ price, quantity: input.quantity }],\n metadata: input.metadata,\n proration_behavior: 'create_prorations',\n automatic_tax: { enabled: true },\n });\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Update quantity or cancel-at-period-end. Used for Teams seat resize\n * and Solo → Teams transition.\n */\n async updateSubscription(\n input: UpdateSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Updating subscription', { subscriptionId: input.subscriptionId });\n const update: Stripe.SubscriptionUpdateParams = {\n proration_behavior: 'create_prorations',\n };\n if (typeof input.quantity === 'number') {\n const existing = await this.client.subscriptions.retrieve(input.subscriptionId);\n const itemId = existing.items.data[0]?.id;\n if (itemId !== undefined) {\n update.items = [{ id: itemId, quantity: input.quantity }];\n }\n }\n if (typeof input.cancelAtPeriodEnd === 'boolean') {\n update.cancel_at_period_end = input.cancelAtPeriodEnd;\n }\n const sub = await this.client.subscriptions.update(\n input.subscriptionId,\n update,\n );\n return shapeSubscription(sub, this.prices);\n }\n\n /**\n * Cancel a subscription. Defaults to `atPeriodEnd: true` so the user\n * keeps access until the current period ends.\n */\n async cancelSubscription(\n input: CancelSubscriptionInput,\n ): Promise<AlmadarSubscription> {\n this.logger.debug('Canceling subscription', {\n subscriptionId: input.subscriptionId,\n atPeriodEnd: input.atPeriodEnd,\n });\n if (input.atPeriodEnd) {\n const sub = await this.client.subscriptions.update(input.subscriptionId, {\n cancel_at_period_end: true,\n });\n return shapeSubscription(sub, this.prices);\n }\n const sub = await this.client.subscriptions.cancel(input.subscriptionId);\n return shapeSubscription(sub, this.prices);\n }\n}\n\n// Auto-register\nregisterIntegration('stripe', StripeIntegration);\n","import { google, youtube_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * YouTube Data API integration\n */\nexport class YouTubeIntegration extends BaseIntegration {\n private client: youtube_v3.Youtube;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const apiKey = config.env.YOUTUBE_API_KEY;\n if (!apiKey) {\n throw new Error('YOUTUBE_API_KEY not configured');\n }\n\n this.client = google.youtube({\n version: 'v3',\n auth: apiKey,\n });\n\n this.logger.info('YouTube integration initialized');\n }\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 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getVideo':\n data = await this.executeWithRetry(() => this.getVideo(params));\n break;\n case 'getChannel':\n data = await this.executeWithRetry(() => this.getChannel(params));\n break;\n default:\n throw new Error(`Unknown 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 private async search(params: IntegrationParams) {\n const { query, maxResults, type } = params;\n\n this.logger.debug('Searching YouTube', { query: String(query ?? ''), maxResults: Number(maxResults ?? 10), type: String(type ?? '') });\n\n const response = await this.client.search.list({\n part: ['snippet'],\n q: query as string,\n maxResults: (maxResults as number) || 10,\n type: type ? [type as string] : undefined,\n });\n\n return response.data.items?.map((item) => ({\n videoId: item.id?.videoId,\n title: item.snippet?.title,\n thumbnail: item.snippet?.thumbnails?.default?.url,\n description: item.snippet?.description,\n }));\n }\n\n private async getVideo(params: IntegrationParams) {\n const { videoId } = params;\n\n this.logger.debug('Getting video details', { videoId: String(videoId ?? '') });\n\n const response = await this.client.videos.list({\n part: ['snippet', 'statistics'],\n id: [videoId as string],\n });\n\n const video = response.data.items?.[0];\n if (!video) {\n throw new Error(`Video not found: ${videoId}`);\n }\n\n return {\n title: video.snippet?.title,\n description: video.snippet?.description,\n viewCount: video.statistics?.viewCount,\n likeCount: video.statistics?.likeCount,\n };\n }\n\n private async getChannel(params: IntegrationParams) {\n const { channelId } = params;\n\n this.logger.debug('Getting channel details', { channelId: String(channelId ?? '') });\n\n const response = await this.client.channels.list({\n part: ['snippet', 'statistics'],\n id: [channelId as string],\n });\n\n const channel = response.data.items?.[0];\n if (!channel) {\n throw new Error(`Channel not found: ${channelId}`);\n }\n\n return {\n name: channel.snippet?.title,\n description: channel.snippet?.description,\n subscriberCount: channel.statistics?.subscriberCount,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('youtube', YouTubeIntegration);\n","import twilio from 'twilio';\nimport type { Twilio } from 'twilio';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Twilio messaging integration\n */\nexport class TwilioIntegration extends BaseIntegration {\n private client: Twilio;\n private phoneNumber: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const accountSid = config.env.TWILIO_ACCOUNT_SID;\n const authToken = config.env.TWILIO_AUTH_TOKEN;\n this.phoneNumber = config.env.TWILIO_PHONE_NUMBER || '';\n\n if (!accountSid || !authToken) {\n throw new Error('TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN not configured');\n }\n\n this.client = twilio(accountSid, authToken);\n\n this.logger.info('Twilio integration initialized');\n }\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 'sendSMS':\n data = await this.executeWithRetry(() => this.sendSMS(params));\n break;\n case 'sendWhatsApp':\n data = await this.executeWithRetry(() => this.sendWhatsApp(params));\n break;\n default:\n throw new Error(`Unknown 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 private async sendSMS(params: IntegrationParams) {\n const { to, body } = params;\n\n this.logger.debug('Sending SMS', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: this.phoneNumber,\n to: to as string,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n\n private async sendWhatsApp(params: IntegrationParams) {\n const { to, body } = params;\n\n this.logger.debug('Sending WhatsApp message', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: `whatsapp:${this.phoneNumber}`,\n to: `whatsapp:${to}`,\n body: body as string,\n });\n\n return {\n sid: message.sid,\n status: message.status,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('twilio', TwilioIntegration);\n","import sgMail from '@sendgrid/mail';\nimport { Resend } from 'resend';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ntype EmailProvider = 'sendgrid' | 'resend';\n\n/**\n * Email integration (SendGrid/Resend)\n */\nexport class EmailIntegration extends BaseIntegration {\n private provider: EmailProvider;\n private fromEmail: string;\n private resendClient?: Resend;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.provider = (config.env.PROVIDER as EmailProvider) || 'sendgrid';\n this.fromEmail = config.env.FROM_EMAIL || 'noreply@example.com';\n\n if (this.provider === 'sendgrid') {\n const apiKey = config.env.SENDGRID_API_KEY;\n if (!apiKey) {\n throw new Error('SENDGRID_API_KEY not configured');\n }\n sgMail.setApiKey(apiKey);\n } else if (this.provider === 'resend') {\n const apiKey = config.env.RESEND_API_KEY;\n if (!apiKey) {\n throw new Error('RESEND_API_KEY not configured');\n }\n this.resendClient = new Resend(apiKey);\n }\n\n this.logger.info(`Email integration initialized (${this.provider})`);\n }\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 'send':\n data = await this.executeWithRetry(() => this.send(params));\n break;\n default:\n throw new Error(`Unknown 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 private async send(params: IntegrationParams) {\n const { to, subject, body, from } = params;\n\n this.logger.debug('Sending email', { to: String(to), subject: String(subject), provider: this.provider });\n\n if (this.provider === 'sendgrid') {\n return await this.sendViaSendGrid(\n to as string,\n subject as string,\n body as string,\n (from as string) || this.fromEmail,\n );\n } else if (this.provider === 'resend') {\n return await this.sendViaResend(\n to as string,\n subject as string,\n body as string,\n (from as string) || this.fromEmail,\n );\n }\n\n throw new Error(`Unknown email provider: ${this.provider}`);\n }\n\n private async sendViaSendGrid(\n to: string,\n subject: string,\n body: string,\n from: string,\n ) {\n const msg = {\n to,\n from,\n subject,\n html: body,\n };\n\n const response = await sgMail.send(msg);\n\n return {\n id: response[0].headers['x-message-id'],\n status: 'sent',\n };\n }\n\n private async sendViaResend(\n to: string,\n subject: string,\n body: string,\n from: string,\n ) {\n if (!this.resendClient) {\n throw new Error('Resend client not initialized');\n }\n\n const response = await this.resendClient.emails.send({\n from,\n to,\n subject,\n html: body,\n });\n\n return {\n id: response.data?.id,\n status: 'sent',\n };\n }\n}\n\n// Auto-register\nregisterIntegration('email', EmailIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport {\n LLMClient,\n getAvailableProvider,\n type LLMCallOptions,\n type LLMProvider,\n} from '@almadar/llm';\nimport { z } from 'zod';\n\n/**\n * LLM integration using @almadar/llm\n *\n * Provides 4 actions:\n * - generate: Generate text content from a prompt\n * - classify: Classify text into predefined categories\n * - extract: Extract structured data from text using a schema\n * - summarize: Summarize long text content\n */\nexport class LLMIntegration extends BaseIntegration {\n private client: LLMClient | null = null;\n private provider: LLMProvider;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n // Determine provider from config or auto-detect from available API keys\n const configuredProvider = config.env.PROVIDER as LLMProvider | undefined;\n this.provider = configuredProvider || getAvailableProvider() || 'anthropic';\n\n this.logger.info(`LLM integration initialized (provider: ${this.provider})`);\n }\n\n /**\n * Lazily create client — avoids throwing on construction if API key is missing.\n * The client will throw a clear error when actually used without a key.\n */\n private getClient(): LLMClient {\n if (!this.client) {\n this.client = new LLMClient({\n provider: this.provider,\n temperature: 0.7,\n trackTokens: true,\n });\n }\n return this.client;\n }\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'generate':\n data = await this.executeWithRetry(() => this.generate(params));\n break;\n case 'classify':\n data = await this.executeWithRetry(() => this.classify(params));\n break;\n case 'extract':\n data = await this.executeWithRetry(() => this.extract(params));\n break;\n case 'summarize':\n data = await this.executeWithRetry(() => this.summarize(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async generate(params: IntegrationParams) {\n const {\n systemPrompt,\n userPrompt,\n model,\n temperature,\n maxTokens,\n } = params as {\n systemPrompt?: string;\n userPrompt: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n };\n\n this.logger.debug('Generating content', { model, temperature });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: temperature ?? 0.7 })\n : this.getClient();\n\n const response = await client.callWithMetadata<string>({\n systemPrompt: systemPrompt || 'You are a helpful assistant.',\n userPrompt,\n maxTokens: maxTokens ?? 1024,\n temperature,\n skipSchemaValidation: true,\n });\n\n return {\n content: response.data,\n usage: response.usage\n ? {\n promptTokens: response.usage.promptTokens,\n completionTokens: response.usage.completionTokens,\n totalTokens: response.usage.totalTokens,\n }\n : { tokens: 0 },\n };\n }\n\n private async classify(params: IntegrationParams) {\n const { text, categories, model } = params as {\n text: string;\n categories: string[];\n model?: string;\n };\n\n this.logger.debug('Classifying text', { categories: categories.join(', ') });\n\n const ClassificationSchema = z.object({\n category: z.enum(categories as [string, ...string[]]),\n confidence: z.number().min(0).max(1),\n reasoning: z.string(),\n });\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.1 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text classifier. Classify the given text into one of these categories: ${categories.join(', ')}. Return JSON with: category, confidence (0-1), and reasoning.`,\n userPrompt: text,\n schema: ClassificationSchema,\n temperature: 0.1,\n });\n\n return result;\n }\n\n private async extract(params: IntegrationParams) {\n const { text, schema, model } = params as {\n text: string;\n schema: IntegrationParams;\n model?: string;\n };\n\n this.logger.debug('Extracting structured data', { schema: String(schema ?? '') });\n\n // Build a Zod schema from the JSON schema description.\n // For complex schemas, we use z.record to accept any shape and let the LLM\n // follow the schema description in the prompt.\n const ExtractSchema = z.record(z.unknown());\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.2 })\n : this.getClient();\n\n const schemaDescription = JSON.stringify(schema, null, 2);\n\n const result = await client.call({\n systemPrompt: `You are a structured data extractor. Extract data from the given text according to this schema:\\n\\n${schemaDescription}\\n\\nReturn ONLY valid JSON matching the schema.`,\n userPrompt: text,\n schema: ExtractSchema,\n temperature: 0.2,\n skipSchemaValidation: true,\n });\n\n return result;\n }\n\n private async summarize(params: IntegrationParams) {\n const { text, maxLength, style, model } = params as {\n text: string;\n maxLength?: number;\n style?: string;\n model?: string;\n };\n\n this.logger.debug('Summarizing text', { maxLength, style });\n\n const SummarySchema = z.object({\n summary: z.string(),\n keyPoints: z.array(z.string()),\n });\n\n const styleInstructions = style === 'bullet'\n ? 'Use bullet points.'\n : style === 'detailed'\n ? 'Be thorough and detailed.'\n : 'Be concise.';\n\n const lengthInstructions = maxLength\n ? `Keep the summary under ${maxLength} words.`\n : '';\n\n const client = model\n ? new LLMClient({ provider: this.provider, model, temperature: 0.3 })\n : this.getClient();\n\n const result = await client.call({\n systemPrompt: `You are a text summarizer. ${styleInstructions} ${lengthInstructions} Return JSON with: summary (string) and keyPoints (array of strings).`,\n userPrompt: text,\n schema: SummarySchema,\n temperature: 0.3,\n });\n\n return result;\n }\n}\n\n// Auto-register\nregisterIntegration('llm', LLMIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * DeepAgent integration for AI code generation\n */\nexport class DeepAgentIntegration extends BaseIntegration {\n private apiUrl: string;\n private apiKey: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.apiUrl = config.env.DEEPAGENT_API_URL || 'http://localhost:3000';\n this.apiKey = config.env.DEEPAGENT_API_KEY || '';\n\n this.logger.info('DeepAgent integration initialized', { apiUrl: this.apiUrl });\n }\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 'sendMessage':\n data = await this.executeWithRetry(() => this.sendMessage(params));\n break;\n case 'cancelGeneration':\n data = await this.executeWithRetry(() =>\n this.cancelGeneration(params),\n );\n break;\n case 'validateSchema':\n data = await this.executeWithRetry(() => this.validateSchema(params));\n break;\n case 'compileSchema':\n data = await this.executeWithRetry(() => this.compileSchema(params));\n break;\n case 'getThreadHistory':\n data = await this.executeWithRetry(() =>\n this.getThreadHistory(params),\n );\n break;\n default:\n throw new Error(`Unknown 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 private async sendMessage(params: IntegrationParams) {\n const { message, threadId, skill, context } = params;\n\n this.logger.debug('Sending message to DeepAgent', { threadId: String(threadId ?? ''), skill: String(skill ?? '') });\n\n const response = await this.request('/api/agent/message', {\n message,\n threadId,\n skill,\n context,\n });\n\n return response;\n }\n\n private async cancelGeneration(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Cancelling generation', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/cancel', {\n threadId,\n });\n\n return response;\n }\n\n private async validateSchema(params: IntegrationParams) {\n const { schema } = params;\n\n this.logger.debug('Validating schema');\n\n const response = await this.request('/api/schema/validate', {\n schema,\n });\n\n return response;\n }\n\n private async compileSchema(params: IntegrationParams) {\n const { schema, shell } = params;\n\n this.logger.debug('Compiling schema', { shell: String(shell ?? '') });\n\n const response = await this.request('/api/schema/compile', {\n schema,\n shell,\n });\n\n return response;\n }\n\n private async getThreadHistory(params: IntegrationParams) {\n const { threadId } = params;\n\n this.logger.debug('Getting thread history', { threadId: String(threadId ?? '') });\n\n const response = await this.request('/api/agent/history', {\n threadId,\n });\n\n return response;\n }\n\n private async request(endpoint: string, body: IntegrationParams) {\n const url = `${this.apiUrl}${endpoint}`;\n\n const response = await fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}),\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n throw new Error(\n `DeepAgent request failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return await response.json();\n }\n}\n\n// Auto-register\nregisterIntegration('deepagent', DeepAgentIntegration);\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","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { execSync } from 'child_process';\nimport { writeFileSync, mkdtempSync, rmSync } from 'fs';\nimport { join } from 'path';\nimport { tmpdir } from 'os';\n\n/**\n * CLI integration for Almadar CLI commands.\n *\n * Wraps `@almadar/cli` commands (validate, compile) as integration actions.\n * This runs server-side and executes CLI commands as child processes.\n *\n * Actions:\n * - validate: Validate an orbital schema and return structured results\n */\nexport class CLIIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('CLI integration initialized');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\n const startTime = Date.now();\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'validate':\n data = await this.validate(params);\n break;\n default:\n throw new Error(`Unknown CLI action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async validate(params: IntegrationParams) {\n const { schema } = params as { schema: string };\n\n if (!schema || typeof schema !== 'string') {\n throw new Error('validate requires a \"schema\" parameter (string)');\n }\n\n // Create temp directory for the schema file\n const tempDir = mkdtempSync(join(tmpdir(), 'almadar-validate-'));\n const schemaPath = join(tempDir, 'schema.orb');\n\n try {\n // Write schema content to temp file\n writeFileSync(schemaPath, schema, 'utf-8');\n\n this.logger.debug('Validating schema', { path: schemaPath });\n\n // Run CLI validation\n const output = execSync(\n `npx @almadar/cli validate \"${schemaPath}\" --format=json`,\n {\n encoding: 'utf-8',\n timeout: 30000,\n cwd: tempDir,\n stdio: ['pipe', 'pipe', 'pipe'],\n },\n );\n\n // Parse JSON output\n const result = JSON.parse(output.trim());\n\n return {\n valid: result.valid ?? true,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch (error: unknown) {\n // CLI may return non-zero exit code for validation failures\n const execError = error as { stdout?: string; stderr?: string; message?: string };\n if (execError.stdout) {\n try {\n const result = JSON.parse(execError.stdout.trim());\n return {\n valid: false,\n errors: result.errors || [],\n warnings: result.warnings || [],\n summary: result.summary || '',\n };\n } catch {\n // stdout wasn't valid JSON, fall through\n }\n }\n\n // Actual execution failure\n throw new Error(\n `CLI validation failed: ${execError.message || String(error)}`,\n );\n } finally {\n // Cleanup temp directory\n try {\n rmSync(tempDir, { recursive: true, force: true });\n } catch {\n // Best-effort cleanup\n }\n }\n }\n}\n\n// Auto-register\nregisterIntegration('cli', CLIIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored entry in the in-memory cache */\ninterface CacheEntry {\n value: unknown;\n expiresAt?: number;\n}\n\n/** Callback type for pub/sub subscribers */\ntype SubscriberCallback = (msg: unknown) => void;\n\n/**\n * Redis / Cache integration with in-memory default backend.\n *\n * When `REDIS_URL` is provided in `config.env`, a warning is logged and the\n * integration falls back to the in-memory store (real Redis client support is\n * not yet implemented). When `REDIS_URL` is absent the in-memory store is\n * used silently — this is the expected development mode.\n */\nexport class RedisIntegration extends BaseIntegration {\n private store: Map<string, CacheEntry> = new Map();\n private locks: Map<string, string> = new Map();\n private channels: Map<string, Set<SubscriberCallback>> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const redisUrl = config.env.REDIS_URL;\n if (redisUrl) {\n this.logger.warn(\n 'REDIS_URL is configured but real Redis client is not yet implemented. ' +\n 'Falling back to in-memory store.',\n { redisUrl },\n );\n }\n\n this.logger.info('Redis integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'get':\n data = await this.executeWithRetry(() => this.getKey(params));\n break;\n case 'set':\n data = await this.executeWithRetry(() => this.setKey(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteKey(params));\n break;\n case 'lock':\n data = await this.executeWithRetry(() => this.acquireLock(params));\n break;\n case 'unlock':\n data = await this.executeWithRetry(() => this.releaseLock(params));\n break;\n case 'increment':\n data = await this.executeWithRetry(() => this.incrementKey(params));\n break;\n case 'expire':\n data = await this.executeWithRetry(() => this.expireKey(params));\n break;\n case 'publish':\n data = await this.executeWithRetry(() => this.publishMessage(params));\n break;\n case 'subscribe':\n data = await this.executeWithRetry(() =>\n this.subscribeChannel(params),\n );\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Remove expired entries on access and return whether a key is alive. */\n private isAlive(key: string): boolean {\n const entry = this.store.get(key);\n if (!entry) return false;\n if (entry.expiresAt !== undefined && Date.now() > entry.expiresAt) {\n this.store.delete(key);\n return false;\n }\n return true;\n }\n\n /** Generate a unique lock identifier. */\n private generateLockId(): string {\n return `lock_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async getKey(\n params: IntegrationParams,\n ): Promise<{ value: unknown }> {\n const key = params.key as string;\n\n this.logger.debug('Cache GET', { key });\n\n if (!this.isAlive(key)) {\n return { value: null };\n }\n\n const entry = this.store.get(key);\n return { value: entry ? entry.value : null };\n }\n\n private async setKey(\n params: IntegrationParams,\n ): Promise<{ ok: boolean }> {\n const key = params.key as string;\n const value = params.value;\n const ttl = params.ttl as number | undefined;\n\n this.logger.debug('Cache SET', { key, ttl });\n\n const entry: CacheEntry = { value };\n if (ttl !== undefined && ttl > 0) {\n entry.expiresAt = Date.now() + ttl * 1000;\n }\n\n this.store.set(key, entry);\n return { ok: true };\n }\n\n private async deleteKey(\n params: IntegrationParams,\n ): Promise<{ deleted: boolean }> {\n const key = params.key as string;\n\n this.logger.debug('Cache DELETE', { key });\n\n const existed = this.store.has(key);\n this.store.delete(key);\n return { deleted: existed };\n }\n\n private async acquireLock(\n params: IntegrationParams,\n ): Promise<{ acquired: boolean; lockId: string }> {\n const key = params.key as string;\n const ttl = (params.ttl as number | undefined) ?? 30_000;\n\n this.logger.debug('Cache LOCK', { key, ttl });\n\n // Check if the lock already exists and is still alive\n const existingLockId = this.locks.get(key);\n if (existingLockId) {\n // The lock key in the store tracks its expiry\n if (this.isAlive(`__lock:${key}`)) {\n return { acquired: false, lockId: '' };\n }\n // Expired — clean up\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n }\n\n const lockId = this.generateLockId();\n this.locks.set(key, lockId);\n // Store the lock with a TTL (ttl param is in ms, expiresAt is epoch ms)\n this.store.set(`__lock:${key}`, {\n value: lockId,\n expiresAt: Date.now() + ttl,\n });\n\n return { acquired: true, lockId };\n }\n\n private async releaseLock(\n params: IntegrationParams,\n ): Promise<{ released: boolean }> {\n const key = params.key as string;\n const lockId = params.lockId as string;\n\n this.logger.debug('Cache UNLOCK', { key, lockId });\n\n const currentLockId = this.locks.get(key);\n if (currentLockId !== lockId) {\n return { released: false };\n }\n\n this.locks.delete(key);\n this.store.delete(`__lock:${key}`);\n return { released: true };\n }\n\n private async incrementKey(\n params: IntegrationParams,\n ): Promise<{ value: number }> {\n const key = params.key as string;\n const by = (params.by as number | undefined) ?? 1;\n\n this.logger.debug('Cache INCR', { key, by });\n\n let current = 0;\n\n if (this.isAlive(key)) {\n const entry = this.store.get(key);\n if (entry) {\n current = typeof entry.value === 'number' ? entry.value : 0;\n }\n }\n\n const newValue = current + by;\n // Preserve existing TTL if the key already exists\n const existing = this.store.get(key);\n this.store.set(key, {\n value: newValue,\n expiresAt: existing?.expiresAt,\n });\n\n return { value: newValue };\n }\n\n private async expireKey(\n params: IntegrationParams,\n ): Promise<{ set: boolean }> {\n const key = params.key as string;\n const ttl = params.ttl as number;\n\n this.logger.debug('Cache EXPIRE', { key, ttl });\n\n if (!this.isAlive(key)) {\n return { set: false };\n }\n\n const entry = this.store.get(key);\n if (!entry) {\n return { set: false };\n }\n\n entry.expiresAt = Date.now() + ttl * 1000;\n this.store.set(key, entry);\n return { set: true };\n }\n\n private async publishMessage(\n params: IntegrationParams,\n ): Promise<{ receivers: number }> {\n const channel = params.channel as string;\n const message = params.message;\n\n this.logger.debug('Cache PUBLISH', { channel });\n\n const subscribers = this.channels.get(channel);\n if (!subscribers || subscribers.size === 0) {\n return { receivers: 0 };\n }\n\n for (const callback of subscribers) {\n try {\n callback(message);\n } catch (err) {\n this.logger.error('Subscriber callback error', {\n channel,\n error: err instanceof Error ? err.message : String(err),\n });\n }\n }\n\n return { receivers: subscribers.size };\n }\n\n private async subscribeChannel(\n params: IntegrationParams,\n ): Promise<{ subscribed: boolean }> {\n const channel = params.channel as string;\n\n this.logger.debug('Cache SUBSCRIBE', { channel });\n\n if (!this.channels.has(channel)) {\n this.channels.set(channel, new Set());\n }\n\n // The in-memory subscribe registers the channel but the actual callback\n // would be wired via a higher-level API. For the integration contract we\n // simply confirm the subscription was created.\n return { subscribed: true };\n }\n}\n\n// Auto-register\nregisterIntegration('redis', RedisIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Job status values */\ntype JobStatus = 'pending' | 'processing' | 'completed' | 'failed';\n\n/** Internal job representation */\ninterface QueueJob {\n id: string;\n queue: string;\n payload: unknown;\n priority: number;\n status: JobStatus;\n enqueuedAt: number;\n delay: number;\n result?: unknown;\n error?: string;\n}\n\n/**\n * Queue integration with in-memory backend.\n *\n * Provides job queue semantics: enqueue, dequeue, status tracking,\n * completion, failure, cancellation, and size queries.\n */\nexport class QueueIntegration extends BaseIntegration {\n /** Map from queue name to ordered list of job IDs */\n private queues: Map<string, string[]> = new Map();\n\n /** Map from job ID to job data */\n private jobs: Map<string, QueueJob> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Queue integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'enqueue':\n data = await this.executeWithRetry(() => this.enqueue(params));\n break;\n case 'dequeue':\n data = await this.executeWithRetry(() => this.dequeue(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'complete':\n data = await this.executeWithRetry(() => this.complete(params));\n break;\n case 'fail':\n data = await this.executeWithRetry(() => this.failJob(params));\n break;\n case 'cancel':\n data = await this.executeWithRetry(() => this.cancel(params));\n break;\n case 'size':\n data = await this.executeWithRetry(() => this.size(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a unique job identifier. */\n private generateJobId(): string {\n return `job_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;\n }\n\n /** Get or create the queue array for a given queue name. */\n private getQueue(name: string): string[] {\n let queue = this.queues.get(name);\n if (!queue) {\n queue = [];\n this.queues.set(name, queue);\n }\n return queue;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async enqueue(\n params: IntegrationParams,\n ): Promise<{ jobId: string; position: number }> {\n const queueName = params.queue as string;\n const payload = params.payload;\n const delay = (params.delay as number | undefined) ?? 0;\n const priority = (params.priority as number | undefined) ?? 0;\n\n this.logger.debug('Queue ENQUEUE', { queue: queueName, delay, priority });\n\n const jobId = this.generateJobId();\n const job: QueueJob = {\n id: jobId,\n queue: queueName,\n payload,\n priority,\n status: 'pending',\n enqueuedAt: Date.now(),\n delay,\n };\n\n this.jobs.set(jobId, job);\n\n const queue = this.getQueue(queueName);\n\n // Insert respecting priority (higher priority = earlier in queue)\n let insertIndex = queue.length;\n for (let i = 0; i < queue.length; i++) {\n const existingJob = this.jobs.get(queue[i]);\n if (existingJob && existingJob.priority < priority) {\n insertIndex = i;\n break;\n }\n }\n queue.splice(insertIndex, 0, jobId);\n\n return { jobId, position: insertIndex };\n }\n\n private async dequeue(\n params: IntegrationParams,\n ): Promise<{ job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue DEQUEUE', { queue: queueName });\n\n const queue = this.getQueue(queueName);\n const now = Date.now();\n\n // Find first pending job whose delay has elapsed\n for (let i = 0; i < queue.length; i++) {\n const job = this.jobs.get(queue[i]);\n if (!job || job.status !== 'pending') continue;\n\n const readyAt = job.enqueuedAt + job.delay;\n if (now < readyAt) continue;\n\n // Mark as processing and remove from queue\n job.status = 'processing';\n queue.splice(i, 1);\n\n return {\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n return { job: null };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{ status: JobStatus; job: { id: string; payload: unknown; enqueuedAt: number; priority: number } | null }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue STATUS', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job) {\n return { status: 'pending', job: null };\n }\n\n return {\n status: job.status,\n job: {\n id: job.id,\n payload: job.payload,\n enqueuedAt: job.enqueuedAt,\n priority: job.priority,\n },\n };\n }\n\n private async complete(\n params: IntegrationParams,\n ): Promise<{ completed: boolean }> {\n const jobId = params.jobId as string;\n const result = params.result;\n\n this.logger.debug('Queue COMPLETE', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { completed: false };\n }\n\n job.status = 'completed';\n job.result = result;\n return { completed: true };\n }\n\n private async failJob(\n params: IntegrationParams,\n ): Promise<{ failed: boolean }> {\n const jobId = params.jobId as string;\n const error = params.error as string | undefined;\n\n this.logger.debug('Queue FAIL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'processing') {\n return { failed: false };\n }\n\n job.status = 'failed';\n job.error = error;\n return { failed: true };\n }\n\n private async cancel(\n params: IntegrationParams,\n ): Promise<{ cancelled: boolean }> {\n const jobId = params.jobId as string;\n\n this.logger.debug('Queue CANCEL', { jobId });\n\n const job = this.jobs.get(jobId);\n if (!job || job.status !== 'pending') {\n return { cancelled: false };\n }\n\n // Remove from queue\n const queue = this.queues.get(job.queue);\n if (queue) {\n const idx = queue.indexOf(jobId);\n if (idx !== -1) {\n queue.splice(idx, 1);\n }\n }\n\n this.jobs.delete(jobId);\n return { cancelled: true };\n }\n\n private async size(\n params: IntegrationParams,\n ): Promise<{ size: number; pending: number; processing: number }> {\n const queueName = params.queue as string;\n\n this.logger.debug('Queue SIZE', { queue: queueName });\n\n let pending = 0;\n let processing = 0;\n\n for (const job of this.jobs.values()) {\n if (job.queue !== queueName) continue;\n if (job.status === 'pending') pending++;\n if (job.status === 'processing') processing++;\n }\n\n return { size: pending + processing, pending, processing };\n }\n}\n\n// Auto-register\nregisterIntegration('queue', QueueIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** In-memory span representation */\ninterface Span {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n events: Array<{ name: string; timestamp: number; attributes?: IntegrationParams }>;\n}\n\n/** Shape of a stored metric */\ninterface Metric {\n name: string;\n type: 'counter' | 'gauge' | 'histogram';\n value: number;\n values: number[];\n labels: IntegrationParams;\n}\n\n/** Generate a random hex id of the given byte-length. */\nfunction randomHexId(bytes: number): string {\n const arr: string[] = [];\n for (let i = 0; i < bytes; i++) {\n arr.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return arr.join('');\n}\n\n/**\n * OpenTelemetry integration with in-memory backend.\n *\n * Tracks spans and metrics internally for development and testing purposes.\n * No actual OpenTelemetry SDK dependency is required.\n */\nexport class OtelIntegration extends BaseIntegration {\n private spans: Map<string, Span> = new Map();\n private metrics: Map<string, Metric> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('OTel integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'startSpan':\n data = await this.executeWithRetry(() => this.startSpan(params));\n break;\n case 'endSpan':\n data = await this.executeWithRetry(() => this.endSpan(params));\n break;\n case 'addEvent':\n data = await this.executeWithRetry(() => this.addEvent(params));\n break;\n case 'recordMetric':\n data = await this.executeWithRetry(() => this.recordMetric(params));\n break;\n case 'getSpan':\n data = await this.executeWithRetry(() => this.getSpan(params));\n break;\n case 'getMetrics':\n data = await this.executeWithRetry(() => this.getAllMetrics());\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async startSpan(\n params: IntegrationParams,\n ): Promise<{ spanId: string; traceId: string }> {\n const name = params.name as string;\n const attributes = (params.attributes as IntegrationParams | undefined) ?? {};\n const spanId = randomHexId(8);\n const traceId = (params.traceId as string | undefined) ?? randomHexId(16);\n\n const span: Span = {\n spanId,\n traceId,\n name,\n startTime: Date.now(),\n attributes,\n events: [],\n };\n\n this.spans.set(spanId, span);\n this.logger.debug('Span started', { spanId, traceId, name });\n\n return { spanId, traceId };\n }\n\n private async endSpan(\n params: IntegrationParams,\n ): Promise<{ ended: boolean }> {\n const spanId = params.spanId as string;\n const status = params.status as 'ok' | 'error' | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('endSpan called for unknown span', { spanId });\n return { ended: false };\n }\n\n span.endTime = Date.now();\n if (status) {\n span.status = status;\n }\n\n this.logger.debug('Span ended', { spanId, status, duration: span.endTime - span.startTime });\n return { ended: true };\n }\n\n private async addEvent(\n params: IntegrationParams,\n ): Promise<{ added: boolean }> {\n const spanId = params.spanId as string;\n const name = params.name as string;\n const attributes = params.attributes as IntegrationParams | undefined;\n\n const span = this.spans.get(spanId);\n if (!span) {\n this.logger.warn('addEvent called for unknown span', { spanId });\n return { added: false };\n }\n\n span.events.push({\n name,\n timestamp: Date.now(),\n attributes,\n });\n\n this.logger.debug('Event added to span', { spanId, eventName: name });\n return { added: true };\n }\n\n private async recordMetric(\n params: IntegrationParams,\n ): Promise<{ recorded: boolean }> {\n const name = params.name as string;\n const value = params.value as number;\n const type = (params.type as 'counter' | 'gauge' | 'histogram' | undefined) ?? 'counter';\n const labels = (params.labels as IntegrationParams | undefined) ?? {};\n\n const existing = this.metrics.get(name);\n\n if (existing) {\n switch (type) {\n case 'counter':\n existing.value += value;\n break;\n case 'gauge':\n existing.value = value;\n break;\n case 'histogram':\n existing.values.push(value);\n break;\n }\n existing.labels = labels;\n } else {\n this.metrics.set(name, {\n name,\n type,\n value: type === 'histogram' ? 0 : value,\n values: type === 'histogram' ? [value] : [],\n labels,\n });\n }\n\n this.logger.debug('Metric recorded', { name, value, type });\n return { recorded: true };\n }\n\n private async getSpan(\n params: IntegrationParams,\n ): Promise<Span | null> {\n const spanId = params.spanId as string;\n const span = this.spans.get(spanId);\n return span ?? null;\n }\n\n private async getAllMetrics(): Promise<Record<string, Metric>> {\n const result: Record<string, Metric> = {};\n for (const [key, metric] of this.metrics) {\n result[key] = metric;\n }\n return result;\n }\n}\n\n// Auto-register\nregisterIntegration('otel', OtelIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Supported OAuth providers */\ntype OAuthProvider = 'google' | 'github' | 'auth0';\n\n/** Mock provider authorization endpoints */\nconst PROVIDER_AUTH_URLS: Record<OAuthProvider, string> = {\n google: 'https://accounts.google.com/o/oauth2/v2/auth',\n github: 'https://github.com/login/oauth/authorize',\n auth0: 'https://auth.example.com/authorize',\n};\n\n/** Stored token set */\ninterface TokenSet {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n}\n\n/** Mock user profile */\ninterface UserInfo {\n sub: string;\n email: string;\n name: string;\n picture: string;\n}\n\n/**\n * OAuth2/OIDC integration with in-memory mock backend.\n *\n * This is a development/mock implementation. No actual OAuth library is used.\n * State tokens, access tokens, and refresh tokens are generated in-memory and\n * tracked via Maps. Useful for testing OAuth flows without external providers.\n */\nexport class OAuthIntegration extends BaseIntegration {\n /** Maps state token -> provider for pending authorization flows */\n private states: Map<string, OAuthProvider> = new Map();\n\n /** Maps access token -> token set */\n private tokens: Map<string, TokenSet> = new Map();\n\n /** Maps refresh token -> access token for refresh lookups */\n private refreshIndex: Map<string, string> = new Map();\n\n /** Maps access token -> mock user session */\n private sessions: Map<string, UserInfo> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('OAuth integration initialized (mock backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'authorize':\n data = await this.executeWithRetry(() => this.authorize(params));\n break;\n case 'token':\n data = await this.executeWithRetry(() => this.token(params));\n break;\n case 'refresh':\n data = await this.executeWithRetry(() => this.refresh(params));\n break;\n case 'revoke':\n data = await this.executeWithRetry(() => this.revoke(params));\n break;\n case 'userinfo':\n data = await this.executeWithRetry(() => this.userinfo(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex token of the given byte length. */\n private generateToken(bytes: number = 32): string {\n const chars = 'abcdef0123456789';\n let result = '';\n for (let i = 0; i < bytes * 2; i++) {\n result += chars[Math.floor(Math.random() * chars.length)];\n }\n return result;\n }\n\n /** Generate a mock user profile from a provider and access token. */\n private generateMockUser(provider: OAuthProvider, sub: string): UserInfo {\n return {\n sub,\n email: `user-${sub.slice(0, 8)}@${provider}.example.com`,\n name: `Mock User (${provider})`,\n picture: `https://${provider}.example.com/avatar/${sub.slice(0, 8)}.png`,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async authorize(\n params: IntegrationParams,\n ): Promise<{ authUrl: string; state: string }> {\n const provider = params.provider as OAuthProvider;\n const scopes = params.scopes as string[];\n const redirectUri = params.redirectUri as string;\n\n this.logger.debug('OAuth AUTHORIZE', { provider, scopes: scopes.join(', '), redirectUri });\n\n const state = this.generateToken(16);\n this.states.set(state, provider);\n\n const baseUrl = PROVIDER_AUTH_URLS[provider];\n const queryParams = new URLSearchParams({\n response_type: 'code',\n scope: scopes.join(' '),\n redirect_uri: redirectUri,\n state,\n client_id: this.config.env.CLIENT_ID ?? 'mock-client-id',\n });\n\n const authUrl = `${baseUrl}?${queryParams.toString()}`;\n\n return { authUrl, state };\n }\n\n private async token(\n params: IntegrationParams,\n ): Promise<{\n accessToken: string;\n refreshToken: string;\n expiresIn: number;\n tokenType: 'bearer';\n }> {\n const code = params.code as string;\n const state = params.state as string;\n\n this.logger.debug('OAuth TOKEN', { code, state });\n\n const provider = this.states.get(state);\n if (!provider) {\n throw new Error(\n `Invalid or expired state token: ${state}`,\n );\n }\n\n // Consume the state (one-time use)\n this.states.delete(state);\n\n const accessToken = this.generateToken(32);\n const refreshToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(accessToken, tokenSet);\n this.refreshIndex.set(refreshToken, accessToken);\n\n // Generate and store a mock user session\n const sub = this.generateToken(8);\n this.sessions.set(accessToken, this.generateMockUser(provider, sub));\n\n return { accessToken, refreshToken, expiresIn, tokenType: 'bearer' };\n }\n\n private async refresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n\n this.logger.debug('OAuth REFRESH', { refreshToken: refreshToken.slice(0, 8) + '...' });\n\n const oldAccessToken = this.refreshIndex.get(refreshToken);\n if (!oldAccessToken) {\n throw new Error('Invalid refresh token');\n }\n\n // Carry over user session to the new access token\n const userInfo = this.sessions.get(oldAccessToken);\n\n // Clean up old access token\n this.tokens.delete(oldAccessToken);\n this.sessions.delete(oldAccessToken);\n\n // Issue new access token\n const newAccessToken = this.generateToken(32);\n const expiresIn = 3600;\n\n const tokenSet: TokenSet = {\n accessToken: newAccessToken,\n refreshToken,\n expiresAt: Date.now() + expiresIn * 1000,\n };\n\n this.tokens.set(newAccessToken, tokenSet);\n this.refreshIndex.set(refreshToken, newAccessToken);\n\n if (userInfo) {\n this.sessions.set(newAccessToken, userInfo);\n }\n\n return { accessToken: newAccessToken, expiresIn };\n }\n\n private async revoke(\n params: IntegrationParams,\n ): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n\n this.logger.debug('OAuth REVOKE', { token: token.slice(0, 8) + '...' });\n\n // Check if it is an access token\n const tokenSet = this.tokens.get(token);\n if (tokenSet) {\n this.refreshIndex.delete(tokenSet.refreshToken);\n this.tokens.delete(token);\n this.sessions.delete(token);\n return { revoked: true };\n }\n\n // Check if it is a refresh token\n const accessToken = this.refreshIndex.get(token);\n if (accessToken) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n this.refreshIndex.delete(token);\n return { revoked: true };\n }\n\n return { revoked: false };\n }\n\n private async userinfo(\n params: IntegrationParams,\n ): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n\n this.logger.debug('OAuth USERINFO', { accessToken: accessToken.slice(0, 8) + '...' });\n\n const tokenSet = this.tokens.get(accessToken);\n if (!tokenSet) {\n throw new Error('Invalid access token');\n }\n\n if (Date.now() > tokenSet.expiresAt) {\n this.tokens.delete(accessToken);\n this.sessions.delete(accessToken);\n throw new Error('Access token expired');\n }\n\n const userInfo = this.sessions.get(accessToken);\n if (!userInfo) {\n throw new Error('No session found for access token');\n }\n\n return userInfo;\n }\n}\n\n// Auto-register\nregisterIntegration('oauth', OAuthIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Shape of a stored object in the in-memory store */\ninterface StoredObject {\n content: unknown;\n contentType: string;\n size: number;\n metadata: IntegrationParams;\n lastModified: number;\n etag: string;\n}\n\n/**\n * Storage integration with in-memory backend for development/testing.\n *\n * Provides S3-compatible object storage operations (upload, download, list,\n * delete, getSignedUrl) backed by an in-memory Map. No cloud SDK dependencies\n * are required.\n */\nexport class StorageIntegration extends BaseIntegration {\n private objects: Map<string, StoredObject> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const storageUrl = config.env.STORAGE_URL;\n if (storageUrl) {\n this.logger.warn(\n 'STORAGE_URL is configured but real storage client is not yet implemented. ' +\n 'Falling back to in-memory store.',\n { storageUrl },\n );\n }\n\n this.logger.info('Storage integration initialized (in-memory backend)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'upload':\n data = await this.executeWithRetry(() => this.upload(params));\n break;\n case 'download':\n data = await this.executeWithRetry(() => this.download(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n case 'delete':\n data = await this.executeWithRetry(() => this.deleteObject(params));\n break;\n case 'getSignedUrl':\n data = await this.executeWithRetry(() => this.getSignedUrl(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Build a composite key from bucket and object key. */\n private compositeKey(bucket: string, key: string): string {\n return `${bucket}/${key}`;\n }\n\n /** Generate a deterministic etag from content. */\n private generateEtag(content: unknown): string {\n const raw = typeof content === 'string' ? content : JSON.stringify(content);\n // Simple hash — good enough for in-memory dev usage\n let hash = 0;\n for (let i = 0; i < raw.length; i++) {\n const ch = raw.charCodeAt(i);\n hash = ((hash << 5) - hash + ch) | 0;\n }\n return `\"${Math.abs(hash).toString(16).padStart(8, '0')}\"`;\n }\n\n /** Compute the byte size of content. */\n private computeSize(content: unknown): number {\n if (typeof content === 'string') {\n return new TextEncoder().encode(content).byteLength;\n }\n return JSON.stringify(content).length;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async upload(\n params: IntegrationParams,\n ): Promise<{ key: string; bucket: string; size: number; etag: string }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n const content = params.content;\n const contentType = (params.contentType as string | undefined) ?? 'application/octet-stream';\n const metadata = (params.metadata as IntegrationParams | undefined) ?? {};\n\n this.logger.debug('Storage UPLOAD', { bucket, key, contentType });\n\n const size = this.computeSize(content);\n const etag = this.generateEtag(content);\n\n const obj: StoredObject = {\n content,\n contentType,\n size,\n metadata,\n lastModified: Date.now(),\n etag,\n };\n\n this.objects.set(this.compositeKey(bucket, key), obj);\n\n return { key, bucket, size, etag };\n }\n\n private async download(\n params: IntegrationParams,\n ): Promise<{\n content: unknown;\n contentType: string;\n size: number;\n metadata: IntegrationParams;\n }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n\n this.logger.debug('Storage DOWNLOAD', { bucket, key });\n\n const obj = this.objects.get(this.compositeKey(bucket, key));\n if (!obj) {\n throw new Error(`Object not found: ${bucket}/${key}`);\n }\n\n return {\n content: obj.content,\n contentType: obj.contentType,\n size: obj.size,\n metadata: obj.metadata,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{\n keys: Array<{ key: string; size: number; lastModified: number }>;\n truncated: boolean;\n }> {\n const bucket = params.bucket as string;\n const prefix = (params.prefix as string | undefined) ?? '';\n const maxKeys = (params.maxKeys as number | undefined) ?? 1000;\n\n this.logger.debug('Storage LIST', { bucket, prefix, maxKeys });\n\n const bucketPrefix = `${bucket}/`;\n const fullPrefix = `${bucket}/${prefix}`;\n const results: Array<{ key: string; size: number; lastModified: number }> = [];\n\n for (const [compositeKey, obj] of this.objects) {\n if (!compositeKey.startsWith(fullPrefix)) continue;\n\n // Strip the bucket prefix to get the object key\n const objectKey = compositeKey.slice(bucketPrefix.length);\n results.push({\n key: objectKey,\n size: obj.size,\n lastModified: obj.lastModified,\n });\n }\n\n // Sort by key for deterministic output\n results.sort((a, b) => a.key.localeCompare(b.key));\n\n const truncated = results.length > maxKeys;\n return {\n keys: results.slice(0, maxKeys),\n truncated,\n };\n }\n\n private async deleteObject(\n params: IntegrationParams,\n ): Promise<{ deleted: boolean }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n\n this.logger.debug('Storage DELETE', { bucket, key });\n\n const existed = this.objects.has(this.compositeKey(bucket, key));\n this.objects.delete(this.compositeKey(bucket, key));\n return { deleted: existed };\n }\n\n private async getSignedUrl(\n params: IntegrationParams,\n ): Promise<{ url: string; expiresAt: number }> {\n const bucket = params.bucket as string;\n const key = params.key as string;\n const expiresIn = (params.expiresIn as number | undefined) ?? 3600;\n const operation = (params.operation as 'get' | 'put' | undefined) ?? 'get';\n\n this.logger.debug('Storage GET_SIGNED_URL', { bucket, key, expiresIn, operation });\n\n const expiresAt = Date.now() + expiresIn * 1000;\n const token = Math.random().toString(36).slice(2, 18);\n const url =\n `https://storage.mock.local/${bucket}/${key}` +\n `?X-Amz-Algorithm=MOCK-HMAC-SHA256` +\n `&X-Amz-Expires=${expiresIn}` +\n `&X-Amz-SignedHeaders=host` +\n `&X-Amz-Signature=${token}` +\n `&operation=${operation}`;\n\n return { url, expiresAt };\n }\n}\n\n// Auto-register\nregisterIntegration('storage', StorageIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Represents a container in the in-memory store */\ninterface SimulatedContainer {\n id: string;\n name: string;\n image: string;\n status: 'created' | 'running' | 'paused' | 'exited' | 'dead';\n ports: Array<{ host: number; container: number; protocol: string }>;\n env: Record<string, string>;\n volumes: Array<{ host: string; container: string }>;\n command: string;\n labels: Record<string, string>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n logs: string[];\n}\n\n/** Represents a built image in the in-memory store */\ninterface SimulatedImage {\n id: string;\n tag: string;\n dockerfile: string;\n size: number;\n createdAt: number;\n}\n\n/**\n * Docker/Container integration with in-memory backend for development/testing.\n *\n * Provides container lifecycle operations (build, run, stop, remove, logs,\n * status, list) backed by an in-memory Map. No Docker SDK or daemon connection\n * is required.\n */\nexport class DockerIntegration extends BaseIntegration {\n private containers: Map<string, SimulatedContainer> = new Map();\n private images: Map<string, SimulatedImage> = new Map();\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const dockerHost = config.env.DOCKER_HOST;\n if (dockerHost) {\n this.logger.warn(\n 'DOCKER_HOST is configured but real Docker client is not yet implemented. ' +\n 'Falling back to in-memory simulation.',\n { dockerHost },\n );\n }\n\n this.logger.info('Docker integration initialized (in-memory simulation)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n ): Promise<IntegrationResult> {\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\n try {\n let data: unknown;\n\n switch (action) {\n case 'build':\n data = await this.executeWithRetry(() => this.build(params));\n break;\n case 'run':\n data = await this.executeWithRetry(() => this.run(params));\n break;\n case 'stop':\n data = await this.executeWithRetry(() => this.stop(params));\n break;\n case 'remove':\n data = await this.executeWithRetry(() => this.removeContainer(params));\n break;\n case 'logs':\n data = await this.executeWithRetry(() => this.logs(params));\n break;\n case 'status':\n data = await this.executeWithRetry(() => this.status(params));\n break;\n case 'list':\n data = await this.executeWithRetry(() => this.list(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, Date.now() - startTime),\n };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Helpers\n // ---------------------------------------------------------------------------\n\n /** Generate a random hex container/image ID. */\n private generateId(): string {\n const segments: string[] = [];\n for (let i = 0; i < 16; i++) {\n segments.push(Math.floor(Math.random() * 256).toString(16).padStart(2, '0'));\n }\n return segments.join('');\n }\n\n /** Find a container by ID (prefix match supported). */\n private findContainer(containerId: string): SimulatedContainer | undefined {\n // Exact match first\n const exact = this.containers.get(containerId);\n if (exact) return exact;\n\n // Prefix match (like real Docker)\n for (const [id, container] of this.containers) {\n if (id.startsWith(containerId)) {\n return container;\n }\n }\n\n return undefined;\n }\n\n /** Generate realistic log lines for a container. */\n private generateLogLines(container: SimulatedContainer, count: number): string[] {\n const lines: string[] = [...container.logs];\n const baseTime = container.startedAt ?? container.createdAt;\n\n while (lines.length < count) {\n const ts = new Date(baseTime + lines.length * 1000).toISOString();\n lines.push(`${ts} [info] Container ${container.name} — heartbeat #${lines.length + 1}`);\n }\n\n return lines;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async build(\n params: IntegrationParams,\n ): Promise<{ imageId: string; tag: string; size: number; buildTime: number }> {\n const dockerfile = (params.dockerfile as string | undefined) ?? 'Dockerfile';\n const tag = params.tag as string;\n const context = (params.context as string | undefined) ?? '.';\n const buildArgs = (params.buildArgs as Record<string, string> | undefined) ?? {};\n\n this.logger.debug('Docker BUILD', { dockerfile, tag, context, buildArgs });\n\n const imageId = `sha256:${this.generateId()}`;\n const size = 150_000_000 + Math.floor(Math.random() * 350_000_000); // 150–500 MB\n const buildTime = 2000 + Math.floor(Math.random() * 8000); // 2–10s simulated\n\n const image: SimulatedImage = {\n id: imageId,\n tag,\n dockerfile,\n size,\n createdAt: Date.now(),\n };\n\n this.images.set(tag, image);\n\n return { imageId, tag, size, buildTime };\n }\n\n private async run(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n }> {\n const image = params.image as string;\n const name = (params.name as string | undefined) ?? `container-${this.generateId().slice(0, 12)}`;\n const rawPorts = (params.ports as Array<{ host: number; container: number; protocol?: string }> | undefined) ?? [];\n const env = (params.env as Record<string, string> | undefined) ?? {};\n const rawVolumes = (params.volumes as Array<{ host: string; container: string }> | undefined) ?? [];\n const command = (params.command as string | undefined) ?? '';\n\n this.logger.debug('Docker RUN', { image, name, ports: rawPorts.map(p => `${p.host}:${p.container}`).join(', '), volumes: rawVolumes.map(v => `${v.host}:${v.container}`).join(', '), command });\n\n const containerId = this.generateId();\n\n const ports = rawPorts.map((p) => ({\n host: p.host,\n container: p.container,\n protocol: p.protocol ?? 'tcp',\n }));\n\n const volumes = rawVolumes.map((v) => ({\n host: v.host,\n container: v.container,\n }));\n\n const container: SimulatedContainer = {\n id: containerId,\n name,\n image,\n status: 'running',\n ports,\n env,\n volumes,\n command,\n labels: {},\n createdAt: Date.now(),\n startedAt: Date.now(),\n stoppedAt: null,\n logs: [\n `${new Date().toISOString()} [info] Starting container ${name} from image ${image}`,\n `${new Date().toISOString()} [info] Container ${name} is now running`,\n ],\n };\n\n this.containers.set(containerId, container);\n\n return {\n containerId,\n name,\n status: container.status,\n ports,\n };\n }\n\n private async stop(\n params: IntegrationParams,\n ): Promise<{ containerId: string; status: string; stoppedAt: number }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STOP', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status !== 'running' && container.status !== 'paused') {\n throw new Error(`Container ${containerId} is not running (current status: ${container.status})`);\n }\n\n container.status = 'exited';\n container.stoppedAt = Date.now();\n container.logs.push(\n `${new Date().toISOString()} [info] Container ${container.name} stopped`,\n );\n\n return {\n containerId: container.id,\n status: container.status,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async removeContainer(\n params: IntegrationParams,\n ): Promise<{ containerId: string; removed: boolean }> {\n const containerId = params.containerId as string;\n const force = (params.force as boolean | undefined) ?? false;\n\n this.logger.debug('Docker REMOVE', { containerId, force });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n if (container.status === 'running' && !force) {\n throw new Error(\n `Container ${containerId} is running. Stop it first or use force=true.`,\n );\n }\n\n this.containers.delete(container.id);\n\n return { containerId: container.id, removed: true };\n }\n\n private async logs(\n params: IntegrationParams,\n ): Promise<{ containerId: string; logs: string[]; lineCount: number }> {\n const containerId = params.containerId as string;\n const tail = (params.tail as number | undefined) ?? 100;\n const since = (params.since as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LOGS', { containerId, tail, since });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n let logLines = this.generateLogLines(container, tail);\n\n // Filter by since timestamp if provided\n if (since) {\n const sinceMs = new Date(since).getTime();\n logLines = logLines.filter((line) => {\n const timestampMatch = /^\\d{4}-\\d{2}-\\d{2}T[\\d:.]+Z/.exec(line);\n if (!timestampMatch) return true;\n return new Date(timestampMatch[0]).getTime() >= sinceMs;\n });\n }\n\n // Apply tail limit\n const tailedLines = logLines.slice(-tail);\n\n return {\n containerId: container.id,\n logs: tailedLines,\n lineCount: tailedLines.length,\n };\n }\n\n private async status(\n params: IntegrationParams,\n ): Promise<{\n containerId: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n startedAt: number | null;\n stoppedAt: number | null;\n }> {\n const containerId = params.containerId as string;\n\n this.logger.debug('Docker STATUS', { containerId });\n\n const container = this.findContainer(containerId);\n if (!container) {\n throw new Error(`Container not found: ${containerId}`);\n }\n\n return {\n containerId: container.id,\n name: container.name,\n image: container.image,\n status: container.status,\n ports: container.ports,\n createdAt: container.createdAt,\n startedAt: container.startedAt,\n stoppedAt: container.stoppedAt,\n };\n }\n\n private async list(\n params: IntegrationParams,\n ): Promise<{\n containers: Array<{\n id: string;\n name: string;\n image: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n createdAt: number;\n }>;\n total: number;\n }> {\n const showAll = (params.all as boolean | undefined) ?? false;\n const filterByLabel = (params.filterByLabel as string | undefined) ?? undefined;\n\n this.logger.debug('Docker LIST', { all: showAll, filterByLabel });\n\n let entries = Array.from(this.containers.values());\n\n // By default, only show running containers (like `docker ps`)\n if (!showAll) {\n entries = entries.filter((c) => c.status === 'running');\n }\n\n // Filter by label if specified\n if (filterByLabel) {\n const [labelKey, labelValue] = filterByLabel.split('=');\n entries = entries.filter((c) => {\n if (labelValue !== undefined) {\n return c.labels[labelKey] === labelValue;\n }\n return labelKey in c.labels;\n });\n }\n\n // Sort by creation time (newest first)\n entries.sort((a, b) => b.createdAt - a.createdAt);\n\n const containers = entries.map((c) => ({\n id: c.id,\n name: c.name,\n image: c.image,\n status: c.status,\n ports: c.ports,\n createdAt: c.createdAt,\n }));\n\n return { containers, total: containers.length };\n }\n}\n\n// Auto-register\nregisterIntegration('docker', DockerIntegration);\n"]}
|