@almadar/integrations 2.27.0 → 2.29.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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/contracts.ts","../src/core/logger.ts","../src/core/validation.ts","../src/core/retry.ts","../src/core/BaseIntegration.ts","../src/registry.ts","../src/factory.ts","../src/credentials/store.ts","../src/credentials/resolver.ts","../src/credentials/filePersistence.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/webhook/index.ts","../src/integrations/push/index.ts","../src/integrations/calendar/webhooks.ts","../src/integrations/calendar/index.ts","../src/hooks.ts","../src/integrations/drive/index.ts","../src/integrations/metaAds/index.ts","../src/integrations/accounting/index.ts","../src/integrations/banking/index.ts","../src/integrations/esign/index.ts","../src/integrations/llm/index.ts","../src/integrations/ml/index.ts","../src/integrations/deepagent/index.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/credentials/index.ts","../src/integrations/storage/index.ts","../src/integrations/docker/index.ts","../src/integrations/database/sql-guard.ts","../src/integrations/database/index.ts","../src/integrations/wikimedia/index.ts","../src/integrations/iconify/index.ts","../src/integrations/arxiv/index.ts"],"names":["STRIPE_API_VERSION","isoFromUnix","priceToTier","mapStatus","shapeSubscription","Stripe","sub","google","init","fs","join","writeFileSync","isParamRecord","decodeContent","createHash","bytes","contentType","url","s3GetSignedUrl","DEFAULT_TIMEOUT_MS","DEFAULT_UA"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 * ServiceContract type definitions for all @almadar/integrations.\n *\n * Each integration defines its own action map as a Record<string, ServiceAction>,\n * suitable for use with ServiceContract<T> from @almadar/core.\n *\n * Types are simplified representations of the actual params/results. They capture\n * the contract shape without pulling in third-party SDK types (Stripe, Twilio, etc.).\n *\n * @packageDocumentation\n */\n\nimport type { ServiceAction, ServiceEvents, ServiceParams, ServiceParamsValue } from '@almadar/core';\nimport type { IntegrationParams } from './types';\nimport type { DatabaseQueryParamValue, DatabaseRow } from './integrations/database/types';\n\n// ============================================================================\n// GitHub\n// ============================================================================\n\nexport type GitHubActions = {\n cloneRepo: {\n params: { repoUrl: string; targetDir: string; branch?: string };\n result: { message: string };\n };\n createBranch: {\n params: { branchName: string; baseBranch?: string };\n result: { message: string };\n };\n commit: {\n params: { message: string; files?: string[] };\n result: { message: string };\n };\n push: {\n params: { branchName: string; force?: boolean };\n result: { message: string };\n };\n createPR: {\n params: { title: string; body: string; baseBranch: string; headBranch: string; draft?: boolean };\n result: { number: number; url: string; title: string };\n };\n getPRComments: {\n params: { prNumber: number };\n result: { comments: Array<{ id: number; body: string; user: string }> };\n };\n listIssues: {\n params: { state?: string; labels?: string[]; per_page?: number };\n result: { issues: Array<{ number: number; title: string; state: string }> };\n };\n getIssue: {\n params: { issueNumber: number };\n result: { number: number; title: string; body: string; state: string };\n };\n getFile: {\n params: { owner: string; repo: string; path: string; ref?: string };\n result: { path: string; content: string; sha: string; size: number };\n };\n listCommits: {\n params: { owner: string; repo: string; path?: string; ref?: string; per_page?: number };\n result: { commits: Array<{ sha: string; message: string; author: string; date: string }> };\n };\n createIssue: {\n params: { owner: string; repo: string; title: string; body?: string; labels?: string[] };\n result: { number: number; title: string; url: string };\n };\n};\n\n// ============================================================================\n// Stripe\n// ============================================================================\n\nexport type StripeActions = {\n createPaymentIntent: {\n params: { amount: number; currency: string; metadata?: Record<string, string> };\n result: { id: string; clientSecret: string; status: string; amount: number; currency: string };\n };\n confirmPayment: {\n params: { paymentIntentId: string };\n result: { id: string; status: string };\n };\n refund: {\n params: { paymentIntentId: string; amount?: number };\n result: { id: string; status: string; amount: number };\n };\n};\n\n// ============================================================================\n// LLM\n// ============================================================================\n\nexport type LLMIntegrationActions = {\n generate: {\n params: {\n userPrompt: string;\n systemPrompt?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n };\n result: {\n content: string;\n usage: { promptTokens?: number; completionTokens?: number; totalTokens?: number; tokens?: number };\n };\n };\n classify: {\n params: { text: string; categories: string[]; model?: string };\n result: { category: string; confidence: number; reasoning: string };\n };\n extract: {\n params: { text: string; schema: IntegrationParams; model?: string };\n result: IntegrationParams;\n };\n summarize: {\n params: { text: string; maxLength?: number; style?: string; model?: string };\n result: { summary: string; keyPoints: string[] };\n };\n embed: {\n params: { texts: string[]; model?: string };\n result: { embeddings: number[][] };\n };\n};\n\n// ============================================================================\n// ML (model inference)\n// ============================================================================\n\nexport type MLActions = {\n infer: {\n params: { model: string; input: ServiceParamsValue };\n result: { output: ServiceParamsValue; confidence: number; violations: ServiceParamsValue[] };\n };\n};\n\n// ============================================================================\n// YouTube\n// ============================================================================\n\nexport type YouTubeActions = {\n search: {\n params: { query: string; maxResults?: number; type?: string };\n result: Array<{ videoId: string; title: string; thumbnail: string; description: string }>;\n };\n getVideo: {\n params: { videoId: string };\n result: { title: string; description: string; viewCount: string; likeCount: string };\n };\n getChannel: {\n params: { channelId: string };\n result: { name: string; description: string; subscriberCount: string };\n };\n};\n\n// ============================================================================\n// Twilio\n// ============================================================================\n\nexport type TwilioActions = {\n sendSMS: {\n params: { to: string; body: string; from?: string };\n result: { sid: string; status: string };\n };\n sendWhatsApp: {\n params: { to: string; body: string };\n result: { sid: string; status: string };\n };\n};\n\n// ============================================================================\n// Email\n// ============================================================================\n\nexport type EmailActions = {\n send: {\n params: {\n to: string;\n subject: string;\n body: string;\n from?: string;\n /** HTML content; when present `body` becomes the plain-text alternative. */\n htmlBody?: string;\n replyTo?: string;\n /** Provider template reference (SendGrid dynamic templates; Resend rejects it loudly). */\n templateId?: string;\n };\n result: { id: string; status: string };\n };\n};\n\n// ============================================================================\n// Webhook\n// ============================================================================\n\nexport type WebhookActions = {\n send: {\n params: { url: string; event: string; payload?: Record<string, string>; secret?: string };\n result: { status: number; ok: boolean; durationMs: number };\n };\n};\n\n// ============================================================================\n// Push (Web Push / VAPID)\n// ============================================================================\n\nexport type PushActions = {\n send: {\n params: {\n subscription: { endpoint: string; keys: { p256dh: string; auth: string } };\n title: string;\n body: string;\n url?: string;\n icon?: string;\n };\n result: { statusCode: number; ok: boolean; expired: boolean };\n };\n};\n\n// ============================================================================\n// Calendar (Google Calendar, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type CalendarActions = {\n listEvents: {\n params: { calendarId?: string; timeMin?: string; timeMax?: string; syncToken?: string; maxResults?: number };\n result: {\n events: Array<{ id: string; summary: string; description: string; location: string; start: string; end: string; status: string; updated: string }>;\n nextSyncToken: string | null;\n };\n };\n createEvent: {\n params: { calendarId?: string; summary: string; description?: string; location?: string; start: string; end?: string; durationMinutes?: number };\n result: { id: string; status: string; htmlLink: string };\n };\n updateEvent: {\n params: { calendarId?: string; eventId: string; summary?: string; description?: string; location?: string; start?: string; end?: string };\n result: { id: string; status: string };\n };\n deleteEvent: {\n params: { calendarId?: string; eventId: string };\n result: { id: string; deleted: boolean };\n };\n freeBusy: {\n params: { calendarId?: string; timeMin: string; timeMax: string };\n result: { busy: Array<{ start: string; end: string }> };\n };\n watch: {\n params: { calendarId?: string; channelId: string; address: string; ttlSeconds?: number };\n result: { channelId: string; resourceId: string; expiration: string };\n };\n stopWatch: {\n params: { channelId: string; resourceId: string };\n result: { stopped: boolean };\n };\n};\n\n// ============================================================================\n// Drive (Google Drive, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type DriveActions = {\n listFiles: {\n params: { folderId?: string; query?: string; maxResults?: number };\n result: {\n files: Array<{ id: string; name: string; mimeType: string; size: number; modifiedTime: string; webViewLink: string }>;\n };\n };\n getFile: {\n params: { fileId: string };\n result: { id: string; name: string; mimeType: string; content: string; size: number };\n };\n uploadFile: {\n params: { name: string; content: string; mimeType?: string; folderId?: string };\n result: { id: string; name: string; webViewLink: string };\n };\n createFolder: {\n params: { name: string; parentId?: string };\n result: { id: string; name: string };\n };\n shareFile: {\n params: { fileId: string; email: string; role?: 'reader' | 'writer' | 'commenter' };\n result: { shared: boolean; permissionId: string };\n };\n};\n\n// ============================================================================\n// Meta Ads (Graph API Marketing Insights, read-only)\n// ============================================================================\n\nexport type MetaAdsActions = {\n getSpend: {\n params: { accountId?: string; since: string; until: string; clientTag?: string };\n result: { spend: number; currency: string; impressions: number; clicks: number };\n };\n listCampaigns: {\n params: { accountId?: string; status?: string };\n result: { campaigns: Array<{ id: string; name: string; status: string; dailyBudget: number }> };\n };\n};\n\n// ============================================================================\n// Accounting (generic export — provider-pluggable, CSV first)\n// ============================================================================\n\nexport type AccountingActions = {\n exportInvoices: {\n params: {\n invoices: Array<{ id: string; number: string; customer: string; issuedAt: string; dueAt: string; currency: string; net: number; tax: number; gross: number; status: string }>;\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n exportJournal: {\n params: {\n entries: Array<{ date: string; account: string; description: string; debit: number; credit: number; reference: string }>;\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n};\n\n// ============================================================================\n// Banking (GoCardless Bank Account Data)\n// ============================================================================\n\nexport type BankingActions = {\n createRequisition: {\n params: { institutionId: string; redirectUrl: string; reference?: string };\n result: { requisitionId: string; link: string };\n };\n listAccounts: {\n params: { requisitionId: string };\n result: { accounts: string[] };\n };\n listTransactions: {\n params: { accountId: string; dateFrom?: string; dateTo?: string };\n result: {\n transactions: Array<{ id: string; amount: number; currency: string; date: string; description: string; counterparty: string }>;\n };\n };\n};\n\n// ============================================================================\n// E-sign (pluggable, DocuSign first)\n// ============================================================================\n\nexport type EsignActions = {\n sendEnvelope: {\n params: { recipientEmail: string; recipientName: string; documentName: string; documentContent: string; emailSubject?: string };\n result: { envelopeId: string; status: string };\n };\n getEnvelopeStatus: {\n params: { envelopeId: string };\n result: { status: string; completedAt: string };\n };\n downloadDocument: {\n params: { envelopeId: string };\n result: { content: string; documentName: string };\n };\n};\n\n// ============================================================================\n// Docker\n// ============================================================================\n\nexport type DockerActions = {\n build: {\n params: { tag: string; dockerfile?: string; context?: string; buildArgs?: Record<string, string> };\n result: { imageId: string; tag: string; size: number; buildTime: number };\n };\n run: {\n params: {\n image: string;\n name?: string;\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 };\n result: {\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n };\n };\n stop: {\n params: { containerId: string };\n result: { containerId: string; status: string; stoppedAt: number };\n };\n remove: {\n params: { containerId: string; force?: boolean };\n result: { containerId: string; removed: boolean };\n };\n logs: {\n params: { containerId: string; tail?: number; since?: string };\n result: { containerId: string; logs: string[]; lineCount: number };\n };\n status: {\n params: { containerId: string };\n result: {\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 };\n list: {\n params: { all?: boolean; filterByLabel?: string };\n result: {\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 };\n};\n\n// ============================================================================\n// Storage\n// ============================================================================\n\nexport type StorageActions = {\n upload: {\n params: {\n bucket: string;\n // Two upload shapes are admitted: the canonical `{ key, content }`\n // pair, and the file-form `{ file, acl?, maxSize? }` shape that lolo\n // authors use when wiring an `<input type=\"file\">` upload payload\n // straight to storage (UploadDropZone emits\n // `{ name, size, type, content }` with `content` a base64 data URL).\n // The handler reads `file` if present and derives `key`/`content`\n // from it; legacy callers still get the direct `key`/`content` path.\n key?: string;\n content?: string;\n contentType?: string;\n file?: { name: string; size: number; type: string; content?: string };\n acl?: 'public' | 'private';\n maxSize?: number;\n metadata?: IntegrationParams;\n };\n // `id`/`url` mirror `key` and its public/signed address — the fields the\n // .lolo upload consumers (std-service-storage, social-feed, chat) read.\n result: { key: string; bucket: string; size: number; etag: string; id: string; url: string };\n };\n download: {\n params: { bucket: string; key: string };\n result: { content: string; contentType: string; size: number; metadata: IntegrationParams };\n };\n list: {\n params: { bucket: string; prefix?: string; maxKeys?: number; continuationToken?: string };\n result: {\n keys: Array<{ key: string; size: number; lastModified: number }>;\n truncated: boolean;\n // Present iff truncated — pass back as `continuationToken` for the next page (I-11).\n nextToken?: string;\n };\n };\n delete: {\n params: { bucket: string; key: string };\n result: { deleted: boolean };\n };\n getSignedUrl: {\n params: { bucket: string; key: string; expiresIn?: number; operation?: 'get' | 'put' };\n result: { url: string; expiresAt: number };\n };\n};\n\n// ============================================================================\n// Queue\n// ============================================================================\n\nexport type QueueActions = {\n enqueue: {\n params: { queue: string; payload: ServiceParams; delay?: number; priority?: number };\n result: { jobId: string; position: number };\n };\n dequeue: {\n params: { queue: string };\n result: { job: { id: string; payload: ServiceParams; enqueuedAt: number; priority: number } | null };\n };\n status: {\n params: { jobId: string };\n result: {\n status: 'pending' | 'processing' | 'completed' | 'failed';\n job: { id: string; payload: ServiceParams; enqueuedAt: number; priority: number } | null;\n };\n };\n complete: {\n params: { jobId: string; result?: ServiceParams };\n result: { completed: boolean };\n };\n fail: {\n params: { jobId: string; error?: string };\n result: { failed: boolean };\n };\n cancel: {\n params: { jobId: string };\n result: { cancelled: boolean };\n };\n size: {\n params: { queue: string };\n result: { size: number; pending: number; processing: number };\n };\n};\n\n// ============================================================================\n// Redis\n// ============================================================================\n\nexport type RedisActions = {\n get: {\n params: { key: string };\n result: { value: ServiceParams };\n };\n set: {\n params: { key: string; value: ServiceParams; ttl?: number };\n result: { ok: boolean };\n };\n delete: {\n params: { key: string };\n result: { deleted: boolean };\n };\n lock: {\n params: { key: string; ttl?: number };\n result: { acquired: boolean; lockId: string };\n };\n unlock: {\n params: { key: string; lockId: string };\n result: { released: boolean };\n };\n increment: {\n params: { key: string; by?: number };\n result: { value: number };\n };\n expire: {\n params: { key: string; ttl: number };\n result: { set: boolean };\n };\n publish: {\n params: { channel: string; message: ServiceParams };\n result: { receivers: number };\n };\n subscribe: {\n params: { channel: string };\n result: { subscribed: boolean };\n };\n};\n\n// ============================================================================\n// OAuth\n// ============================================================================\n\nexport type OAuthActions = {\n authorize: {\n params: { provider: 'google' | 'github' | 'auth0'; scopes: string[]; redirectUri: string };\n result: { authUrl: string; state: string };\n };\n token: {\n params: { code: string; state: string };\n result: { accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' };\n };\n refresh: {\n params: { refreshToken: string };\n result: { accessToken: string; expiresIn: number };\n };\n revoke: {\n params: { token: string };\n result: { revoked: boolean };\n };\n userinfo: {\n params: { accessToken: string };\n result: { sub: string; email: string; name: string; picture: string };\n };\n};\n\n// ============================================================================\n// Credentials (hosted tenant credential store — the settings-page backend)\n// ============================================================================\n\nexport type CredentialsActions = {\n list: {\n params: { service?: string };\n result: {\n enabled: boolean;\n entries: Array<{\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n }>;\n };\n };\n set: {\n params: { service: string; envVar: string; value: string };\n result: { saved: boolean; service: string; envVar: string; last4: string };\n };\n remove: {\n params: { service: string; envVar: string };\n result: { removed: boolean };\n };\n test: {\n params: { service: string };\n result: { service: string; configured: boolean; missing: string[]; probed: boolean; ok: boolean; message: string };\n };\n rotate: {\n params: Record<string, never>;\n result: { rotated: number; alreadyCurrent: number; unreadable: number };\n };\n};\n\n// ============================================================================\n// OpenTelemetry\n// ============================================================================\n\nexport type OtelActions = {\n startSpan: {\n params: { name: string; attributes?: IntegrationParams; traceId?: string };\n result: { spanId: string; traceId: string };\n };\n endSpan: {\n params: { spanId: string; status?: 'ok' | 'error' };\n result: { ended: boolean };\n };\n addEvent: {\n params: { spanId: string; name: string; attributes?: IntegrationParams };\n result: { added: boolean };\n };\n recordMetric: {\n params: { name: string; value: number; type?: 'counter' | 'gauge' | 'histogram'; labels?: IntegrationParams };\n result: { recorded: boolean };\n };\n getSpan: {\n params: { spanId: string };\n result: {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n } | null;\n };\n getMetrics: {\n params: Record<string, never>;\n result: Record<string, { name: string; type: string; value: number; values: number[]; labels: IntegrationParams }>;\n };\n};\n\n// ============================================================================\n// CLI\n// ============================================================================\n\nexport type CLIActions = {\n validate: {\n params: { schema: string };\n result: { valid: boolean; errors: string[]; warnings: string[]; summary: string };\n };\n};\n\n// ============================================================================\n// DeepAgent\n// ============================================================================\n\nexport type DeepAgentActions = {\n sendMessage: {\n params: { message: string; threadId?: string; skill?: string; context?: IntegrationParams };\n result: { response: string; threadId: string };\n };\n cancelGeneration: {\n params: { threadId: string };\n result: { cancelled: boolean };\n };\n validateSchema: {\n params: { schema: string };\n result: { valid: boolean; errors: string[] };\n };\n compileSchema: {\n params: { schema: string; shell?: string };\n result: { output: string; files: string[] };\n };\n getThreadHistory: {\n params: { threadId: string };\n result: { messages: Array<{ role: string; content: string; timestamp: number }> };\n };\n};\n\n// ============================================================================\n// Database\n// ============================================================================\n\nexport type DatabaseActions = {\n query: {\n params: {\n connectionRef: string;\n sql: string;\n params?: DatabaseQueryParamValue[];\n };\n result: { rows: DatabaseRow[]; rowCount: number };\n };\n};\n\n// ============================================================================\n// Wikimedia\n// ============================================================================\n\nexport type WikimediaActions = {\n getPage: {\n params: { title: string };\n result: { title?: string; description?: string; portraitUrl?: string; extract?: string };\n };\n};\n\n// ============================================================================\n// Iconify\n// ============================================================================\n\nexport type IconifyActions = {\n svgExists: {\n params: { path: string };\n result: { exists: boolean };\n };\n search: {\n params: { query: string; limit?: number };\n result: { icons: string[] };\n };\n getIconBody: {\n params: { iconId: string };\n result: { body: string | null };\n };\n};\n\n// ============================================================================\n// arXiv\n// ============================================================================\n\nexport type ArxivActions = {\n search: {\n params: { query: string; maxResults?: number };\n result: { results: Array<{ id: string; title: string; summary: string; authors: string[]; published: string; url: string }> };\n };\n};\n\n// ============================================================================\n// Barrel: IntegrationContracts\n// ============================================================================\n\n/**\n * Maps each integration name (as used in `registerIntegration`) to its action\n * map type. Use with `ServiceContract<IntegrationContracts[K]>` to get a fully\n * typed service interface for a specific integration.\n *\n * @example\n * ```typescript\n * import type { ServiceContract } from '@almadar/core';\n * import type { IntegrationContracts } from '@almadar/integrations';\n *\n * type TypedStripe = ServiceContract<IntegrationContracts['stripe']>;\n * ```\n */\nexport type IntegrationContracts = {\n github: GitHubActions;\n stripe: StripeActions;\n llm: LLMIntegrationActions;\n ml: MLActions;\n youtube: YouTubeActions;\n twilio: TwilioActions;\n email: EmailActions;\n webhook: WebhookActions;\n push: PushActions;\n calendar: CalendarActions;\n drive: DriveActions;\n metaAds: MetaAdsActions;\n accounting: AccountingActions;\n banking: BankingActions;\n esign: EsignActions;\n docker: DockerActions;\n storage: StorageActions;\n queue: QueueActions;\n redis: RedisActions;\n oauth: OAuthActions;\n credentials: CredentialsActions;\n otel: OtelActions;\n cli: CLIActions;\n deepagent: DeepAgentActions;\n database: DatabaseActions;\n wikimedia: WikimediaActions;\n iconify: IconifyActions;\n arxiv: ArxivActions;\n};\n\n/** Integration name literal union. */\nexport type IntegrationName = keyof IntegrationContracts;\n\n/**\n * Helper: extract the action names for a given integration.\n *\n * @example\n * ```typescript\n * type StripeAction = IntegrationActionName<'stripe'>;\n * // => 'createPaymentIntent' | 'confirmPayment' | 'refund'\n * ```\n */\nexport type IntegrationActionName<K extends IntegrationName> =\n keyof IntegrationContracts[K] & string;\n\n// ============================================================================\n// Event Map\n// ============================================================================\n\n/** Events emitted by integrations during execution. */\nexport type IntegrationEventMap = {\n INTEGRATION_CALL_STARTED: { integration: string; action: string; timestamp: number };\n INTEGRATION_CALL_SUCCEEDED: { integration: string; action: string; durationMs: number };\n INTEGRATION_CALL_FAILED: { integration: string; action: string; error: string; retryCount: number };\n INTEGRATION_RETRY: { integration: string; action: string; attempt: number; maxRetries: number };\n INTEGRATION_REGISTERED: { integration: string; actions: string[] };\n};\n\n/** Typed event emitter for integration events. */\nexport type IntegrationServiceEvents = ServiceEvents<IntegrationEventMap>;\n\n// ============================================================================\n// Type Assertions\n// ============================================================================\n\n// Compile-time verification that all action maps satisfy Record<string, ServiceAction>.\n// This is a type-level assertion, not runtime code.\ntype _AssertActions<T extends Record<string, ServiceAction>> = T;\ntype _CheckGitHub = _AssertActions<GitHubActions>;\ntype _CheckStripe = _AssertActions<StripeActions>;\ntype _CheckLLM = _AssertActions<LLMIntegrationActions>;\ntype _CheckML = _AssertActions<MLActions>;\ntype _CheckYouTube = _AssertActions<YouTubeActions>;\ntype _CheckTwilio = _AssertActions<TwilioActions>;\ntype _CheckEmail = _AssertActions<EmailActions>;\ntype _CheckWebhook = _AssertActions<WebhookActions>;\ntype _CheckPush = _AssertActions<PushActions>;\ntype _CheckCalendar = _AssertActions<CalendarActions>;\ntype _CheckDrive = _AssertActions<DriveActions>;\ntype _CheckMetaAds = _AssertActions<MetaAdsActions>;\ntype _CheckAccounting = _AssertActions<AccountingActions>;\ntype _CheckBanking = _AssertActions<BankingActions>;\ntype _CheckEsign = _AssertActions<EsignActions>;\ntype _CheckDocker = _AssertActions<DockerActions>;\ntype _CheckStorage = _AssertActions<StorageActions>;\ntype _CheckQueue = _AssertActions<QueueActions>;\ntype _CheckRedis = _AssertActions<RedisActions>;\ntype _CheckOAuth = _AssertActions<OAuthActions>;\ntype _CheckCredentials = _AssertActions<CredentialsActions>;\ntype _CheckOtel = _AssertActions<OtelActions>;\ntype _CheckCLI = _AssertActions<CLIActions>;\ntype _CheckDeepAgent = _AssertActions<DeepAgentActions>;\ntype _CheckDatabase = _AssertActions<DatabaseActions>;\ntype _CheckWikimedia = _AssertActions<WikimediaActions>;\ntype _CheckIconify = _AssertActions<IconifyActions>;\ntype _CheckArxiv = _AssertActions<ArxivActions>;\n\n// ============================================================================\n// Credential Declarations\n// ============================================================================\n\n/** A credential (environment variable) required by an integration. */\nexport interface CredentialDeclaration {\n envVar: string;\n required: boolean;\n description: string;\n}\n\n/**\n * Credential declarations for all integrations.\n *\n * This is the single source of truth for what env vars each service needs.\n * Consumed by:\n * - almadar-service-sync (extracts into services-registry.json)\n * - @almadar-io/terraform (provisions Secret Manager resources)\n * - RuntimeIntegrationManager (validates env configuration)\n */\nexport const serviceCredentials: Record<string, CredentialDeclaration[]> = {\n stripe: [\n { envVar: 'STRIPE_SECRET_KEY', required: true, description: 'Stripe secret API key' },\n { envVar: 'STRIPE_WEBHOOK_SECRET', required: false, description: 'Webhook endpoint signing secret' },\n ],\n youtube: [\n { envVar: 'YOUTUBE_API_KEY', required: true, description: 'YouTube Data API key' },\n ],\n twilio: [\n { envVar: 'TWILIO_ACCOUNT_SID', required: true, description: 'Twilio account SID' },\n { envVar: 'TWILIO_AUTH_TOKEN', required: true, description: 'Twilio auth token' },\n { envVar: 'TWILIO_PHONE_NUMBER', required: false, description: 'Default sender phone number' },\n ],\n email: [\n { envVar: 'SENDGRID_API_KEY', required: false, description: 'SendGrid API key (use this OR RESEND_API_KEY)' },\n { envVar: 'RESEND_API_KEY', required: false, description: 'Resend API key (use this OR SENDGRID_API_KEY)' },\n { envVar: 'FROM_EMAIL', required: false, description: 'Default sender email address' },\n ],\n webhook: [\n { envVar: 'WEBHOOK_SIGNING_SECRET', required: false, description: 'Default HMAC-SHA256 signing secret (per-call secret overrides)' },\n { envVar: 'WEBHOOK_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms, default 10000)' },\n ],\n push: [\n { envVar: 'VAPID_PUBLIC_KEY', required: true, description: 'VAPID public key (web-push generate-vapid-keys)' },\n { envVar: 'VAPID_PRIVATE_KEY', required: true, description: 'VAPID private key' },\n { envVar: 'VAPID_SUBJECT', required: true, description: 'VAPID subject (mailto: or https: contact URI)' },\n ],\n calendar: [\n { envVar: 'GOOGLE_CALENDAR_SA_KEY', required: true, description: 'Google service-account key JSON (raw or base64) with calendar scope; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_CALENDAR_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_CALENDAR_ID', required: false, description: 'Default calendar id (default: primary)' },\n { envVar: 'GOOGLE_CALENDAR_CHANNEL_TOKEN', required: false, description: 'Watch-channel verification token — required to receive inbound calendar hooks (two-way sync)' },\n ],\n drive: [\n { envVar: 'GOOGLE_DRIVE_SA_KEY', required: false, description: 'Google service-account key JSON (raw or base64) with drive scope — serves reads; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_DRIVE_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_DRIVE_REFRESH_TOKEN', required: false, description: 'User OAuth refresh token (drive-consent.mjs) — serves writes; SA uploads are impossible on personal accounts (no SA storage quota)' },\n { envVar: 'GOOGLE_DRIVE_FOLDER_ID', required: false, description: 'Default parent folder for uploads/new folders when the call names none' },\n ],\n metaAds: [\n { envVar: 'META_ACCESS_TOKEN', required: true, description: 'Meta Graph API access token (Marketing API, ads_read)' },\n { envVar: 'META_AD_ACCOUNT_ID', required: false, description: 'Default ad account id (act_…); per-call accountId overrides' },\n ],\n accounting: [],\n banking: [\n { envVar: 'GOCARDLESS_SECRET_ID', required: true, description: 'GoCardless Bank Account Data secret id' },\n { envVar: 'GOCARDLESS_SECRET_KEY', required: true, description: 'GoCardless Bank Account Data secret key' },\n ],\n esign: [\n { envVar: 'DOCUSIGN_BASE_URL', required: true, description: 'DocuSign REST base (e.g. https://demo.docusign.net/restapi/v2.1/accounts/<accountId>)' },\n { envVar: 'DOCUSIGN_ACCESS_TOKEN', required: true, description: 'DocuSign OAuth access token (JWT grant rotation is the deployment concern)' },\n ],\n llm: [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key (use this OR OPENAI_API_KEY)' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key (use this OR ANTHROPIC_API_KEY)' },\n ],\n 'llm-integration': [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key' },\n ],\n ml: [\n { envVar: 'MASAR_URL', required: true, description: 'Base URL of the deployed model-serving orbital' },\n { envVar: 'MASAR_ML_TRAIT', required: true, description: 'Kebab-case trait name the serving orbital exposes its /events route under' },\n ],\n deepagent: [\n { envVar: 'DEEPAGENT_API_URL', required: true, description: 'DeepAgent server URL' },\n { envVar: 'DEEPAGENT_API_KEY', required: false, description: 'DeepAgent API key' },\n ],\n github: [\n { envVar: 'GITHUB_TOKEN', required: true, description: 'GitHub personal access token' },\n { envVar: 'GITHUB_OWNER', required: false, description: 'Default repository owner' },\n { envVar: 'GITHUB_REPO', required: false, description: 'Default repository name' },\n ],\n docker: [\n { envVar: 'DOCKER_HOST', required: false, description: 'Docker daemon host URL' },\n ],\n storage: [\n { envVar: 'STORAGE_ACCESS_KEY_ID', required: true, description: 'S3-compatible access key id' },\n { envVar: 'STORAGE_SECRET_ACCESS_KEY', required: true, description: 'S3-compatible secret access key' },\n { envVar: 'STORAGE_BUCKET', required: true, description: 'Default bucket name' },\n { envVar: 'STORAGE_REGION', required: false, description: 'Region (default us-east-1)' },\n { envVar: 'STORAGE_ENDPOINT', required: false, description: 'Custom S3-compatible endpoint (R2/MinIO/…); empty = AWS S3' },\n { envVar: 'STORAGE_PUBLIC_URL_BASE', required: false, description: 'Base URL for public-acl object links; empty = endpoint-derived' },\n ],\n queue: [\n { envVar: 'QUEUE_URL', required: true, description: 'Message queue connection URL' },\n ],\n redis: [\n { envVar: 'REDIS_URL', required: true, description: 'Redis connection URL' },\n ],\n oauth: [\n { envVar: 'OAUTH_CLIENT_ID', required: true, description: 'OIDC client ID' },\n { envVar: 'OAUTH_CLIENT_SECRET', required: true, description: 'OIDC client secret' },\n { envVar: 'OAUTH_REDIRECT_URI', required: false, description: 'OIDC redirect URI (default per-call param)' },\n { envVar: 'OIDC_ISSUER_URL', required: false, description: 'OIDC issuer URL (default https://accounts.google.com)' },\n ],\n credentials: [\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY', required: false, description: 'AES-256 master key (64-char hex) enabling the hosted credential store — hold it alone in the platform secret store' },\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS', required: false, description: 'Previous master key, present only during a rotation window — decrypts old rows until `credentials.rotate` re-encrypts them' },\n ],\n otel: [\n { envVar: 'OTEL_EXPORTER_OTLP_ENDPOINT', required: true, description: 'OpenTelemetry collector endpoint' },\n { envVar: 'OTEL_SERVICE_NAME', required: false, description: 'Service name for traces' },\n ],\n cli: [],\n // No fixed env vars — connection strings are resolved per-query from the\n // caller-supplied connectionRef, so credentials cannot be declared statically.\n database: [],\n wikimedia: [\n { envVar: 'WIKIMEDIA_USER_AGENT', required: false, description: 'Descriptive User-Agent for the Wikipedia API' },\n { envVar: 'WIKIMEDIA_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n iconify: [\n { envVar: 'ICONIFY_USER_AGENT', required: false, description: 'User-Agent for the Iconify API' },\n { envVar: 'ICONIFY_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n arxiv: [\n { envVar: 'ARXIV_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n};\n\n/**\n * Declared side-effect-free \"Test connection\" probes, executed by the\n * `credentials.test` action through the normal factory path. Only services\n * with a genuinely cheap, read-only, env-defaulted action carry one; the\n * rest report credential presence + constructor validation.\n */\n/**\n * One inbound-hook mount a service's provider needs in a deployed app:\n * `POST /api/hooks/:provider` verified by the provider's own token/signature,\n * dispatching `event` onto the app bus. A hook is a PROVIDER property — the\n * service invocation is the `.lolo` surface; codegen derives the mount from\n * the app's invoked services × these declarations (I-26).\n */\nexport interface HookDeclaration {\n /** Provider key mounted at POST /api/hooks/:provider */\n provider: string;\n /** Bus event dispatched into the app on a verified callback */\n event: string;\n /** Env var carrying the provider's verification secret/channel token */\n credentialEnv: string;\n /** Factory export in @almadar/integrations: (secret?) => HookProvider */\n providerExport: string;\n}\n\n/**\n * Inbound-hook declarations per service — the single source the registry,\n * codegen, and the playground mount derive from.\n */\nexport const serviceHooks: Record<string, HookDeclaration[]> = {\n calendar: [\n {\n provider: 'google-calendar',\n event: 'CAL_REMOTE_CHANGED',\n credentialEnv: 'GOOGLE_CALENDAR_CHANNEL_TOKEN',\n providerExport: 'googleCalendarHookProvider',\n },\n ],\n};\n\nexport const serviceProbes: Partial<Record<IntegrationName, { action: string; params: ServiceParams }>> = {\n calendar: { action: 'listEvents', params: { maxResults: 1 } },\n drive: { action: 'listFiles', params: { maxResults: 1 } },\n metaAds: { action: 'listCampaigns', params: {} },\n};\n\n/** Backend maturity grade of an integration implementation. */\nexport type IntegrationBackendGrade = 'production' | 'simulated' | 'stub';\n\n/**\n * Honest backend grade per integration — 'simulated' marks an in-memory\n * implementation that must never be mistaken for a real backend. Synced into\n * services-registry.json (`backend`) by `almadar-sync services` and surfaced\n * by the verify service manifest and /health.\n */\nexport const serviceBackends: Record<IntegrationName, IntegrationBackendGrade> = {\n github: 'production',\n stripe: 'production',\n llm: 'production',\n ml: 'production',\n youtube: 'production',\n twilio: 'production',\n email: 'production',\n webhook: 'production',\n push: 'production',\n calendar: 'production',\n drive: 'production',\n metaAds: 'production',\n accounting: 'production',\n banking: 'production',\n esign: 'production',\n docker: 'simulated',\n storage: 'production',\n queue: 'simulated',\n redis: 'simulated',\n oauth: 'production',\n credentials: 'production',\n otel: 'simulated',\n cli: 'production',\n deepagent: 'production',\n database: 'production',\n wikimedia: 'production',\n iconify: 'production',\n arxiv: 'production',\n};\n","import { createLogger, type Logger } from '@almadar/logger';\nimport type { IntegrationLogger, LogMeta } from '../types';\n\n/**\n * Console-based logger implementation.\n *\n * Routes through `@almadar/logger`'s shared gate so namespace filtering\n * (`ALMADAR_DEBUG`, `globalThis.__ALMADAR_DEBUG__`) and the production\n * level default (WARN+) apply uniformly with the rest of `@almadar/*`.\n *\n * The constructor's `level` argument is retained for backwards\n * compatibility but is now a no-op — the active level is owned by the\n * shared logger (compile-time + env). To filter integration logs at\n * runtime, set `globalThis.__ALMADAR_DEBUG__ = 'almadar:integrations:*'`.\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private readonly log: Logger;\n\n constructor(_level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n void _level;\n this.log = createLogger('almadar:integrations');\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.log.debug(message, meta);\n }\n info(message: string, meta?: LogMeta): void {\n this.log.info(message, meta);\n }\n warn(message: string, meta?: LogMeta): void {\n this.log.warn(message, meta);\n }\n error(message: string, meta?: LogMeta): void {\n this.log.error(message, meta);\n }\n}\n","import type { ValidationResult, ValidationError, IntegrationParams } from '../types';\n\n// Import integrators registry from the package main export (JSON is inlined in the bundle)\nimport { integratorsRegistry } from '@almadar/core/patterns';\n\ninterface ActionParam {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\ninterface ActionDef {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface IntegratorEntry {\n name: string;\n description?: string;\n category?: string;\n actions: ActionDef[];\n}\n\ntype IntegratorsRegistry = Record<string, {\n version?: string;\n exportedAt?: string;\n integrators: Record<string, IntegratorEntry>;\n}>;\n\n/** Envelope keys owned by the call-service form, never action params. */\nconst RESERVED_ENVELOPE_KEYS = new Set(['emit', 'onSuccess', 'onError', 'timeout']);\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: IntegrationParams,\n): ValidationResult {\n const typedRegistry = integratorsRegistry as IntegratorsRegistry[string];\n const registry = typedRegistry.integrators[integration];\n\n if (!registry) {\n return {\n valid: false,\n errors: [\n {\n param: 'integration',\n message: `Unknown integration: ${integration}`,\n },\n ],\n };\n }\n\n const actionDef = registry.actions.find((a: ActionDef) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Unknown-key check (I-13 runtime parity with orb validate): a param the\n // contract does not declare is an error, not a silent drop. Envelope keys\n // belong to the call-service form itself, never to the action contract.\n const declaredNames = new Set(actionDef.params.map((p: ActionParam) => p.name));\n for (const key of Object.keys(params)) {\n if (RESERVED_ENVELOPE_KEYS.has(key)) continue;\n if (!declaredNames.has(key)) {\n errors.push({\n param: key,\n message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(', ')})`,\n });\n }\n }\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n IntegrationParams,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\nimport type { IntegrationCallContext } from '../factory';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action. `context` carries the caller's identity when the host\n * supplies one; integrations that gate actions by role read it and fail\n * closed when it is absent.\n */\n abstract execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: IntegrationParams,\n ): ReturnType<typeof validateParams> {\n return validateParams(this.config.name, action, params);\n }\n\n /**\n * Handle errors uniformly\n */\n protected handleError(action: string, error: unknown): IntegrationResult {\n this.logger.error(`Integration error in ${this.config.name}.${action}`, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n const integrationError =\n error instanceof Error\n ? error\n : new Error(String(error));\n\n return {\n success: false,\n error: integrationError as IntegrationError,\n metadata: this.createMetadata(action, 0, 0),\n };\n }\n\n /**\n * Create metadata for result\n */\n protected createMetadata(\n action: string,\n duration: number,\n retries: number = 0,\n ): IntegrationResult['metadata'] {\n return {\n integration: this.config.name,\n action,\n duration,\n retries,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute with retry logic\n */\n protected async executeWithRetry<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n if (!this.config.retry) {\n return fn();\n }\n\n return withRetry(fn, {\n maxAttempts: this.config.retry.maxAttempts,\n backoffMs: this.config.retry.backoffMs,\n maxBackoffMs: this.config.retry.maxBackoffMs,\n retryableErrors: [\n 'TIMEOUT_ERROR',\n 'NETWORK_ERROR',\n 'RATE_LIMIT_ERROR',\n ],\n });\n }\n}\n","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 * Optional per-call context for principal-scoped resolution (W4) and\n * caller-identity enforcement (I-25). The default — absent — means the\n * tenant/app-wide credential set with an anonymous caller; role-gated\n * integrations (credentials) fail closed without it. Additive: every\n * existing call site is untouched.\n */\nexport interface IntegrationCallContext {\n principal?: string;\n /** The caller's roster role, from the same identity entity-ACL enforces against. */\n role?: string;\n}\n\n/** Cache key for (name, principal?) — NUL never appears in either part. */\nfunction instanceKey(name: string, principal?: string): string {\n return principal ? `${name}\\u0000${principal}` : name;\n}\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). A `principal` scopes\n * the config to that principal; the app-wide config (no principal) is the\n * fallback for every principal.\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>, principal?: string): void {\n this.configs.set(instanceKey(name, principal), { name, ...config });\n }\n\n /**\n * Get or create an integration instance. Principal-scoped lookups fall\n * back to the app-wide config when no per-principal config exists.\n */\n get(name: string, principal?: string): BaseIntegration {\n const key = instanceKey(name, principal);\n const cached = this.instances.get(key);\n if (cached) {\n return cached;\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 — per-principal first, app-wide fallback\n const config = this.configs.get(key) ?? 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(key, 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 context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration, context?.principal);\n return await instance.execute(action, params, context);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string, principal?: string): boolean {\n return this.configs.has(instanceKey(name, principal)) || this.configs.has(name);\n }\n\n /**\n * Register an integration instance directly (used by mock infrastructure)\n */\n registerInstance(name: string, instance: BaseIntegration, principal?: string): void {\n this.instances.set(instanceKey(name, principal), instance);\n }\n\n /**\n * Drop the cached instance(s) for a name so the next `get` rebuilds from\n * the current config — how a credential change goes live without restart.\n * Configs are kept; without a name, every instance is dropped.\n */\n invalidate(name?: string): void {\n if (name === undefined) {\n this.instances.clear();\n return;\n }\n for (const key of this.instances.keys()) {\n if (key === name || key.startsWith(`${name}\\u0000`)) {\n this.instances.delete(key);\n }\n }\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","import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'node:crypto';\nimport type { EntityRow } from '@almadar/core';\n\n/** Entity type the credential rows persist under (never a `.lolo`-declared entity). */\nexport const CREDENTIAL_ENTITY_TYPE = 'AlmadarIntegrationCredential';\n\n/** Env var holding the 64-char-hex AES-256 master key (Secret Manager in production). */\nexport const CREDENTIAL_MASTER_KEY_ENV = 'ALMADAR_CREDENTIAL_MASTER_KEY';\n\n/**\n * Env var holding the PREVIOUS master key during a rotation window (I-28):\n * decryption tries the row's stamped key, `rotate()` re-encrypts every row\n * under the current key, then the previous key is retired from the env.\n */\nexport const CREDENTIAL_PREVIOUS_MASTER_KEY_ENV = 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS';\n\nconst ENCRYPTION_ALGORITHM = 'aes-256-gcm';\n\n/**\n * Structural subset of `@almadar/runtime`'s `PersistenceAdapter` — declared\n * here because the dependency axis runs integrations → runtime, never the\n * reverse. Every `PersistenceAdapter` implementation satisfies it as-is.\n */\nexport interface CredentialPersistence {\n create(entityType: string, data: EntityRow): Promise<{ id: string }>;\n update(entityType: string, id: string, data: EntityRow): Promise<void>;\n delete(entityType: string, id: string): Promise<void>;\n list(entityType: string): Promise<EntityRow[]>;\n}\n\n/** Masked view of one stored credential — safe to return to a settings page. */\nexport interface CredentialEntry {\n service: string;\n envVar: string;\n last4: string;\n updatedAt: number;\n}\n\ninterface StoredCredential extends CredentialEntry {\n id: string;\n value: string;\n}\n\nfunction isNonEmptyString(v: EntityRow[string]): v is string {\n return typeof v === 'string' && v.length > 0;\n}\n\n/** Stable non-secret fingerprint of a master key, stamped on rows as `keyId`. */\nfunction keyIdOf(masterKeyHex: string): string {\n return createHash('sha256').update(masterKeyHex, 'hex').digest('hex').slice(0, 16);\n}\n\nconst MASTER_KEY_SHAPE = /^[0-9a-fA-F]{64}$/;\n\n/**\n * Tenant-scoped (app-wide) credential store: one AES-256-GCM-encrypted row\n * per (service, envVar) through the host's persistence adapter, master key\n * `ALMADAR_CREDENTIAL_MASTER_KEY` held alone in the platform secret store.\n *\n * Resolution contract: credential keys ARE env-var names (the same names\n * `serviceCredentials` declares and `connectionRef` carries), so a stored\n * value transparently shadows its env counterpart — store → env →\n * unconfigured, everywhere.\n *\n * `warm()` decrypts all rows into memory so resolution stays synchronous;\n * every write re-warms the affected entry and notifies subscribers (the\n * `RuntimeIntegrationManager` re-configures on that signal, so new keys go\n * live without a restart).\n */\nexport class CredentialStore {\n private readonly adapter: CredentialPersistence;\n private readonly masterKeyHex: string | undefined;\n private readonly previousKeyHex: string | undefined;\n private readonly byEnvVar = new Map<string, StoredCredential>();\n private readonly listeners = new Set<() => void>();\n private warmed = false;\n\n constructor(adapter: CredentialPersistence, masterKey?: string, previousMasterKey?: string) {\n this.adapter = adapter;\n const key = masterKey ?? process.env[CREDENTIAL_MASTER_KEY_ENV];\n const valid = typeof key === 'string' && MASTER_KEY_SHAPE.test(key);\n if (!valid && process.env.NODE_ENV === 'production') {\n throw new Error(\n `${CREDENTIAL_MASTER_KEY_ENV} must be a 64-character hex string (32 bytes) in production — ` +\n 'generate one with: node -e \"console.log(require(\\'crypto\\').randomBytes(32).toString(\\'hex\\'))\"',\n );\n }\n this.masterKeyHex = valid ? key : undefined;\n const prev = previousMasterKey ?? process.env[CREDENTIAL_PREVIOUS_MASTER_KEY_ENV];\n this.previousKeyHex = typeof prev === 'string' && MASTER_KEY_SHAPE.test(prev) ? prev : undefined;\n }\n\n /** True when a valid master key is present (writes and decryption enabled). */\n get enabled(): boolean {\n return this.masterKeyHex !== undefined;\n }\n\n /** Subscribe to credential changes; returns an unsubscribe function. */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n for (const listener of this.listeners) listener();\n }\n\n private encrypt(plaintext: string): { ciphertext: string; iv: string; authTag: string; keyId: string } {\n if (!this.masterKeyHex) {\n throw new Error(`${CREDENTIAL_MASTER_KEY_ENV} is not configured — cannot store credentials`);\n }\n const iv = randomBytes(12);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, Buffer.from(this.masterKeyHex, 'hex'), iv);\n let ciphertext = cipher.update(plaintext, 'utf8', 'hex');\n ciphertext += cipher.final('hex');\n return {\n ciphertext,\n iv: iv.toString('hex'),\n authTag: cipher.getAuthTag().toString('hex'),\n keyId: keyIdOf(this.masterKeyHex),\n };\n }\n\n private decryptWithKey(\n keyHex: string,\n ciphertext: string,\n ivHex: string,\n authTagHex: string,\n ): string {\n const decipher = createDecipheriv(\n ENCRYPTION_ALGORITHM,\n Buffer.from(keyHex, 'hex'),\n Buffer.from(ivHex, 'hex'),\n );\n decipher.setAuthTag(Buffer.from(authTagHex, 'hex'));\n let plaintext = decipher.update(ciphertext, 'hex', 'utf8');\n plaintext += decipher.final('utf8');\n return plaintext;\n }\n\n /**\n * Decrypt one row, selecting the key by the row's stamped `keyId` (I-28):\n * current key first, then the rotation-window previous key. Legacy rows\n * (no `keyId`) try current then previous. Returns null when no held key\n * decrypts the row — the row is unreadable, never silently wrong (GCM\n * auth tags make a wrong-key success impossible).\n */\n private decryptRow(\n ciphertext: string,\n ivHex: string,\n authTagHex: string,\n rowKeyId?: string,\n ): string | null {\n if (!this.masterKeyHex) {\n throw new Error(`${CREDENTIAL_MASTER_KEY_ENV} is not configured — cannot decrypt credentials`);\n }\n const candidates: string[] = [];\n if (rowKeyId === undefined || rowKeyId === keyIdOf(this.masterKeyHex)) {\n candidates.push(this.masterKeyHex);\n }\n if (\n this.previousKeyHex !== undefined &&\n (rowKeyId === undefined || rowKeyId === keyIdOf(this.previousKeyHex))\n ) {\n candidates.push(this.previousKeyHex);\n }\n for (const key of candidates) {\n try {\n return this.decryptWithKey(key, ciphertext, ivHex, authTagHex);\n } catch {\n // wrong key — try the next candidate\n }\n }\n return null;\n }\n\n /**\n * Load and decrypt every stored row into memory. Returns the number of\n * resolvable credentials. Without a master key nothing decrypts (rows are\n * left in place, resolution falls through to env).\n */\n async warm(): Promise<number> {\n this.byEnvVar.clear();\n this.warmed = true;\n if (!this.enabled) return 0;\n const rows = await this.adapter.list(CREDENTIAL_ENTITY_TYPE);\n for (const row of rows) {\n const { id, service, envVar, ciphertext, iv, authTag } = row;\n if (\n !isNonEmptyString(id) ||\n !isNonEmptyString(service) ||\n !isNonEmptyString(envVar) ||\n !isNonEmptyString(ciphertext) ||\n !isNonEmptyString(iv) ||\n !isNonEmptyString(authTag)\n ) {\n continue;\n }\n const value = this.decryptRow(\n ciphertext,\n iv,\n authTag,\n isNonEmptyString(row.keyId) ? row.keyId : undefined,\n );\n if (value === null) continue;\n this.byEnvVar.set(envVar, {\n id,\n service,\n envVar,\n value,\n last4: value.slice(-4),\n updatedAt: typeof row.updatedAt === 'number' ? row.updatedAt : 0,\n });\n }\n return this.byEnvVar.size;\n }\n\n /** Resolve one credential by env-var name (warmed values only). */\n resolve(envVar: string): string | undefined {\n return this.byEnvVar.get(envVar)?.value;\n }\n\n /** All warmed values as an env-shaped map, for merging over the process env. */\n snapshotEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [envVar, entry] of this.byEnvVar) env[envVar] = entry.value;\n return env;\n }\n\n /** Masked entries for display — never includes plaintext. */\n entries(): CredentialEntry[] {\n return Array.from(this.byEnvVar.values())\n .map(({ service, envVar, last4, updatedAt }) => ({ service, envVar, last4, updatedAt }))\n .sort((a, b) => a.service.localeCompare(b.service) || a.envVar.localeCompare(b.envVar));\n }\n\n /** Upsert one credential (encrypts, persists, re-warms the entry, notifies). */\n async set(service: string, envVar: string, value: string): Promise<CredentialEntry> {\n if (!this.warmed) await this.warm();\n const { ciphertext, iv, authTag, keyId } = this.encrypt(value);\n const updatedAt = Date.now();\n const existing = this.byEnvVar.get(envVar);\n const data: EntityRow = { service, envVar, ciphertext, iv, authTag, keyId, updatedAt };\n let id: string;\n if (existing) {\n id = existing.id;\n await this.adapter.update(CREDENTIAL_ENTITY_TYPE, id, data);\n } else {\n ({ id } = await this.adapter.create(CREDENTIAL_ENTITY_TYPE, data));\n }\n const entry: StoredCredential = { id, service, envVar, value, last4: value.slice(-4), updatedAt };\n this.byEnvVar.set(envVar, entry);\n this.notify();\n const { service: s, envVar: e, last4, updatedAt: u } = entry;\n return { service: s, envVar: e, last4, updatedAt: u };\n }\n\n /**\n * Re-encrypt every readable row under the CURRENT master key (I-28).\n * Rotation window: deploy the new key as `ALMADAR_CREDENTIAL_MASTER_KEY`\n * with the old one as `..._PREVIOUS`, call `rotate()`, then retire the\n * previous key. Rows no held key can read are counted, never dropped.\n */\n async rotate(): Promise<{ rotated: number; alreadyCurrent: number; unreadable: number }> {\n if (!this.masterKeyHex) {\n throw new Error(`${CREDENTIAL_MASTER_KEY_ENV} is not configured — cannot rotate`);\n }\n const currentKeyId = keyIdOf(this.masterKeyHex);\n let rotated = 0;\n let alreadyCurrent = 0;\n let unreadable = 0;\n const rows = await this.adapter.list(CREDENTIAL_ENTITY_TYPE);\n for (const row of rows) {\n const { id, service, envVar, ciphertext, iv, authTag } = row;\n if (\n !isNonEmptyString(id) ||\n !isNonEmptyString(service) ||\n !isNonEmptyString(envVar) ||\n !isNonEmptyString(ciphertext) ||\n !isNonEmptyString(iv) ||\n !isNonEmptyString(authTag)\n ) {\n unreadable += 1;\n continue;\n }\n const rowKeyId = isNonEmptyString(row.keyId) ? row.keyId : undefined;\n if (rowKeyId === currentKeyId) {\n alreadyCurrent += 1;\n continue;\n }\n const value = this.decryptRow(ciphertext, iv, authTag, rowKeyId);\n if (value === null) {\n unreadable += 1;\n continue;\n }\n if (rowKeyId === undefined && this.decryptRow(ciphertext, iv, authTag, currentKeyId) !== null) {\n // Legacy row already under the current key — just stamp it.\n alreadyCurrent += 1;\n await this.adapter.update(CREDENTIAL_ENTITY_TYPE, id, { ...row, keyId: currentKeyId });\n continue;\n }\n const fresh = this.encrypt(value);\n await this.adapter.update(CREDENTIAL_ENTITY_TYPE, id, {\n service,\n envVar,\n ciphertext: fresh.ciphertext,\n iv: fresh.iv,\n authTag: fresh.authTag,\n keyId: fresh.keyId,\n updatedAt: Date.now(),\n });\n rotated += 1;\n }\n await this.warm();\n this.notify();\n return { rotated, alreadyCurrent, unreadable };\n }\n\n /** Delete one credential row; resolution falls back to env afterwards. */\n async remove(envVar: string): Promise<boolean> {\n if (!this.warmed) await this.warm();\n const existing = this.byEnvVar.get(envVar);\n if (!existing) return false;\n await this.adapter.delete(CREDENTIAL_ENTITY_TYPE, existing.id);\n this.byEnvVar.delete(envVar);\n this.notify();\n return true;\n }\n}\n","import type { CredentialStore } from './store';\nimport type { IntegrationFactory } from '../factory';\n\nlet installedStore: CredentialStore | null = null;\nlet activeFactory: IntegrationFactory | null = null;\n\n/**\n * The factory the host's `RuntimeIntegrationManager` configures — installed\n * by its constructor so the `credentials.test` probe executes through the\n * SAME factory (and therefore the same configs) as every other call-service.\n */\nexport function installActiveFactory(factory: IntegrationFactory): void {\n activeFactory = factory;\n}\n\nexport function getActiveFactory(): IntegrationFactory | null {\n return activeFactory;\n}\n\n/**\n * Install the host's credential store as the process-wide resolution source.\n * Called once at boot (playground / generated server) after the store is\n * constructed over the host's persistence adapter.\n */\nexport function installCredentialStore(store: CredentialStore): void {\n installedStore = store;\n}\n\n/** The installed store, for the credentials admin service. */\nexport function getInstalledCredentialStore(): CredentialStore | null {\n return installedStore;\n}\n\n/** Testing/reset hook. */\nexport function uninstallCredentialStore(): void {\n installedStore = null;\n}\n\n/**\n * The one credential-reference resolver: store → env → undefined.\n * `ref` is an env-var name — the same name `serviceCredentials` declares and\n * `connectionRef` params carry. Every place that used to read\n * `process.env[ref]` for a credential routes through here.\n */\nexport function resolveCredentialRef(\n ref: string,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n return installedStore?.resolve(ref) ?? env[ref];\n}\n","import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { EntityRow } from '@almadar/core';\nimport type { CredentialPersistence } from './store';\n\n/** Env var overriding where the dev credential file lives. */\nexport const CREDENTIALS_FILE_ENV = 'ALMADAR_CREDENTIALS_FILE';\n\nconst DEFAULT_RELATIVE_PATH = join('.almadar', 'dev-credentials.json');\n\n/**\n * File-backed `CredentialPersistence` for dev store-first mode (I-31): rows\n * survive playground restarts so the encrypt-at-rest path is exercised on\n * every dev run, exactly like a deployed app's Firestore-backed store. Rows\n * arrive already encrypted (ciphertext/iv/authTag) — this adapter never sees\n * plaintext. Writes are atomic (tmp file + rename). Never use in production.\n */\nexport class FileCredentialPersistence implements CredentialPersistence {\n private readonly path: string;\n private counter = 0;\n\n constructor(path?: string) {\n this.path =\n path ?? process.env[CREDENTIALS_FILE_ENV] ?? join(process.cwd(), DEFAULT_RELATIVE_PATH);\n }\n\n get filePath(): string {\n return this.path;\n }\n\n private load(): Map<string, EntityRow> {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const rows = JSON.parse(raw) as EntityRow[];\n const map = new Map<string, EntityRow>();\n for (const row of rows) {\n if (typeof row.id === 'string') map.set(row.id, row);\n }\n return map;\n } catch {\n return new Map();\n }\n }\n\n private save(rows: Map<string, EntityRow>): void {\n mkdirSync(dirname(this.path), { recursive: true });\n const tmp = `${this.path}.tmp`;\n writeFileSync(tmp, JSON.stringify([...rows.values()], null, 2), 'utf-8');\n renameSync(tmp, this.path);\n }\n\n async create(entityType: string, data: EntityRow): Promise<{ id: string }> {\n const rows = this.load();\n const id = `${entityType}-${Date.now()}-${++this.counter}`;\n rows.set(id, { ...data, id });\n this.save(rows);\n return { id };\n }\n\n async update(_entityType: string, id: string, data: EntityRow): Promise<void> {\n const rows = this.load();\n const existing = rows.get(id);\n if (existing) {\n rows.set(id, { ...existing, ...data, id });\n this.save(rows);\n }\n }\n\n async delete(_entityType: string, id: string): Promise<void> {\n const rows = this.load();\n if (rows.delete(id)) this.save(rows);\n }\n\n async list(_entityType: string): Promise<EntityRow[]> {\n return [...this.load().values()];\n }\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, from } = params;\n\n this.logger.debug('Sending SMS', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: (from as string) || 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, htmlBody, replyTo, templateId } = params;\n\n this.logger.debug('Sending email', { to: String(to), subject: String(subject), provider: this.provider });\n\n const message: SendMessage = {\n to: to as string,\n subject: subject as string,\n body: body as string,\n from: (from as string) || this.fromEmail,\n htmlBody: (htmlBody as string) || undefined,\n replyTo: (replyTo as string) || undefined,\n templateId: (templateId as string) || undefined,\n };\n\n if (this.provider === 'sendgrid') {\n return await this.sendViaSendGrid(message);\n } else if (this.provider === 'resend') {\n return await this.sendViaResend(message);\n }\n\n throw new Error(`Unknown email provider: ${this.provider}`);\n }\n\n private async sendViaSendGrid(message: SendMessage) {\n const msg = {\n to: message.to,\n from: message.from,\n subject: message.subject,\n // htmlBody present → it carries the HTML and body becomes the\n // plain-text alternative; absent → body renders as HTML (legacy).\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n ...(message.templateId ? { templateId: message.templateId } : {}),\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(message: SendMessage) {\n if (!this.resendClient) {\n throw new Error('Resend client not initialized');\n }\n if (message.templateId) {\n // Resend's send API has no template reference — silently ignoring the\n // author's template intent would be a dropped feature.\n throw new Error('templateId is not supported by the resend provider — use sendgrid or drop templateId');\n }\n\n const response = await this.resendClient.emails.send({\n from: message.from,\n to: message.to,\n subject: message.subject,\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n });\n\n return {\n id: response.data?.id,\n status: 'sent',\n };\n }\n}\n\ninterface SendMessage {\n to: string;\n subject: string;\n body: string;\n from: string;\n htmlBody?: string;\n replyTo?: string;\n templateId?: string;\n}\n\n// Auto-register\nregisterIntegration('email', EmailIntegration);\n","import { createHmac } from 'node:crypto';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Outbound webhook integration — signed HTTP POST notifications to external endpoints.\n */\nexport class WebhookIntegration extends BaseIntegration {\n private signingSecret: string;\n private timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.signingSecret = config.env.WEBHOOK_SIGNING_SECRET || '';\n this.timeoutMs = Number(config.env.WEBHOOK_TIMEOUT_MS) || 10000;\n\n this.logger.info('Webhook integration initialized');\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 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 { url, event, payload, secret } = params;\n\n const body = JSON.stringify({\n event: event as string,\n payload: payload ?? {},\n timestamp: new Date().toISOString(),\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Almadar-Event': event as string,\n };\n\n const signingSecret = (secret as string) || this.signingSecret;\n if (signingSecret) {\n headers['X-Almadar-Signature'] =\n 'sha256=' + createHmac('sha256', signingSecret).update(body).digest('hex');\n }\n\n this.logger.debug('Sending webhook', { url: String(url), event: String(event) });\n\n const startTime = Date.now();\n const response = await fetch(url as string, {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n\n // 5xx should retry via executeWithRetry; 4xx is a caller error and must not.\n if (response.status >= 500) {\n throw new Error(`Webhook endpoint returned ${response.status}`);\n }\n\n return {\n status: response.status,\n ok: response.ok,\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('webhook', WebhookIntegration);\n","import webpush from 'web-push';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ninterface PushSubscriptionParam {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toSubscription(value: IntegrationParamValue | undefined): PushSubscriptionParam {\n if (isParamRecord(value)) {\n const { endpoint, keys } = value;\n if (typeof endpoint === 'string' && isParamRecord(keys)) {\n const { p256dh, auth } = keys;\n if (typeof p256dh === 'string' && typeof auth === 'string') {\n return { endpoint, keys: { p256dh, auth } };\n }\n }\n }\n throw new Error('push.send: subscription must be { endpoint, keys: { p256dh, auth } }');\n}\n\n/**\n * Web Push integration — VAPID-signed push notifications to browser\n * PushSubscription endpoints. VAPID details are passed per call (never via the\n * web-push module singleton) so concurrent configs cannot contaminate each other.\n */\nexport class PushIntegration extends BaseIntegration {\n private vapidPublicKey: string;\n private vapidPrivateKey: string;\n private vapidSubject: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.vapidPublicKey = config.env.VAPID_PUBLIC_KEY || '';\n this.vapidPrivateKey = config.env.VAPID_PRIVATE_KEY || '';\n this.vapidSubject = config.env.VAPID_SUBJECT || '';\n\n this.logger.info('Push integration initialized');\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 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 { subscription, title, body, url, icon } = params;\n const sub = toSubscription(subscription);\n\n const payload = JSON.stringify({\n title: title as string,\n body: body as string,\n url: (url as string) || undefined,\n icon: (icon as string) || undefined,\n });\n\n this.logger.debug('Sending push notification', { endpoint: sub.endpoint });\n\n try {\n const response = await webpush.sendNotification(sub, payload, {\n vapidDetails: {\n subject: this.vapidSubject,\n publicKey: this.vapidPublicKey,\n privateKey: this.vapidPrivateKey,\n },\n });\n return { statusCode: response.statusCode, ok: true, expired: false };\n } catch (error) {\n if (error instanceof webpush.WebPushError) {\n // 5xx retries via executeWithRetry; 404/410 means the subscription is\n // gone — the caller must prune the stored row, never retry.\n if (error.statusCode >= 500) {\n throw new Error(`Push endpoint returned ${error.statusCode}`);\n }\n return {\n statusCode: error.statusCode,\n ok: false,\n expired: error.statusCode === 404 || error.statusCode === 410,\n };\n }\n throw error;\n }\n }\n}\n\n// Auto-register\nregisterIntegration('push', PushIntegration);\n","/**\n * Verify + parse Google Calendar push notifications (watch channels) into the\n * canonical Almadar hook event. Google sends NO body — everything rides the\n * `X-Goog-*` headers — and offers no HMAC; the only verifiable secret is the\n * channel token we supplied at `calendar.watch` time, so pass `expectedToken`\n * whenever the watch was registered with one.\n *\n * The googleapis SDK never appears here or in any route — this module is the\n * whole provider surface, mirroring `stripe/webhooks.ts`.\n */\n\nexport type CalendarHookEvent =\n | {\n type: 'calendar.changed';\n channelId: string;\n resourceId: string;\n /** `sync` (channel handshake), `exists`, or `not_exists`. */\n resourceState: string;\n messageNumber: number;\n }\n | { error: 'missing-headers' }\n | { error: 'bad-token' };\n\n/** Case-insensitive header lookup over a plain header record. */\nfunction header(headers: Record<string, string | undefined>, name: string): string {\n const direct = headers[name] ?? headers[name.toLowerCase()];\n if (direct !== undefined) return direct;\n const found = Object.keys(headers).find((k) => k.toLowerCase() === name.toLowerCase());\n return (found !== undefined ? headers[found] : undefined) ?? '';\n}\n\nexport function parseCalendarPushNotification(\n headers: Record<string, string | undefined>,\n expectedToken?: string,\n): CalendarHookEvent {\n const channelId = header(headers, 'x-goog-channel-id');\n const resourceId = header(headers, 'x-goog-resource-id');\n const resourceState = header(headers, 'x-goog-resource-state');\n if (!channelId || !resourceId || !resourceState) {\n return { error: 'missing-headers' };\n }\n if (expectedToken && header(headers, 'x-goog-channel-token') !== expectedToken) {\n return { error: 'bad-token' };\n }\n return {\n type: 'calendar.changed',\n channelId,\n resourceId,\n resourceState,\n messageNumber: Number(header(headers, 'x-goog-message-number')) || 0,\n };\n}\n\n/**\n * Hook-provider adapter for the shared `/api/hooks/:provider` ingress: maps a\n * Google Calendar push notification to the bus event `CAL_REMOTE_CHANGED`\n * consumed by `std-calendar-sync`. The `sync` handshake message acknowledges\n * without dispatching (it announces the channel, not a data change).\n */\nexport function googleCalendarHookProvider(expectedToken?: string) {\n return (input: { headers: Record<string, string | undefined>; rawBody: string }):\n | { event: string; payload: { channelId: string; resourceId: string; resourceState: string } }\n | { error: string }\n | { ack: true } => {\n const parsed = parseCalendarPushNotification(input.headers, expectedToken);\n if ('error' in parsed) return { error: parsed.error };\n if (parsed.resourceState === 'sync') return { ack: true };\n return {\n event: 'CAL_REMOTE_CHANGED',\n payload: {\n channelId: parsed.channelId,\n resourceId: parsed.resourceId,\n resourceState: parsed.resourceState,\n },\n };\n };\n}\n","export { parseCalendarPushNotification, googleCalendarHookProvider } from './webhooks';\nexport type { CalendarHookEvent } from './webhooks';\n\nimport { google, calendar_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Google Calendar integration — service account auth, optionally acting as a\n * Workspace user via domain-wide delegation (GOOGLE_CALENDAR_SUBJECT). All\n * event times are ISO strings on the wire; a 10-char value (YYYY-MM-DD) maps\n * to an all-day `date`, anything longer to `dateTime`.\n */\nexport class CalendarIntegration extends BaseIntegration {\n private client: calendar_v3.Calendar;\n private defaultCalendarId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_CALENDAR_SA_KEY;\n if (!rawKey) {\n throw new Error('GOOGLE_CALENDAR_SA_KEY not configured');\n }\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n\n const subject = config.env.GOOGLE_CALENDAR_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/calendar'],\n subject,\n });\n\n this.client = google.calendar({ version: 'v3', auth });\n this.defaultCalendarId = config.env.GOOGLE_CALENDAR_ID || 'primary';\n\n this.logger.info('Calendar integration initialized', {\n delegated: Boolean(subject),\n });\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 let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'listEvents':\n data = await this.executeWithRetry(() => this.listEvents(params));\n break;\n case 'createEvent':\n data = await this.executeWithRetry(() => this.createEvent(params));\n break;\n case 'updateEvent':\n data = await this.executeWithRetry(() => this.updateEvent(params));\n break;\n case 'deleteEvent':\n data = await this.executeWithRetry(() => this.deleteEvent(params));\n break;\n case 'freeBusy':\n data = await this.executeWithRetry(() => this.freeBusy(params));\n break;\n case 'watch':\n data = await this.executeWithRetry(() => this.watch(params));\n break;\n case 'stopWatch':\n data = await this.executeWithRetry(() => this.stopWatch(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 calendarId(params: IntegrationParams): string {\n return (params.calendarId as string) || this.defaultCalendarId;\n }\n\n private toEventTime(value: string): calendar_v3.Schema$EventDateTime {\n return value.length === 10 ? { date: value } : { dateTime: value };\n }\n\n private fromEventTime(time: calendar_v3.Schema$EventDateTime | undefined): string {\n return time?.dateTime ?? time?.date ?? '';\n }\n\n private async listEvents(params: IntegrationParams) {\n const { timeMin, timeMax, syncToken, maxResults } = params;\n const response = await this.client.events.list({\n calendarId: this.calendarId(params),\n // Incremental sync: a syncToken supersedes the window params (the API\n // rejects combining them).\n ...(syncToken\n ? { syncToken: syncToken as string }\n : {\n timeMin: (timeMin as string) || undefined,\n timeMax: (timeMax as string) || undefined,\n singleEvents: true,\n orderBy: 'startTime' as const,\n }),\n maxResults: (maxResults as number) || 250,\n });\n const items = response.data.items ?? [];\n return {\n events: items.map((event) => ({\n id: event.id ?? '',\n summary: event.summary ?? '',\n description: event.description ?? '',\n location: event.location ?? '',\n start: this.fromEventTime(event.start ?? undefined),\n end: this.fromEventTime(event.end ?? undefined),\n status: event.status ?? '',\n updated: event.updated ?? '',\n })),\n nextSyncToken: response.data.nextSyncToken ?? null,\n };\n }\n\n private resolveEnd(start: string, end: string | undefined, durationMinutes: number | undefined): string {\n if (end) return end;\n if (start.length === 10) {\n // All-day start with no end → the exclusive-end convention: next day.\n const next = new Date(Date.parse(start) + 24 * 60 * 60_000);\n return next.toISOString().slice(0, 10);\n }\n if (durationMinutes && durationMinutes > 0) {\n return new Date(Date.parse(start) + durationMinutes * 60_000).toISOString();\n }\n throw new Error('createEvent requires `end` or a positive `durationMinutes`');\n }\n\n private async createEvent(params: IntegrationParams) {\n const { summary, description, location, start, end, durationMinutes } = params;\n const response = await this.client.events.insert({\n calendarId: this.calendarId(params),\n requestBody: {\n summary: summary as string,\n description: (description as string) || undefined,\n location: (location as string) || undefined,\n start: this.toEventTime(start as string),\n end: this.toEventTime(\n this.resolveEnd(start as string, (end as string) || undefined, (durationMinutes as number) || undefined),\n ),\n },\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n htmlLink: response.data.htmlLink ?? '',\n };\n }\n\n private async updateEvent(params: IntegrationParams) {\n const { eventId, summary, description, location, start, end } = params;\n const requestBody: calendar_v3.Schema$Event = {};\n if (typeof summary === 'string') requestBody.summary = summary;\n if (typeof description === 'string') requestBody.description = description;\n if (typeof location === 'string') requestBody.location = location;\n if (typeof start === 'string' && start) requestBody.start = this.toEventTime(start);\n if (typeof end === 'string' && end) requestBody.end = this.toEventTime(end);\n const response = await this.client.events.patch({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n requestBody,\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n };\n }\n\n private async deleteEvent(params: IntegrationParams) {\n const { eventId } = params;\n await this.client.events.delete({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n });\n return { id: eventId as string, deleted: true };\n }\n\n private async freeBusy(params: IntegrationParams) {\n const { timeMin, timeMax } = params;\n const id = this.calendarId(params);\n const response = await this.client.freebusy.query({\n requestBody: {\n timeMin: timeMin as string,\n timeMax: timeMax as string,\n items: [{ id }],\n },\n });\n const busy = response.data.calendars?.[id]?.busy ?? [];\n return {\n busy: busy.map((slot) => ({ start: slot.start ?? '', end: slot.end ?? '' })),\n };\n }\n\n private async watch(params: IntegrationParams) {\n const { channelId, address, ttlSeconds } = params;\n const response = await this.client.events.watch({\n calendarId: this.calendarId(params),\n requestBody: {\n id: channelId as string,\n type: 'web_hook',\n address: address as string,\n params: ttlSeconds ? { ttl: String(ttlSeconds) } : undefined,\n },\n });\n return {\n channelId: response.data.id ?? (channelId as string),\n resourceId: response.data.resourceId ?? '',\n expiration: response.data.expiration ?? '',\n };\n }\n\n private async stopWatch(params: IntegrationParams) {\n const { channelId, resourceId } = params;\n await this.client.channels.stop({\n requestBody: {\n id: channelId as string,\n resourceId: resourceId as string,\n },\n });\n return { stopped: true };\n }\n}\n\n// Auto-register\nregisterIntegration('calendar', CalendarIntegration);\n","/**\n * All registered inbound-hook providers, derived from the `serviceHooks`\n * declarations (the single source the registry and codegen also derive from).\n * Hosts that serve arbitrary schemas (the playground) mount this full map;\n * generated apps get a per-app subset via the compiler's hooks-providers.ts.\n *\n * `HOOK_PROVIDER_FACTORIES` is the static factory table TypeScript needs\n * (export names cannot be resolved dynamically without casts); the drift\n * guard below fails loudly if a declaration names a factory this table lacks.\n */\n\nimport type { EventPayload } from '@almadar/core';\nimport { serviceHooks, type HookDeclaration } from './contracts';\nimport { googleCalendarHookProvider } from './integrations/calendar/webhooks';\n\nexport interface HookProviderInput {\n headers: Record<string, string | undefined>;\n rawBody: string;\n}\n\nexport type HookProviderResult =\n | { event: string; payload: EventPayload }\n | { ack: true }\n | { error: string };\n\nexport type RegisteredHookProvider = (input: HookProviderInput) => HookProviderResult;\n\nconst HOOK_PROVIDER_FACTORIES: Record<string, (secret?: string) => RegisteredHookProvider> = {\n googleCalendarHookProvider,\n};\n\n/** Every hook declaration across all services — used by the drift-guard test. */\nexport function allHookDeclarations(): HookDeclaration[] {\n return Object.values(serviceHooks).flat();\n}\n\n/**\n * Build the full provider map from every service's hook declarations,\n * resolving each provider's verification secret from `env`. Throws when a\n * declaration names a factory the table above does not carry — declaration\n * and implementation must advance together.\n */\nexport function registeredHookProviders(\n env: Record<string, string | undefined> = process.env,\n): Record<string, RegisteredHookProvider> {\n const providers: Record<string, RegisteredHookProvider> = {};\n for (const decl of allHookDeclarations()) {\n const factory = HOOK_PROVIDER_FACTORIES[decl.providerExport];\n if (!factory) {\n throw new Error(\n `serviceHooks declares provider export '${decl.providerExport}' but HOOK_PROVIDER_FACTORIES has no entry for it`,\n );\n }\n providers[decl.provider] = factory(env[decl.credentialEnv]);\n }\n return providers;\n}\n","import { Readable } from 'node:stream';\nimport { google, drive_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Google Drive integration — dual auth:\n * - **Service account** (GOOGLE_DRIVE_SA_KEY, optional GOOGLE_DRIVE_SUBJECT\n * delegation) serves reads (list/get/share).\n * - **User OAuth** (GOOGLE_DRIVE_REFRESH_TOKEN + the app's OAUTH_CLIENT_ID/\n * SECRET, obtained once via `scripts/drive-consent.mjs`) serves\n * WRITES (`uploadFile`/`createFolder`) when present — Google enforces zero\n * SA storage quota on personal accounts, so SA writes into a shared My\n * Drive folder are impossible; the user client also covers reads when no\n * SA key is configured. `GOOGLE_DRIVE_FOLDER_ID` is the default upload\n * parent. File content crosses this boundary as base64 (data URL accepted\n * on upload).\n */\nexport class DriveIntegration extends BaseIntegration {\n private readonly saClient: drive_v3.Drive | null;\n private readonly userClient: drive_v3.Drive | null;\n private readonly defaultFolderId: string | undefined;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_DRIVE_SA_KEY;\n if (rawKey) {\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n const subject = config.env.GOOGLE_DRIVE_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/drive'],\n subject,\n });\n this.saClient = google.drive({ version: 'v3', auth });\n } else {\n this.saClient = null;\n }\n\n const refreshToken = config.env.GOOGLE_DRIVE_REFRESH_TOKEN;\n const clientId = config.env.OAUTH_CLIENT_ID;\n const clientSecret = config.env.OAUTH_CLIENT_SECRET;\n if (refreshToken && clientId && clientSecret) {\n const oauth2 = new google.auth.OAuth2(clientId, clientSecret);\n oauth2.setCredentials({ refresh_token: refreshToken });\n this.userClient = google.drive({ version: 'v3', auth: oauth2 });\n } else {\n this.userClient = null;\n }\n\n if (!this.saClient && !this.userClient) {\n throw new Error(\n 'Drive not configured — set GOOGLE_DRIVE_SA_KEY (reads) and/or GOOGLE_DRIVE_REFRESH_TOKEN + OAUTH_CLIENT_ID/SECRET (writes)',\n );\n }\n\n this.defaultFolderId = config.env.GOOGLE_DRIVE_FOLDER_ID || undefined;\n\n this.logger.info('Drive integration initialized', {\n serviceAccount: this.saClient !== null,\n userToken: this.userClient !== null,\n delegated: Boolean(config.env.GOOGLE_DRIVE_SUBJECT),\n });\n }\n\n /** Reads prefer the SA client (delegation-aware); user client covers its absence. */\n private readClient(): drive_v3.Drive {\n const client = this.saClient ?? this.userClient;\n if (!client) throw new Error('Drive not configured');\n return client;\n }\n\n /** Writes REQUIRE the user client on personal accounts (SA has no storage quota); SA only as a Workspace fallback. */\n private writeClient(): drive_v3.Drive {\n const client = this.userClient ?? this.saClient;\n if (!client) throw new Error('Drive not configured');\n return client;\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 'listFiles':\n data = await this.executeWithRetry(() => this.listFiles(params));\n break;\n case 'getFile':\n data = await this.executeWithRetry(() => this.getFile(params));\n break;\n case 'uploadFile':\n data = await this.executeWithRetry(() => this.uploadFile(params));\n break;\n case 'createFolder':\n data = await this.executeWithRetry(() => this.createFolder(params));\n break;\n case 'shareFile':\n data = await this.executeWithRetry(() => this.shareFile(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 listFiles(params: IntegrationParams) {\n const { folderId, query, maxResults } = params;\n const clauses = ['trashed = false'];\n if (folderId) clauses.push(`'${String(folderId).replace(/'/g, \"\\\\'\")}' in parents`);\n if (query) clauses.push(String(query));\n const response = await this.readClient().files.list({\n q: clauses.join(' and '),\n pageSize: (maxResults as number) || 100,\n fields: 'files(id, name, mimeType, size, modifiedTime, webViewLink)',\n });\n return {\n files: (response.data.files ?? []).map((file) => ({\n id: file.id ?? '',\n name: file.name ?? '',\n mimeType: file.mimeType ?? '',\n size: Number(file.size ?? 0),\n modifiedTime: file.modifiedTime ?? '',\n webViewLink: file.webViewLink ?? '',\n })),\n };\n }\n\n private async getFile(params: IntegrationParams) {\n const fileId = params.fileId as string;\n const meta = await this.readClient().files.get({\n fileId,\n fields: 'id, name, mimeType, size',\n });\n const content = await this.readClient().files.get(\n { fileId, alt: 'media' },\n { responseType: 'arraybuffer' },\n );\n const bytes = Buffer.from(content.data as ArrayBuffer);\n return {\n id: meta.data.id ?? fileId,\n name: meta.data.name ?? '',\n mimeType: meta.data.mimeType ?? 'application/octet-stream',\n content: bytes.toString('base64'),\n size: bytes.length,\n };\n }\n\n private async uploadFile(params: IntegrationParams) {\n const { name, content, mimeType, folderId } = params;\n const { bytes, contentType } = decodeContent(content as string);\n const parent = (folderId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n parents: parent ? [parent] : undefined,\n },\n media: {\n mimeType: (mimeType as string) || contentType || 'application/octet-stream',\n body: Readable.from(bytes),\n },\n fields: 'id, name, webViewLink',\n });\n return {\n id: response.data.id ?? '',\n name: response.data.name ?? (name as string),\n webViewLink: response.data.webViewLink ?? '',\n };\n }\n\n private async createFolder(params: IntegrationParams) {\n const { name, parentId } = params;\n const parent = (parentId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n mimeType: 'application/vnd.google-apps.folder',\n parents: parent ? [parent] : undefined,\n },\n fields: 'id, name',\n });\n return { id: response.data.id ?? '', name: response.data.name ?? (name as string) };\n }\n\n private async shareFile(params: IntegrationParams) {\n const { fileId, email, role } = params;\n const response = await this.readClient().permissions.create({\n fileId: fileId as string,\n requestBody: {\n type: 'user',\n role: (role as string) || 'reader',\n emailAddress: email as string,\n },\n fields: 'id',\n });\n return { shared: true, permissionId: response.data.id ?? '' };\n }\n}\n\n// Auto-register\nregisterIntegration('drive', DriveIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GRAPH_BASE = 'https://graph.facebook.com/v21.0';\n\n/**\n * Meta Ads integration — Graph API Marketing Insights, READ-ONLY (spend and\n * campaign listings for profitability reporting). No SDK: plain fetch with\n * the webhook integration's 5xx-retries / 4xx-returns split.\n */\nexport class MetaAdsIntegration extends BaseIntegration {\n private accessToken: string;\n private defaultAccountId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.accessToken = config.env.META_ACCESS_TOKEN || '';\n if (!this.accessToken) {\n throw new Error('META_ACCESS_TOKEN not configured');\n }\n this.defaultAccountId = config.env.META_AD_ACCOUNT_ID || '';\n\n this.logger.info('Meta Ads integration initialized');\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 'getSpend':\n data = await this.executeWithRetry(() => this.getSpend(params));\n break;\n case 'listCampaigns':\n data = await this.executeWithRetry(() => this.listCampaigns(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 accountId(params: IntegrationParams): string {\n const id = (params.accountId as string) || this.defaultAccountId;\n if (!id) {\n throw new Error('No ad account: pass `accountId` or set META_AD_ACCOUNT_ID');\n }\n return id.startsWith('act_') ? id : `act_${id}`;\n }\n\n private async graphGet(path: string, query: Record<string, string>): Promise<unknown> {\n const url = new URL(`${GRAPH_BASE}/${path}`);\n for (const [key, value] of Object.entries(query)) {\n url.searchParams.set(key, value);\n }\n url.searchParams.set('access_token', this.accessToken);\n const response = await fetch(url, { signal: AbortSignal.timeout(15000) });\n if (response.status >= 500) {\n // 5xx retries via executeWithRetry; 4xx is a caller/token error.\n throw new Error(`Meta Graph API returned ${response.status}`);\n }\n const body = (await response.json()) as { error?: { message?: string }; data?: unknown };\n if (!response.ok) {\n throw new Error(`Meta Graph API error: ${body.error?.message ?? response.status}`);\n }\n return body.data ?? body;\n }\n\n private async getSpend(params: IntegrationParams) {\n const { since, until } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/insights`, {\n fields: 'spend,impressions,clicks,account_currency',\n time_range: JSON.stringify({ since: since as string, until: until as string }),\n level: 'account',\n })) as Array<{ spend?: string; impressions?: string; clicks?: string; account_currency?: string }>;\n const row = Array.isArray(rows) ? rows[0] : undefined;\n return {\n spend: Number(row?.spend ?? 0),\n currency: row?.account_currency ?? '',\n impressions: Number(row?.impressions ?? 0),\n clicks: Number(row?.clicks ?? 0),\n };\n }\n\n private async listCampaigns(params: IntegrationParams) {\n const { status } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/campaigns`, {\n fields: 'id,name,status,daily_budget',\n ...(status ? { effective_status: JSON.stringify([status]) } : {}),\n })) as Array<{ id?: string; name?: string; status?: string; daily_budget?: string }>;\n return {\n campaigns: (Array.isArray(rows) ? rows : []).map((row) => ({\n id: row.id ?? '',\n name: row.name ?? '',\n status: row.status ?? '',\n // Meta reports budgets in minor units (cents).\n dailyBudget: Number(row.daily_budget ?? 0) / 100,\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('metaAds', MetaAdsIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Accounting export integration — the generic half of \"export to accounting\n * software\": shapes invoice / journal rows into import-ready CSV without\n * committing to a vendor. A `provider` field is reserved on the config for\n * direct DATEV/Xero/QuickBooks connectors later; the CSV column sets follow\n * the common import templates those systems accept.\n */\nexport class AccountingIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Accounting integration initialized (generic CSV export)');\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 'exportInvoices':\n data = this.exportRows(params.invoices, INVOICE_COLUMNS, 'invoices');\n break;\n case 'exportJournal':\n data = this.exportRows(params.entries, JOURNAL_COLUMNS, 'journal');\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 exportRows(\n rowsValue: IntegrationParamValue | undefined,\n columns: readonly string[],\n kind: string,\n ): { content: string; filename: string; count: number } {\n if (!Array.isArray(rowsValue)) {\n throw new Error(`${kind} export requires an array of rows`);\n }\n const lines = [columns.join(',')];\n for (const row of rowsValue) {\n if (row === null || typeof row !== 'object' || Array.isArray(row) || row instanceof Date) {\n throw new Error(`${kind} export: every row must be an object`);\n }\n const record = row as { readonly [key: string]: IntegrationParamValue };\n lines.push(columns.map((column) => csvCell(record[column])).join(','));\n }\n const stamp = new Date().toISOString().slice(0, 10);\n return {\n content: lines.join('\\r\\n') + '\\r\\n',\n filename: `${kind}-export-${stamp}.csv`,\n count: rowsValue.length,\n };\n }\n}\n\nconst INVOICE_COLUMNS = ['id', 'number', 'customer', 'issuedAt', 'dueAt', 'currency', 'net', 'tax', 'gross', 'status'] as const;\nconst JOURNAL_COLUMNS = ['date', 'account', 'description', 'debit', 'credit', 'reference'] as const;\n\nfunction csvCell(value: IntegrationParamValue | undefined): string {\n if (value === undefined || value === null) return '';\n const raw = value instanceof Date ? value.toISOString() : String(value);\n return /[\",\\r\\n]/.test(raw) ? `\"${raw.replace(/\"/g, '\"\"')}\"` : raw;\n}\n\n// Auto-register\nregisterIntegration('accounting', AccountingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GC_BASE = 'https://bankaccountdata.gocardless.com/api/v2';\n\n/**\n * Banking integration — GoCardless Bank Account Data (read-only requisition →\n * accounts → transactions flow feeding reconciliation). Access tokens are\n * minted per instance from the secret pair and refreshed on expiry.\n */\nexport class BankingIntegration extends BaseIntegration {\n private secretId: string;\n private secretKey: string;\n private accessToken: string | null = null;\n private accessTokenExpiresAt = 0;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.secretId = config.env.GOCARDLESS_SECRET_ID || '';\n this.secretKey = config.env.GOCARDLESS_SECRET_KEY || '';\n if (!this.secretId || !this.secretKey) {\n throw new Error('GOCARDLESS_SECRET_ID / GOCARDLESS_SECRET_KEY not configured');\n }\n\n this.logger.info('Banking integration initialized (GoCardless Bank Account Data)');\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 'createRequisition':\n data = await this.executeWithRetry(() => this.createRequisition(params));\n break;\n case 'listAccounts':\n data = await this.executeWithRetry(() => this.listAccounts(params));\n break;\n case 'listTransactions':\n data = await this.executeWithRetry(() => this.listTransactions(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 token(): Promise<string> {\n if (this.accessToken && Date.now() < this.accessTokenExpiresAt - 60_000) {\n return this.accessToken;\n }\n const response = await fetch(`${GC_BASE}/token/new/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ secret_id: this.secretId, secret_key: this.secretKey }),\n signal: AbortSignal.timeout(15000),\n });\n if (!response.ok) {\n throw new Error(`GoCardless token request failed: ${response.status}`);\n }\n const body = (await response.json()) as { access: string; access_expires: number };\n this.accessToken = body.access;\n this.accessTokenExpiresAt = Date.now() + body.access_expires * 1000;\n return this.accessToken;\n }\n\n private async gcRequest(path: string, init?: { method?: string; body?: unknown }): Promise<unknown> {\n const response = await fetch(`${GC_BASE}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${await this.token()}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(20000),\n });\n if (response.status >= 500) {\n throw new Error(`GoCardless returned ${response.status}`);\n }\n const body: unknown = await response.json();\n if (!response.ok) {\n throw new Error(`GoCardless error ${response.status}: ${JSON.stringify(body).slice(0, 300)}`);\n }\n return body;\n }\n\n private async createRequisition(params: IntegrationParams) {\n const { institutionId, redirectUrl, reference } = params;\n const body = (await this.gcRequest('/requisitions/', {\n method: 'POST',\n body: {\n institution_id: institutionId as string,\n redirect: redirectUrl as string,\n reference: (reference as string) || undefined,\n },\n })) as { id?: string; link?: string };\n return { requisitionId: body.id ?? '', link: body.link ?? '' };\n }\n\n private async listAccounts(params: IntegrationParams) {\n const { requisitionId } = params;\n const body = (await this.gcRequest(`/requisitions/${requisitionId as string}/`)) as { accounts?: string[] };\n return { accounts: body.accounts ?? [] };\n }\n\n private async listTransactions(params: IntegrationParams) {\n const { accountId, dateFrom, dateTo } = params;\n const query = new URLSearchParams();\n if (dateFrom) query.set('date_from', dateFrom as string);\n if (dateTo) query.set('date_to', dateTo as string);\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n const body = (await this.gcRequest(`/accounts/${accountId as string}/transactions/${suffix}`)) as {\n transactions?: {\n booked?: Array<{\n transactionId?: string;\n internalTransactionId?: string;\n transactionAmount?: { amount?: string; currency?: string };\n bookingDate?: string;\n remittanceInformationUnstructured?: string;\n creditorName?: string;\n debtorName?: string;\n }>;\n };\n };\n return {\n transactions: (body.transactions?.booked ?? []).map((tx) => ({\n id: tx.transactionId ?? tx.internalTransactionId ?? '',\n amount: Number(tx.transactionAmount?.amount ?? 0),\n currency: tx.transactionAmount?.currency ?? '',\n date: tx.bookingDate ?? '',\n description: tx.remittanceInformationUnstructured ?? '',\n counterparty: tx.creditorName ?? tx.debtorName ?? '',\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('banking', BankingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * E-signature integration — DocuSign eSignature REST first, deliberately\n * provider-pluggable: the action surface (sendEnvelope / getEnvelopeStatus /\n * downloadDocument) is vendor-neutral and every DocuSign shape stays inside\n * this module. `DOCUSIGN_BASE_URL` carries the account-scoped REST base;\n * `DOCUSIGN_ACCESS_TOKEN` the OAuth token (JWT-grant rotation is the\n * deployment's concern — the token is read per call so a rotated env value\n * takes effect without restart).\n */\nexport class EsignIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n\n if (!config.env.DOCUSIGN_BASE_URL || !config.env.DOCUSIGN_ACCESS_TOKEN) {\n throw new Error('DOCUSIGN_BASE_URL / DOCUSIGN_ACCESS_TOKEN not configured');\n }\n\n this.logger.info('E-sign integration initialized (DocuSign)');\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 'sendEnvelope':\n data = await this.executeWithRetry(() => this.sendEnvelope(params));\n break;\n case 'getEnvelopeStatus':\n data = await this.executeWithRetry(() => this.getEnvelopeStatus(params));\n break;\n case 'downloadDocument':\n data = await this.executeWithRetry(() => this.downloadDocument(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 dsRequest(\n path: string,\n init?: { method?: string; body?: unknown; raw?: boolean },\n ): Promise<unknown> {\n const base = this.config.env.DOCUSIGN_BASE_URL.replace(/\\/$/, '');\n const response = await fetch(`${base}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: init?.raw ? 'application/pdf' : 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.env.DOCUSIGN_ACCESS_TOKEN}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(30000),\n });\n if (response.status >= 500) {\n throw new Error(`DocuSign returned ${response.status}`);\n }\n if (!response.ok) {\n const detail = await response.text();\n throw new Error(`DocuSign error ${response.status}: ${detail.slice(0, 300)}`);\n }\n if (init?.raw) {\n return Buffer.from(await response.arrayBuffer());\n }\n return response.json();\n }\n\n private async sendEnvelope(params: IntegrationParams) {\n const { recipientEmail, recipientName, documentName, documentContent, emailSubject } = params;\n const rawContent = documentContent as string;\n // Accept a data URL or raw base64.\n const base64 = rawContent.startsWith('data:') ? rawContent.slice(rawContent.indexOf(',') + 1) : rawContent;\n const body = (await this.dsRequest('/envelopes', {\n method: 'POST',\n body: {\n emailSubject: (emailSubject as string) || `Please sign: ${documentName as string}`,\n status: 'sent',\n documents: [\n {\n documentBase64: base64,\n name: documentName as string,\n fileExtension: String(documentName).split('.').pop() || 'pdf',\n documentId: '1',\n },\n ],\n recipients: {\n signers: [\n {\n email: recipientEmail as string,\n name: recipientName as string,\n recipientId: '1',\n routingOrder: '1',\n },\n ],\n },\n },\n })) as { envelopeId?: string; status?: string };\n return { envelopeId: body.envelopeId ?? '', status: body.status ?? 'sent' };\n }\n\n private async getEnvelopeStatus(params: IntegrationParams) {\n const { envelopeId } = params;\n const body = (await this.dsRequest(`/envelopes/${envelopeId as string}`)) as {\n status?: string;\n completedDateTime?: string;\n };\n return { status: body.status ?? '', completedAt: body.completedDateTime ?? '' };\n }\n\n private async downloadDocument(params: IntegrationParams) {\n const { envelopeId } = params;\n const bytes = (await this.dsRequest(`/envelopes/${envelopeId as string}/documents/combined`, {\n raw: true,\n })) as Buffer;\n return { content: bytes.toString('base64'), documentName: `envelope-${envelopeId as string}.pdf` };\n }\n}\n\n// Auto-register\nregisterIntegration('esign', EsignIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport {\n LLMClient,\n EmbeddingClient,\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 5 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 * - embed: Generate embeddings for an array of texts\n */\nexport class LLMIntegration extends BaseIntegration {\n private client: LLMClient | null = null;\n private embeddings: EmbeddingClient | 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 /**\n * Lazily create the embeddings client. Embeddings route through a dedicated\n * embedding model (default OpenRouter `baai/bge-base-en-v1.5`, matching\n * `@almadar/curation-core`), independent of the chat provider/key, because\n * most chat providers do not expose an embeddings endpoint. Override via\n * `EMBEDDING_PROVIDER` / `EMBEDDING_MODEL` / `EMBEDDING_API_KEY`.\n */\n private getEmbeddings(): EmbeddingClient {\n if (!this.embeddings) {\n this.embeddings = new EmbeddingClient({\n provider: (this.config.env.EMBEDDING_PROVIDER as 'openai' | 'openrouter') ?? 'openrouter',\n model: this.config.env.EMBEDDING_MODEL ?? 'baai/bge-base-en-v1.5',\n apiKey: this.config.env.EMBEDDING_API_KEY,\n });\n }\n return this.embeddings;\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 case 'embed':\n data = await this.executeWithRetry(() => this.embed(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 private async embed(params: IntegrationParams) {\n const { texts } = params as { texts: string[] };\n\n if (!Array.isArray(texts)) {\n throw new Error('llm.embed: `texts` must be an array of strings');\n }\n\n this.logger.debug('Embedding texts', { count: texts.length });\n\n const batch = await this.getEmbeddings().embedBatch(texts);\n return { embeddings: batch.embeddings };\n }\n}\n\n// Auto-register\nregisterIntegration('llm', LLMIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { IntegrationError } from '../../types';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type { ServiceParams, ServiceParamsValue } from '@almadar/core';\n\n/**\n * ML integration — model inference via a deployed serving orbital.\n *\n * The serving orbital is a separate compiled app (Python/PyTorch) with no\n * dedicated inference route; it is reached through the generic per-trait\n * event endpoint every compiled Almadar app exposes: `POST\n * /api/<kebab-trait>/events`. This integration posts an `INFER` event and\n * reads the prediction back out of the returned `effectResults` — the\n * `emit` effect result whose `data.event` matches `INFERRED_EVENT`.\n *\n * Provides 1 action:\n * - infer: Run inference against a deployed model checkpoint\n */\n\n/** Success/failure event names the serving orbital's `INFER` transition emits — mirrors `std-ml-infer`'s own emit vocabulary. */\nconst INFERRED_EVENT = 'INFERRED';\nconst INFER_FAILED_EVENT = 'INFER_FAILED';\n\nconst DEFAULT_TIMEOUT_MS = 60_000; // masar scales to zero — cold starts run long.\n\ninterface MLEffectResult {\n effect: string;\n action?: string;\n entityType?: string;\n data?: ServiceParamsValue;\n success: boolean;\n error?: string;\n}\n\ninterface MLEventsResponse {\n success: boolean;\n newState?: string;\n data?: Record<string, ServiceParamsValue>;\n effectResults?: MLEffectResult[];\n error?: string;\n}\n\ninterface InferResult {\n output: ServiceParamsValue;\n confidence: number;\n violations: readonly ServiceParamsValue[];\n}\n\nfunction isServiceParams(value: ServiceParamsValue | undefined): value is ServiceParams {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n/**\n * Find the `INFERRED` emit result in the serving orbital's `effectResults`\n * and pull `{ output, confidence, violations }` out of its payload. Returns\n * `null` on any shape mismatch — the caller turns that into a typed failure,\n * never a fabricated result.\n */\nfunction extractInferResult(response: MLEventsResponse): InferResult | null {\n const emitted = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && result.success && isServiceParams(result.data) && result.data.event === INFERRED_EVENT,\n );\n if (!emitted || !isServiceParams(emitted.data)) {\n return null;\n }\n\n const payload = emitted.data.payload;\n if (!isServiceParams(payload)) {\n return null;\n }\n\n if (!('output' in payload) || typeof payload.confidence !== 'number' || !Array.isArray(payload.violations)) {\n return null;\n }\n\n return {\n output: payload.output,\n confidence: payload.confidence,\n violations: payload.violations,\n };\n}\n\nexport class MLIntegration extends BaseIntegration {\n private readonly eventsUrl: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const baseUrl = config.env.MASAR_URL;\n const traitPrefix = config.env.MASAR_ML_TRAIT;\n if (!baseUrl || !traitPrefix) {\n throw new Error(\n 'ML integration requires MASAR_URL (serving orbital host) and MASAR_ML_TRAIT (kebab-case trait name of its /events route) to be configured',\n );\n }\n\n this.eventsUrl = `${baseUrl.replace(/\\/+$/, '')}/api/${traitPrefix}/events`;\n this.timeoutMs = config.env.MASAR_ML_TIMEOUT_MS ? Number(config.env.MASAR_ML_TIMEOUT_MS) : DEFAULT_TIMEOUT_MS;\n\n this.logger.info('ML integration initialized', { eventsUrl: this.eventsUrl });\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 'infer':\n data = await this.executeWithRetry(() => this.infer(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 infer(params: IntegrationParams): Promise<InferResult> {\n const { model, input } = params as { model: string; input: ServiceParamsValue };\n\n this.logger.debug('Running ML inference', { model });\n\n const response = await this.postEvent(model, input);\n\n if (!response.success) {\n throw new IntegrationError(\n `ML service reported failure: ${response.error ?? 'unknown error'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const failed = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && isServiceParams(result.data) && result.data.event === INFER_FAILED_EVENT,\n );\n if (failed) {\n throw new IntegrationError(\n `ML service could not infer: ${failed.error ?? 'model unavailable'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const inferred = extractInferResult(response);\n if (!inferred) {\n throw new IntegrationError(\n 'ML service response did not include a valid inference result',\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n return inferred;\n }\n\n private async postEvent(model: string, input: ServiceParamsValue): Promise<MLEventsResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let httpResponse: Response;\n try {\n httpResponse = await fetch(this.eventsUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ event: 'INFER', payload: { model, input } }),\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new IntegrationError(\n `ML service request timed out after ${this.timeoutMs}ms (model may be cold-starting)`,\n 'TIMEOUT_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n }\n throw new IntegrationError(\n `ML service request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n } finally {\n clearTimeout(timer);\n }\n\n if (!httpResponse.ok) {\n const body = await httpResponse.text().catch(() => '');\n throw new IntegrationError(\n `ML service responded with status ${httpResponse.status}`,\n 'SERVICE_ERROR',\n { model, status: httpResponse.status, body },\n );\n }\n\n try {\n return (await httpResponse.json()) as MLEventsResponse;\n } catch (error) {\n throw new IntegrationError(\n `ML service returned a malformed response body: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { model },\n );\n }\n }\n}\n\n// Auto-register\nregisterIntegration('ml', MLIntegration);\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 * 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 * as oidc from 'openid-client';\nimport { 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/** Default OIDC issuer per provider (Google Workspace first — W4 decision). */\nconst PROVIDER_ISSUERS: Partial<Record<OAuthProvider, string>> = {\n google: 'https://accounts.google.com',\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/** Server-held per-authorization state (never leaves the process). */\ninterface PendingAuthorization {\n provider: OAuthProvider;\n redirectUri: string;\n pkceVerifier: string;\n}\n\n/**\n * Where pending OIDC authorizations (PKCE verifier, redirect URI) live\n * between `authorize` and `token`. The in-memory default works single-\n * instance; a multi-instance deployment injects a shared-store impl (the\n * FirestoreCredentialPersistence structural pattern) via\n * `installPendingGrantStore` — no sticky routing needed once it does.\n * `take` is single-use: it returns AND removes, so a state token can never\n * be replayed. `sweep` drops expired grants.\n */\nexport interface PendingGrantStore {\n put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void>;\n take(state: string): Promise<PendingAuthorization | null>;\n sweep(): Promise<void>;\n}\n\nconst PENDING_GRANT_TTL_MS = 10 * 60 * 1000;\n\nexport class InMemoryPendingGrantStore implements PendingGrantStore {\n private readonly grants = new Map<string, { grant: PendingAuthorization; expiresAt: number }>();\n\n async put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void> {\n this.grants.set(state, { grant, expiresAt: Date.now() + ttlMs });\n }\n\n async take(state: string): Promise<PendingAuthorization | null> {\n const entry = this.grants.get(state);\n if (!entry) return null;\n this.grants.delete(state);\n return entry.expiresAt >= Date.now() ? entry.grant : null;\n }\n\n async sweep(): Promise<void> {\n const now = Date.now();\n for (const [state, entry] of this.grants) {\n if (entry.expiresAt < now) this.grants.delete(state);\n }\n }\n}\n\nlet installedPendingGrantStore: PendingGrantStore | null = null;\n\n/** Install a shared pending-grant store (multi-instance hosts); null resets to in-memory. */\nexport function installPendingGrantStore(store: PendingGrantStore | null): void {\n installedPendingGrantStore = store;\n}\n\n/**\n * OAuth2/OIDC integration.\n *\n * Two backends behind one contract:\n * - **OIDC (production)** — `openid-client` against a discovered issuer\n * (default Google; override via `OIDC_ISSUER_URL`), authorization-code +\n * PKCE, real token exchange / refresh / revocation / userinfo. Selected\n * whenever `OAUTH_CLIENT_ID` + `OAUTH_CLIENT_SECRET` are configured and\n * `OAUTH_MODE` is not `mock`.\n * - **Mock (dev/tests)** — the original in-memory backend, kept verbatim\n * behind `OAUTH_MODE=mock` (or absent client credentials) so existing\n * tests and offline dev flows are untouched.\n *\n * Pending-authorization state (PKCE verifier, redirect URI) lives in a\n * `PendingGrantStore` — in-memory by default (single instance), injectable\n * via `installPendingGrantStore` for multi-instance deployments (a shared\n * store replaces the old sticky-routing requirement). Grants are TTL-bound\n * and single-use.\n */\nexport class OAuthIntegration extends BaseIntegration {\n /** Maps state token -> provider for pending MOCK authorization flows */\n private states: Map<string, OAuthProvider> = new Map();\n\n /** Maps access token -> token set (mock backend) */\n private tokens: Map<string, TokenSet> = new Map();\n\n /** Maps refresh token -> access token for refresh lookups (mock backend) */\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 /** Pending OIDC authorizations (real backend) — injectable, in-memory default. */\n private readonly fallbackPending = new InMemoryPendingGrantStore();\n\n private pendingStore(): PendingGrantStore {\n return installedPendingGrantStore ?? this.fallbackPending;\n }\n\n /** Maps access token -> ID-token subject, for userinfo subject checks */\n private subjects: Map<string, string> = new Map();\n\n /** Discovered issuer configurations, keyed by issuer URL */\n private discovered: Map<string, oidc.Configuration> = new Map();\n\n private readonly real: boolean;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.real =\n config.env.OAUTH_MODE !== 'mock' &&\n Boolean(config.env.OAUTH_CLIENT_ID) &&\n Boolean(config.env.OAUTH_CLIENT_SECRET);\n this.logger.info(\n this.real\n ? 'OAuth integration initialized (OIDC backend via openid-client)'\n : 'OAuth integration initialized (mock backend)',\n );\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.real ? this.oidcAuthorize(params) : this.authorize(params)));\n break;\n case 'token':\n data = await this.executeWithRetry(() => (this.real ? this.oidcToken(params) : this.token(params)));\n break;\n case 'refresh':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRefresh(params) : this.refresh(params)));\n break;\n case 'revoke':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRevoke(params) : this.revoke(params)));\n break;\n case 'userinfo':\n data = await this.executeWithRetry(() => (this.real ? this.oidcUserinfo(params) : 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 // OIDC backend (openid-client)\n // ---------------------------------------------------------------------------\n\n private issuerFor(provider: OAuthProvider): string {\n const configured = this.config.env.OIDC_ISSUER_URL;\n if (configured) return configured;\n const issuer = PROVIDER_ISSUERS[provider];\n if (!issuer) {\n throw new Error(\n `Provider \"${provider}\" has no OIDC issuer — set OIDC_ISSUER_URL to an OIDC-compliant issuer, or use OAUTH_MODE=mock`,\n );\n }\n return issuer;\n }\n\n private async configurationFor(provider: OAuthProvider): Promise<oidc.Configuration> {\n const issuer = this.issuerFor(provider);\n const cached = this.discovered.get(issuer);\n if (cached) return cached;\n const configuration = await oidc.discovery(\n new URL(issuer),\n this.config.env.OAUTH_CLIENT_ID,\n this.config.env.OAUTH_CLIENT_SECRET,\n );\n this.discovered.set(issuer, configuration);\n return configuration;\n }\n\n private async oidcAuthorize(\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) || this.config.env.OAUTH_REDIRECT_URI;\n\n const configuration = await this.configurationFor(provider);\n const state = oidc.randomState();\n const pkceVerifier = oidc.randomPKCECodeVerifier();\n const codeChallenge = await oidc.calculatePKCECodeChallenge(pkceVerifier);\n\n const parameters: Record<string, string> = {\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n };\n // Google issues a refresh token only for offline-consented requests.\n if (provider === 'google') {\n parameters.access_type = 'offline';\n parameters.prompt = 'consent';\n }\n\n const authUrl = oidc.buildAuthorizationUrl(configuration, parameters);\n await this.pendingStore().put(state, { provider, redirectUri, pkceVerifier }, PENDING_GRANT_TTL_MS);\n void this.pendingStore().sweep();\n return { authUrl: authUrl.toString(), state };\n }\n\n private async oidcToken(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' }> {\n const code = params.code as string;\n const state = params.state as string;\n\n const pendingAuth = await this.pendingStore().take(state);\n if (!pendingAuth) {\n throw new Error(`Invalid or expired state token: ${state}`);\n }\n\n const configuration = await this.configurationFor(pendingAuth.provider);\n const callbackUrl = new URL(pendingAuth.redirectUri);\n callbackUrl.searchParams.set('code', code);\n callbackUrl.searchParams.set('state', state);\n\n const tokens = await oidc.authorizationCodeGrant(configuration, callbackUrl, {\n expectedState: state,\n pkceCodeVerifier: pendingAuth.pkceVerifier,\n });\n\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? '',\n expiresIn: tokens.expires_in ?? 3600,\n tokenType: 'bearer',\n };\n }\n\n private async oidcRefresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n const configuration = await this.configurationFor('google');\n\n const tokens = await oidc.refreshTokenGrant(configuration, refreshToken);\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n return {\n accessToken: tokens.access_token,\n expiresIn: tokens.expires_in ?? 3600,\n };\n }\n\n private async oidcRevoke(params: IntegrationParams): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n const configuration = await this.configurationFor('google');\n await oidc.tokenRevocation(configuration, token);\n this.subjects.delete(token);\n return { revoked: true };\n }\n\n private async oidcUserinfo(params: IntegrationParams): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n const configuration = await this.configurationFor('google');\n const subject = this.subjects.get(accessToken);\n const info = await oidc.fetchUserInfo(\n configuration,\n accessToken,\n subject ?? oidc.skipSubjectCheck,\n );\n return {\n sub: info.sub,\n email: typeof info.email === 'string' ? info.email : '',\n name: typeof info.name === 'string' ? info.name : '',\n picture: typeof info.picture === 'string' ? info.picture : '',\n };\n }\n\n // ---------------------------------------------------------------------------\n // Mock backend 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 // Mock backend 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 { IntegrationError, type IntegrationConfig, type IntegrationResult, type IntegrationParams } from '../../types';\nimport type { IntegrationCallContext } from '../../factory';\nimport { registerIntegration } from '../../registry';\nimport {\n getActiveFactory,\n getInstalledCredentialStore,\n resolveCredentialRef,\n} from '../../credentials';\nimport { serviceCredentials, serviceProbes, type IntegrationName } from '../../contracts';\n\n/** Env-var name shape accepted for the `database` connectionRef exception. */\nconst ENV_VAR_NAME = /^[A-Z][A-Z0-9_]*$/;\n\n/** Write/probe actions require an admin-role caller; `list` stays open (masked last-4 only). */\nconst ROLE_GATED_ACTIONS = new Set(['set', 'remove', 'test', 'rotate']);\n\nconst DEFAULT_ADMIN_ROLES = ['admin', 'owner'];\n\ninterface CredentialListEntry {\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n}\n\nfunction isProbeService(service: string): service is IntegrationName {\n return service in serviceProbes;\n}\n\n/**\n * The hosted credential store's service surface (W4 Tier C) — what the\n * Owner-gated Integrations settings page calls through the NORMAL\n * call-service path (server-side only; organisms own the access policy,\n * per the I-16 std-atom ACL constraint).\n *\n * Security contract: `list` returns masked entries only (last-4, never\n * plaintext); `set` accepts only env vars DECLARED in `serviceCredentials`\n * for the named service (plus well-formed connection refs for `database`),\n * so the page can never become an arbitrary env-injection surface; values\n * are never logged. `set`/`remove`/`test` additionally require the caller's\n * role (from IntegrationCallContext) to be in the admin list\n * (ALMADAR_CREDENTIAL_ADMIN_ROLES, default admin,owner) and FAIL CLOSED\n * without one — the un-bypassable twin of the organism-side page gate (I-25).\n */\nexport class CredentialsIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Credentials integration initialized (tenant credential store surface)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n if (ROLE_GATED_ACTIONS.has(action)) {\n const allowed = this.adminRoles();\n if (!context?.role || !allowed.includes(context.role)) {\n return {\n success: false,\n error: new IntegrationError(\n `forbidden: \"${action}\" requires one of roles: ${allowed.join(', ')}`,\n 'AUTH_ERROR',\n ),\n metadata: this.createMetadata(action, 0),\n };\n }\n }\n\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 'list':\n data = this.list(typeof params.service === 'string' ? params.service : undefined);\n break;\n case 'set':\n data = await this.set(params.service as string, params.envVar as string, params.value as string);\n break;\n case 'remove':\n data = await this.remove(params.service as string, params.envVar as string);\n break;\n case 'test':\n data = await this.test(params.service as string, context);\n break;\n case 'rotate': {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n data = await store.rotate();\n break;\n }\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 adminRoles(): string[] {\n const raw = this.config.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || process.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || '';\n const roles = raw.split(',').map((r) => r.trim()).filter((r) => r.length > 0);\n return roles.length > 0 ? roles : DEFAULT_ADMIN_ROLES;\n }\n\n private declaredFor(service: string): { envVar: string; required: boolean; description: string }[] {\n return serviceCredentials[service] ?? [];\n }\n\n private assertSettable(service: string, envVar: string): void {\n if (service === 'database') {\n if (!ENV_VAR_NAME.test(envVar)) {\n throw new Error(`\"${envVar}\" is not a well-formed connection reference (expected an env-var name)`);\n }\n return;\n }\n const declared = this.declaredFor(service);\n if (declared.length === 0) {\n throw new Error(`Service \"${service}\" declares no credentials`);\n }\n if (!declared.some((c) => c.envVar === envVar)) {\n const valid = declared.map((c) => c.envVar).join(', ');\n throw new Error(`\"${envVar}\" is not a declared credential of \"${service}\" (declared: ${valid})`);\n }\n }\n\n private storeFirst(): boolean {\n const flag = this.config.env['ALMADAR_CREDENTIALS_SOURCE'] || process.env['ALMADAR_CREDENTIALS_SOURCE'];\n return flag === 'store';\n }\n\n private list(serviceFilter?: string): { enabled: boolean; entries: CredentialListEntry[] } {\n const store = getInstalledCredentialStore();\n const stored = new Map((store?.entries() ?? []).map((e) => [`${e.service}\\u0000${e.envVar}`, e]));\n const entries: CredentialListEntry[] = [];\n for (const [service, declared] of Object.entries(serviceCredentials)) {\n if (serviceFilter && service !== serviceFilter) continue;\n for (const { envVar, required, description } of declared) {\n const fromStore = stored.get(`${service}\\u0000${envVar}`);\n stored.delete(`${service}\\u0000${envVar}`);\n // Store-first (I-31): declared refs resolve ONLY through the store, so\n // an env-only value reports 'none' — never a source the runtime won't use.\n const fromEnv = this.storeFirst() ? undefined : process.env[envVar];\n const source: CredentialListEntry['source'] = fromStore ? 'store' : fromEnv ? 'env' : 'none';\n entries.push({\n service,\n envVar,\n required,\n description,\n configured: source !== 'none',\n source,\n last4: fromStore ? fromStore.last4 : fromEnv ? fromEnv.slice(-4) : '',\n });\n }\n }\n // Stored rows outside the declared tables (database connection refs).\n for (const e of stored.values()) {\n if (serviceFilter && e.service !== serviceFilter) continue;\n entries.push({\n service: e.service,\n envVar: e.envVar,\n required: false,\n description: 'Stored connection reference',\n configured: true,\n source: 'store',\n last4: e.last4,\n });\n }\n return { enabled: store?.enabled ?? false, entries };\n }\n\n private async set(\n service: string,\n envVar: string,\n value: string,\n ): Promise<{ saved: boolean; service: string; envVar: string; last4: string }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host — set credentials via the environment');\n }\n this.assertSettable(service, envVar);\n const entry = await store.set(service, envVar, value);\n return { saved: true, service, envVar, last4: entry.last4 };\n }\n\n private async remove(service: string, envVar: string): Promise<{ removed: boolean }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n this.assertSettable(service, envVar);\n return { removed: await store.remove(envVar) };\n }\n\n private async test(service: string, context?: IntegrationCallContext): Promise<{\n service: string;\n configured: boolean;\n missing: string[];\n probed: boolean;\n ok: boolean;\n message: string;\n }> {\n const declared = this.declaredFor(service);\n const missing = declared\n .filter((c) => c.required && !resolveCredentialRef(c.envVar))\n .map((c) => c.envVar);\n const configured = missing.length === 0;\n if (!configured) {\n return { service, configured, missing, probed: false, ok: false, message: `Missing required credentials: ${missing.join(', ')}` };\n }\n\n const factory = getActiveFactory();\n const probe = isProbeService(service) ? serviceProbes[service] : undefined;\n if (!factory || !probe) {\n return { service, configured, missing, probed: false, ok: true, message: 'Credentials present (no live probe declared for this service)' };\n }\n if (!factory.isConfigured(service)) {\n return { service, configured, missing, probed: false, ok: false, message: 'Credentials present but the service is not configured on this host — restart or re-save a credential' };\n }\n const result = await factory.execute(service, probe.action, probe.params as IntegrationParams, context);\n if (!result.success) {\n return { service, configured, missing, probed: true, ok: false, message: result.error?.message ?? `Probe ${probe.action} failed` };\n }\n const echoed = result.data !== null && typeof result.data === 'object' && '_mock' in result.data;\n if (echoed) {\n return { service, configured, missing, probed: false, ok: false, message: 'Probe was mock-echoed — the service is not actually configured' };\n }\n return { service, configured, missing, probed: true, ok: true, message: `Probe ${probe.action} succeeded` };\n }\n}\n\n// Auto-register\nregisterIntegration('credentials', CredentialsIntegration);\n","import { createHash } from 'node:crypto';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n ListObjectsV2Command,\n type ObjectCannedACL,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl as s3GetSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } 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\ninterface UploadResult {\n key: string;\n bucket: string;\n size: number;\n etag: string;\n /** Mirror of `key` — the field the .lolo upload consumers read. */\n id: string;\n /** Public (acl: public) or signed GET address of the uploaded object. */\n url: string;\n}\n\n/** The file-form upload payload (UploadDropZone emit shape). */\ninterface UploadFilePayload {\n name: string;\n size: number;\n type: string;\n /** base64 data URL (`data:<mime>;base64,...`) or raw base64. */\n content?: string;\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toFilePayload(value: IntegrationParamValue | undefined): UploadFilePayload | null {\n if (!isParamRecord(value)) return null;\n const { name, size, type, content } = value;\n if (typeof name !== 'string') return null;\n return {\n name,\n size: typeof size === 'number' ? size : 0,\n type: typeof type === 'string' ? type : 'application/octet-stream',\n content: typeof content === 'string' ? content : undefined,\n };\n}\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Object storage integration — real S3-compatible backend (AWS S3, R2, MinIO,\n * …) when `STORAGE_ACCESS_KEY_ID`/`STORAGE_SECRET_ACCESS_KEY` are configured,\n * in-memory simulation otherwise. Production REFUSES the in-memory fallback:\n * a missing credential must fail loudly, never simulate success (D-3).\n *\n * `upload` admits two shapes: the canonical `{ key, content }` pair and the\n * file-form `{ file: { name, size, type, content }, acl?, maxSize? }` that\n * lolo authors wire from UploadDropZone. The result carries `id`/`url`\n * alongside `key` — the fields the .lolo consumers read.\n */\nexport class StorageIntegration extends BaseIntegration {\n private objects: Map<string, StoredObject> = new Map();\n private s3: S3Client | null = null;\n private defaultBucket: string;\n private publicUrlBase: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.defaultBucket = config.env.STORAGE_BUCKET || '';\n this.publicUrlBase = config.env.STORAGE_PUBLIC_URL_BASE || '';\n\n const accessKeyId = config.env.STORAGE_ACCESS_KEY_ID || '';\n const secretAccessKey = config.env.STORAGE_SECRET_ACCESS_KEY || '';\n if (accessKeyId && secretAccessKey) {\n const endpoint = config.env.STORAGE_ENDPOINT || undefined;\n this.s3 = new S3Client({\n region: config.env.STORAGE_REGION || 'us-east-1',\n endpoint,\n // Path-style is what MinIO/R2-style endpoints expect.\n forcePathStyle: Boolean(endpoint),\n credentials: { accessKeyId, secretAccessKey },\n });\n this.logger.info('Storage integration initialized (S3 backend)', {\n endpoint: endpoint ?? 'aws',\n bucket: this.defaultBucket,\n });\n } else {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'Storage credentials missing in production (STORAGE_ACCESS_KEY_ID / STORAGE_SECRET_ACCESS_KEY) — refusing the in-memory fallback. See SECRETS.md.',\n );\n }\n this.logger.warn('Storage integration initialized (in-memory backend — dev only, nothing persists)');\n }\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 private bucketOf(params: IntegrationParams): string {\n return (params.bucket as string) || this.defaultBucket;\n }\n\n private compositeKey(bucket: string, key: string): string {\n return `${bucket}/${key}`;\n }\n\n private generateEtag(bytes: Buffer): string {\n return `\"${createHash('md5').update(bytes).digest('hex')}\"`;\n }\n\n /** Resolve the upload inputs from either admitted shape. */\n private resolveUpload(params: IntegrationParams): {\n key: string;\n bytes: Buffer;\n contentType: string;\n acl: ObjectCannedACL | undefined;\n } {\n const file = toFilePayload(params.file);\n if (file) {\n const maxSize = typeof params.maxSize === 'number' ? params.maxSize : 0;\n if (maxSize > 0 && file.size > maxSize) {\n throw new Error(`Upload rejected: ${file.name} is ${file.size} bytes (max ${maxSize})`);\n }\n if (!file.content) {\n throw new Error(\n `Upload rejected: file payload for '${file.name}' carries no content — the uploader must include the base64 data URL`,\n );\n }\n const { bytes, contentType } = decodeContent(file.content);\n // Timestamped key keeps concurrent uploads of a same-named file distinct.\n const safeName = file.name.replace(/[^A-Za-z0-9._-]/g, '_');\n return {\n key: `${Date.now()}-${safeName}`,\n bytes,\n contentType: contentType ?? file.type,\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n const key = params.key as string | undefined;\n const content = params.content;\n if (!key || content === undefined || content === null) {\n throw new Error('upload requires either `file` (with content) or the `key` + `content` pair');\n }\n const raw = typeof content === 'string' ? content : JSON.stringify(content);\n const { bytes, contentType } = decodeContent(raw);\n return {\n key,\n bytes,\n contentType: (params.contentType as string) || contentType || 'application/octet-stream',\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n private publicUrl(bucket: string, key: string): string {\n if (this.publicUrlBase) {\n return `${this.publicUrlBase.replace(/\\/$/, '')}/${key}`;\n }\n const endpoint = this.config.env.STORAGE_ENDPOINT;\n if (endpoint) {\n return `${endpoint.replace(/\\/$/, '')}/${bucket}/${key}`;\n }\n const region = this.config.env.STORAGE_REGION || 'us-east-1';\n return `https://${bucket}.s3.${region}.amazonaws.com/${key}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async upload(params: IntegrationParams): Promise<UploadResult> {\n const bucket = this.bucketOf(params);\n const { key, bytes, contentType, acl } = this.resolveUpload(params);\n const etag = this.generateEtag(bytes);\n\n this.logger.debug('Storage UPLOAD', { bucket, key, contentType, size: bytes.length });\n\n if (this.s3) {\n await this.s3.send(\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n Body: bytes,\n ContentType: contentType,\n ACL: acl,\n }),\n );\n } else {\n this.objects.set(this.compositeKey(bucket, key), {\n content: bytes.toString('base64'),\n contentType,\n size: bytes.length,\n metadata: (params.metadata as IntegrationParams | undefined) ?? {},\n lastModified: Date.now(),\n etag,\n });\n }\n\n const url =\n acl === 'public-read'\n ? this.publicUrl(bucket, key)\n : (await this.signUrl(bucket, key, 'get', 3600)).url;\n\n return { key, bucket, size: bytes.length, etag, id: key, url };\n }\n\n private async download(\n params: IntegrationParams,\n ): Promise<{ content: string; contentType: string; size: number; metadata: IntegrationParams }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DOWNLOAD', { bucket, key });\n\n if (this.s3) {\n const response = await this.s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));\n const bytes = Buffer.from(await response.Body!.transformToByteArray());\n return {\n content: bytes.toString('base64'),\n contentType: response.ContentType ?? 'application/octet-stream',\n size: bytes.length,\n metadata: {},\n };\n }\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 return {\n content: String(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<{ keys: Array<{ key: string; size: number; lastModified: number }>; truncated: boolean; nextToken?: string }> {\n const bucket = this.bucketOf(params);\n const prefix = (params.prefix as string | undefined) ?? '';\n const maxKeys = (params.maxKeys as number | undefined) ?? 1000;\n const continuationToken = params.continuationToken as string | undefined;\n\n this.logger.debug('Storage LIST', { bucket, prefix, maxKeys });\n\n if (this.s3) {\n const response = await this.s3.send(\n new ListObjectsV2Command({\n Bucket: bucket,\n Prefix: prefix || undefined,\n MaxKeys: maxKeys,\n ContinuationToken: continuationToken,\n }),\n );\n return {\n keys: (response.Contents ?? []).map((entry) => ({\n key: entry.Key ?? '',\n size: entry.Size ?? 0,\n lastModified: entry.LastModified?.getTime() ?? 0,\n })),\n truncated: Boolean(response.IsTruncated),\n ...(response.IsTruncated && response.NextContinuationToken !== undefined\n ? { nextToken: response.NextContinuationToken }\n : {}),\n };\n }\n\n const bucketPrefix = `${bucket}/`;\n const fullPrefix = `${bucket}/${prefix}`;\n const results: Array<{ key: string; size: number; lastModified: number }> = [];\n for (const [compositeKey, obj] of this.objects) {\n if (!compositeKey.startsWith(fullPrefix)) continue;\n results.push({\n key: compositeKey.slice(bucketPrefix.length),\n size: obj.size,\n lastModified: obj.lastModified,\n });\n }\n results.sort((a, b) => a.key.localeCompare(b.key));\n // Dev backend: the token is a plain offset into the sorted listing.\n const offset = continuationToken !== undefined ? Number.parseInt(continuationToken, 10) || 0 : 0;\n const page = results.slice(offset, offset + maxKeys);\n const truncated = offset + maxKeys < results.length;\n return {\n keys: page,\n truncated,\n ...(truncated ? { nextToken: String(offset + maxKeys) } : {}),\n };\n }\n\n private async deleteObject(params: IntegrationParams): Promise<{ deleted: boolean }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DELETE', { bucket, key });\n\n if (this.s3) {\n await this.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));\n return { deleted: true };\n }\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 signUrl(\n bucket: string,\n key: string,\n operation: 'get' | 'put',\n expiresIn: number,\n ): Promise<{ url: string; expiresAt: number }> {\n const expiresAt = Date.now() + expiresIn * 1000;\n if (this.s3) {\n const command =\n operation === 'put'\n ? new PutObjectCommand({ Bucket: bucket, Key: key })\n : new GetObjectCommand({ Bucket: bucket, Key: key });\n const url = await s3GetSignedUrl(this.s3, command, { expiresIn });\n return { url, expiresAt };\n }\n const token = createHash('sha256').update(`${bucket}/${key}/${expiresAt}`).digest('hex').slice(0, 16);\n const url =\n `https://storage.mock.local/${bucket}/${key}` +\n `?X-Amz-Algorithm=MOCK-HMAC-SHA256&X-Amz-Expires=${expiresIn}` +\n `&X-Amz-SignedHeaders=host&X-Amz-Signature=${token}&operation=${operation}`;\n return { url, expiresAt };\n }\n\n private async getSignedUrl(params: IntegrationParams): Promise<{ url: string; expiresAt: number }> {\n const bucket = this.bucketOf(params);\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 this.logger.debug('Storage GET_SIGNED_URL', { bucket, key, expiresIn, operation });\n return this.signUrl(bucket, key, operation, expiresIn);\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","/**\n * Read-only SQL enforcement for the database integration.\n *\n * The guard accepts exactly one SELECT statement (optionally CTE-led) and\n * nothing else. Comments are stripped and string/identifier contents are\n * blanked before keyword checks, so denied keywords inside literals (e.g.\n * `WHERE note = 'delete this'`) never false-positive, and comment/quote\n * tricks cannot smuggle a second statement past the check.\n */\n\nexport interface SqlGuardResult {\n ok: boolean;\n reason?: string;\n}\n\n/**\n * Reserved words that mutate or lock wherever they appear inside a SELECT:\n * data-modifying CTE bodies (INSERT/UPDATE/DELETE/MERGE), `SELECT ... INTO`\n * DDL, and `FOR UPDATE`/`FOR SHARE` locking clauses.\n */\nconst DENIED_KEYWORDS = new Set(['INSERT', 'UPDATE', 'DELETE', 'MERGE', 'INTO', 'FOR']);\n\nfunction isWordChar(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_' || ch === '$';\n}\n\n/** Skip a single-quoted literal starting at `start` (the opening quote). */\nfunction skipSingleQuoted(sql: string, start: number, eString: boolean): number {\n let i = start + 1;\n while (i < sql.length) {\n if (eString && sql[i] === '\\\\') {\n i += 2;\n continue;\n }\n if (sql[i] === \"'\") {\n if (sql[i + 1] === \"'\") {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Skip a double-quoted identifier starting at `start` (the opening quote). */\nfunction skipDoubleQuoted(sql: string, start: number): number {\n let i = start + 1;\n while (i < sql.length) {\n if (sql[i] === '\"') {\n if (sql[i + 1] === '\"') {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Match a dollar-quote tag ($$ or $tag$) at `start`; `$1` placeholders are not tags. */\nfunction matchDollarTag(sql: string, start: number): string | undefined {\n let i = start + 1;\n if (sql[i] === '$') return '$$';\n const first = sql[i];\n if (!first || !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || first === '_')) {\n return undefined;\n }\n i++;\n while (i < sql.length && isWordChar(sql[i]) && sql[i] !== '$') i++;\n if (sql[i] !== '$') return undefined;\n return sql.slice(start, i + 1);\n}\n\n/** Strip comments and blank string/identifier contents, keeping structure. */\nfunction sanitizeSql(sql: string): string {\n const out: string[] = [];\n let i = 0;\n\n while (i < sql.length) {\n const ch = sql[i];\n\n if (ch === '-' && sql[i + 1] === '-') {\n while (i < sql.length && sql[i] !== '\\n') i++;\n out.push(' ');\n continue;\n }\n\n if (ch === '/' && sql[i + 1] === '*') {\n // Postgres nests block comments\n let depth = 1;\n i += 2;\n while (i < sql.length && depth > 0) {\n if (sql[i] === '/' && sql[i + 1] === '*') {\n depth++;\n i += 2;\n } else if (sql[i] === '*' && sql[i + 1] === '/') {\n depth--;\n i += 2;\n } else {\n i++;\n }\n }\n out.push(' ');\n continue;\n }\n\n if (ch === \"'\") {\n // E'…' strings honor backslash escapes; standard strings do not\n let j = i - 1;\n while (j >= 0 && (sql[j] === ' ' || sql[j] === '\\t' || sql[j] === '\\n' || sql[j] === '\\r')) j--;\n const prev = j >= 0 ? sql[j] : '';\n const eString = (prev === 'e' || prev === 'E') && (j === 0 || !isWordChar(sql[j - 1]));\n i = skipSingleQuoted(sql, i, eString);\n out.push(\"''\");\n continue;\n }\n\n if (ch === '\"') {\n i = skipDoubleQuoted(sql, i);\n out.push('\"\"');\n continue;\n }\n\n if (ch === '$') {\n const tag = matchDollarTag(sql, i);\n if (tag) {\n const close = sql.indexOf(tag, i + tag.length);\n i = close === -1 ? sql.length : close + tag.length;\n out.push('$$');\n continue;\n }\n }\n\n out.push(ch);\n i++;\n }\n\n return out.join('');\n}\n\n/**\n * Verify `sql` is a single read-only SELECT statement.\n * Returns `{ ok: false, reason }` for anything else.\n */\nexport function assertReadOnlySelect(sql: string): SqlGuardResult {\n const sanitized = sanitizeSql(sql);\n\n const statements = sanitized\n .split(';')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (statements.length === 0) {\n return { ok: false, reason: 'Empty statement' };\n }\n if (statements.length > 1) {\n return { ok: false, reason: 'Only a single statement is allowed' };\n }\n\n const words = (statements[0].match(/\\b[A-Za-z_][A-Za-z0-9_]*\\b/g) ?? []).map((w) =>\n w.toUpperCase(),\n );\n const first = words[0];\n if (first !== 'SELECT' && first !== 'WITH') {\n return { ok: false, reason: 'Only SELECT statements are allowed' };\n }\n\n const denied = words.find((w) => DENIED_KEYWORDS.has(w));\n if (denied) {\n return { ok: false, reason: `Keyword not allowed in a read-only query: ${denied}` };\n }\n\n return { ok: true };\n}\n","/**\n * Database Integration for Almadar\n * Read-only SQL queries over external connections (migration fetch seam).\n */\n\nimport { Pool } from 'pg';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { IntegrationError } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { resolveCredentialRef } from '../../credentials';\nimport { assertReadOnlySelect } from './sql-guard';\nimport type {\n DatabaseDriver,\n DatabaseQueryParams,\n DatabaseQueryParamValue,\n DatabaseQueryResult,\n DatabaseRow,\n} from './types';\n\nconst DEFAULT_STATEMENT_TIMEOUT_MS = 10_000;\n\n/** Postgres SQLSTATE raised when statement_timeout cancels a query. */\nconst PG_QUERY_CANCELED = '57014';\n\nclass PostgresDriver implements DatabaseDriver {\n private pool: Pool;\n\n constructor(connectionString: string, statementTimeoutMs: number) {\n this.pool = new Pool({\n connectionString,\n statement_timeout: statementTimeoutMs,\n query_timeout: statementTimeoutMs,\n });\n }\n\n async query(\n sql: string,\n params: readonly DatabaseQueryParamValue[],\n ): Promise<DatabaseQueryResult> {\n const result = await this.pool.query(sql, [...params]);\n return {\n rows: result.rows as DatabaseRow[],\n rowCount: result.rowCount ?? result.rows.length,\n };\n }\n\n async end(): Promise<void> {\n await this.pool.end();\n }\n}\n\nfunction mapDriverError(error: unknown): IntegrationError {\n if (error instanceof IntegrationError) return error;\n const code = (error as { code?: string }).code;\n if (code === PG_QUERY_CANCELED) {\n return new IntegrationError('Statement timeout exceeded', 'TIMEOUT_ERROR');\n }\n const message = error instanceof Error ? error.message : String(error);\n return new IntegrationError(message, 'SERVICE_ERROR');\n}\n\n/**\n * Generic database integration. One action — `query` — with read-only\n * enforced in the integration itself (single SELECT only, statement\n * timeout). `connectionRef` is an environment variable NAME, never the\n * secret; the connection string is resolved from `process.env` at run time.\n */\nexport class DatabaseIntegration extends BaseIntegration {\n private drivers: Map<string, DatabaseDriver> = new Map();\n private statementTimeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const fromEnv = config.env.DATABASE_STATEMENT_TIMEOUT_MS;\n if (fromEnv) {\n const parsed = Number(fromEnv);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid DATABASE_STATEMENT_TIMEOUT_MS: ${fromEnv}`);\n }\n this.statementTimeoutMs = parsed;\n } else {\n this.statementTimeoutMs = config.timeout ?? DEFAULT_STATEMENT_TIMEOUT_MS;\n }\n\n this.logger.info('Database integration initialized', {\n statementTimeoutMs: this.statementTimeoutMs,\n });\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 'query':\n data = await this.executeWithRetry(() => this.runQuery(params as DatabaseQueryParams));\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 runQuery(params: DatabaseQueryParams): Promise<DatabaseQueryResult> {\n const guard = assertReadOnlySelect(params.sql);\n if (!guard.ok) {\n throw new IntegrationError(\n `Read-only violation: ${guard.reason ?? 'not a SELECT statement'}`,\n 'VALIDATION_ERROR',\n );\n }\n\n const driver = this.driverFor(params.connectionRef);\n\n this.logger.debug('Database QUERY', { connectionRef: params.connectionRef });\n\n try {\n return await driver.query(params.sql, params.params ?? []);\n } catch (error) {\n throw mapDriverError(error);\n }\n }\n\n /** Resolve (and cache) the driver for a connection reference. */\n private driverFor(connectionRef: string): DatabaseDriver {\n const connectionString = resolveCredentialRef(connectionRef);\n if (!connectionString) {\n throw new IntegrationError(\n `Connection reference \"${connectionRef}\" is not set in the credential store or environment`,\n 'AUTH_ERROR',\n );\n }\n\n const cached = this.drivers.get(connectionString);\n if (cached) return cached;\n\n const driver = new PostgresDriver(connectionString, this.statementTimeoutMs);\n this.drivers.set(connectionString, driver);\n return driver;\n }\n}\n\n// Auto-register\nregisterIntegration('database', DatabaseIntegration);\n\n// Export types\nexport * from './types';\nexport { assertReadOnlySelect, type SqlGuardResult } from './sql-guard';\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Wikimedia (Wikipedia API) integration — redirect-resolved page lookup returning\n * a verified one-line description, a real Commons portrait, and the lead-section\n * extract. The single canonical home for the User-Agent + timeout that kflow's\n * persona services previously duplicated as ad-hoc `fetch` calls.\n */\nconst WIKI_ENDPOINT = 'https://en.wikipedia.org/w/api.php';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\nconst EXTRACT_CHAR_CAP = 2000;\n\ninterface WikiPage {\n missing?: '' | boolean;\n title?: string;\n description?: string;\n extract?: string;\n thumbnail?: { source?: string };\n}\ninterface WikiQueryResponse {\n query?: { pages?: Record<string, WikiPage> };\n}\n\nexport class WikimediaIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.WIKIMEDIA_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.WIKIMEDIA_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Wikimedia integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): 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 try {\n let data: unknown;\n switch (action) {\n case 'getPage':\n data = await this.executeWithRetry(() => this.getPage(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /** Look up a title on Wikipedia: description, portrait, lead extract. Empty fields on miss. */\n private async getPage(params: IntegrationParams): Promise<{ title?: string; description?: string; portraitUrl?: string; extract?: string }> {\n const title = String(params.title ?? '').trim();\n if (!title) return {};\n const url =\n `${WIKI_ENDPOINT}?action=query&format=json&redirects=1` +\n `&prop=pageimages|description|extracts&explaintext=1&exintro=1` +\n `&piprop=thumbnail&pithumbsize=240&titles=${encodeURIComponent(title)}`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return {};\n const data = (await res.json()) as WikiQueryResponse;\n const pages = data.query?.pages;\n if (!pages) return {};\n const page = Object.values(pages)[0];\n if (!page || page.missing !== undefined) return {};\n const extract = typeof page.extract === 'string' ? page.extract.slice(0, EXTRACT_CHAR_CAP).trim() : undefined;\n return {\n title: page.title,\n description: page.description ?? (typeof page.extract === 'string' ? page.extract.split('.')[0] : undefined),\n portraitUrl: page.thumbnail?.source,\n extract,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('wikimedia', WikimediaIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Iconify integration — brand-logo / icon resolution via the Iconify API.\n * Exposes the three atomic HTTP calls kflow's concept-icon service previously\n * made as ad-hoc `fetch`: existence check, relevance search, and icon-body\n * fetch (for color-tone classification). Caching + tone classification stay\n * in the caller; this owns only the transport (UA, timeout, retry).\n */\nconst ICONIFY_API = 'https://api.iconify.design';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\n\ninterface IconCollection { icons?: Record<string, { body: string }>; aliases?: Record<string, { body: string }>; }\ninterface SearchResponse { icons?: string[]; }\n\nexport class IconifyIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.ICONIFY_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.ICONIFY_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Iconify integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): 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 try {\n let data: unknown;\n switch (action) {\n case 'svgExists':\n data = await this.executeWithRetry(() => this.svgExists(params));\n break;\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getIconBody':\n data = await this.executeWithRetry(() => this.getIconBody(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async svgExists(params: IntegrationParams): Promise<{ exists: boolean }> {\n const path = String(params.path ?? '');\n if (!path) return { exists: false };\n return { exists: await this.headOk(`${ICONIFY_API}/${path}`) };\n }\n\n private async search(params: IntegrationParams): Promise<{ icons: string[] }> {\n const query = String(params.query ?? '');\n if (!query) return { icons: [] };\n const limit = Number(params.limit ?? 1);\n const data = await this.getJson<SearchResponse>(`${ICONIFY_API}/search?query=${encodeURIComponent(query)}&limit=${limit}`);\n return { icons: data?.icons ?? [] };\n }\n\n private async getIconBody(params: IntegrationParams): Promise<{ body: string | null }> {\n const iconId = String(params.iconId ?? '');\n const [prefix, name] = iconId.split(':');\n if (!prefix || !name) return { body: null };\n const data = await this.getJson<IconCollection>(`${ICONIFY_API}/${prefix}.json?icons=${encodeURIComponent(name)}`);\n return { body: data?.icons?.[name]?.body ?? data?.aliases?.[name]?.body ?? null };\n }\n\n private async headOk(url: string): Promise<boolean> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { method: 'GET', headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async getJson<T>(url: string): Promise<T | null> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('iconify', IconifyIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * arXiv integration — the live-search backend for the knowledge-worker's\n * \"emerging\" axis (frontier academic concepts beyond the user's graph). Wraps\n * the public Atom API at export.arxiv.org. Chosen as the placeholder web-search\n * vendor; the action shape matches a generic search so the backend can be\n * swapped without touching the rabit tool surface.\n */\nconst ARXIV_ENDPOINT = 'https://export.arxiv.org/api/query';\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_RESULTS = 8;\n\nexport interface ArxivResult {\n id: string;\n title: string;\n summary: string;\n authors: string[];\n published: string;\n url: string;\n}\n\n/** Minimal Atom `<entry>` extractor — arXiv's feed is regular; no XML dep needed. */\nfunction parseAtom(xml: string): ArxivResult[] {\n const entries: ArxivResult[] = [];\n for (const block of xml.split('<entry>').slice(1)) {\n const grab = (tag: string): string => {\n const m = block.match(new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)</${tag}>`, 'i'));\n return m ? m[1].replace(/<[^>]+>/g, '').trim() : '';\n };\n const id = grab('id');\n const title = grab('title').replace(/\\s+/g, ' ');\n const summary = grab('summary').replace(/\\s+/g, ' ');\n const published = grab('published');\n const authors = Array.from(block.matchAll(/<author>\\s*<name>([^<]+)<\\/name>/g)).map(m => m[1].trim());\n const linkMatch = block.match(/<link[^>]*rel=\"alternate\"[^>]*href=\"([^\"]+)\"/i);\n const url = linkMatch ? linkMatch[1] : id;\n if (id || title) entries.push({ id, title, summary, authors, published, url });\n }\n return entries;\n}\n\nexport class ArxivIntegration extends BaseIntegration {\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.timeoutMs = Number(config.env?.ARXIV_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('arXiv integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): 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 try {\n let data: unknown;\n switch (action) {\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async search(params: IntegrationParams): Promise<{ results: ArxivResult[] }> {\n const query = String(params.query ?? '').trim();\n if (!query) return { results: [] };\n const maxResults = Number(params.maxResults ?? DEFAULT_MAX_RESULTS);\n // arXiv search_query: quote the term as an all-fields term.\n const url = `${ARXIV_ENDPOINT}?search_query=${encodeURIComponent(`all:${query}`)}&start=0&max_results=${maxResults}&sortBy=relevance`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'Accept': 'application/atom+xml' }, signal: ctrl.signal });\n if (!res.ok) return { results: [] };\n const xml = await res.text();\n return { results: parseAtom(xml) };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('arxiv', ArxivIntegration);\n"]}
1
+ {"version":3,"sources":["../src/types.ts","../src/contracts.ts","../src/core/logger.ts","../src/core/validation.ts","../src/core/retry.ts","../src/core/BaseIntegration.ts","../src/registry.ts","../src/factory.ts","../src/credentials/store.ts","../src/credentials/resolver.ts","../src/credentials/filePersistence.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/webhook/index.ts","../src/integrations/push/index.ts","../src/integrations/calendar/webhooks.ts","../src/integrations/calendar/index.ts","../src/hooks.ts","../src/integrations/drive/index.ts","../src/integrations/metaAds/index.ts","../src/integrations/accounting/index.ts","../src/integrations/banking/index.ts","../src/integrations/esign/index.ts","../src/integrations/llm/index.ts","../src/integrations/ml/index.ts","../src/integrations/deepagent/index.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/credentials/index.ts","../src/integrations/storage/index.ts","../src/integrations/docker/index.ts","../src/integrations/database/sql-guard.ts","../src/integrations/database/index.ts","../src/integrations/wikimedia/index.ts","../src/integrations/iconify/index.ts","../src/integrations/arxiv/index.ts"],"names":["STRIPE_API_VERSION","isoFromUnix","priceToTier","mapStatus","shapeSubscription","Stripe","sub","google","init","fs","join","writeFileSync","isParamRecord","decodeContent","createHash","bytes","contentType","url","s3GetSignedUrl","DEFAULT_TIMEOUT_MS","DEFAULT_UA"],"mappings":"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","file":"index.js","sourcesContent":["/**\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 * ServiceContract type definitions for all @almadar/integrations.\n *\n * Each integration defines its own action map as a Record<string, ServiceAction>,\n * suitable for use with ServiceContract<T> from @almadar/core.\n *\n * Types are simplified representations of the actual params/results. They capture\n * the contract shape without pulling in third-party SDK types (Stripe, Twilio, etc.).\n *\n * @packageDocumentation\n */\n\nimport type { ServiceAction, ServiceEvents, ServiceParams, ServiceParamsValue } from '@almadar/core';\nimport type { IntegrationParams } from './types';\nimport type { DatabaseQueryParamValue, DatabaseRow } from './integrations/database/types';\n\n// ============================================================================\n// GitHub\n// ============================================================================\n\nexport type GitHubActions = {\n cloneRepo: {\n params: { repoUrl: string; targetDir: string; branch?: string };\n result: { message: string };\n };\n createBranch: {\n params: { branchName: string; baseBranch?: string };\n result: { message: string };\n };\n commit: {\n params: { message: string; files?: string[] };\n result: { message: string };\n };\n push: {\n params: { branchName: string; force?: boolean };\n result: { message: string };\n };\n createPR: {\n params: { title: string; body: string; baseBranch: string; headBranch: string; draft?: boolean };\n result: { number: number; url: string; title: string };\n };\n getPRComments: {\n params: { prNumber: number };\n result: { comments: Array<{ id: number; body: string; user: string }> };\n };\n listIssues: {\n params: { state?: string; labels?: string[]; per_page?: number };\n result: { issues: Array<{ number: number; title: string; state: string }> };\n };\n getIssue: {\n params: { issueNumber: number };\n result: { number: number; title: string; body: string; state: string };\n };\n getFile: {\n params: { owner: string; repo: string; path: string; ref?: string };\n result: { path: string; content: string; sha: string; size: number };\n };\n listCommits: {\n params: { owner: string; repo: string; path?: string; ref?: string; per_page?: number };\n result: { commits: Array<{ sha: string; message: string; author: string; date: string }> };\n };\n createIssue: {\n params: { owner: string; repo: string; title: string; body?: string; labels?: string[] };\n result: { number: number; title: string; url: string };\n };\n};\n\n// ============================================================================\n// Stripe\n// ============================================================================\n\nexport type StripeActions = {\n createPaymentIntent: {\n params: { amount: number; currency: string; metadata?: Record<string, string> };\n result: { id: string; clientSecret: string; status: string; amount: number; currency: string };\n };\n confirmPayment: {\n params: { paymentIntentId: string };\n result: { id: string; status: string };\n };\n refund: {\n params: { paymentIntentId: string; amount?: number };\n result: { id: string; status: string; amount: number };\n };\n};\n\n// ============================================================================\n// LLM\n// ============================================================================\n\nexport type LLMIntegrationActions = {\n generate: {\n params: {\n userPrompt: string;\n systemPrompt?: string;\n model?: string;\n temperature?: number;\n maxTokens?: number;\n };\n result: {\n content: string;\n usage: { promptTokens?: number; completionTokens?: number; totalTokens?: number; tokens?: number };\n };\n };\n classify: {\n params: { text: string; categories: string[]; model?: string };\n result: { category: string; confidence: number; reasoning: string };\n };\n extract: {\n params: { text: string; schema: IntegrationParams; model?: string };\n result: IntegrationParams;\n };\n summarize: {\n params: { text: string; maxLength?: number; style?: string; model?: string };\n result: { summary: string; keyPoints: string[] };\n };\n embed: {\n params: { texts: string[]; model?: string };\n result: { embeddings: number[][] };\n };\n};\n\n// ============================================================================\n// ML (model inference)\n// ============================================================================\n\nexport type MLActions = {\n infer: {\n params: { model: string; input: ServiceParamsValue };\n result: { output: ServiceParamsValue; confidence: number; violations: ServiceParamsValue[] };\n };\n};\n\n// ============================================================================\n// YouTube\n// ============================================================================\n\nexport type YouTubeActions = {\n search: {\n params: { query: string; maxResults?: number; type?: string };\n result: Array<{ videoId: string; title: string; thumbnail: string; description: string }>;\n };\n getVideo: {\n params: { videoId: string };\n result: { title: string; description: string; viewCount: string; likeCount: string };\n };\n getChannel: {\n params: { channelId: string };\n result: { name: string; description: string; subscriberCount: string };\n };\n};\n\n// ============================================================================\n// Twilio\n// ============================================================================\n\nexport type TwilioActions = {\n sendSMS: {\n params: { to: string; body: string; from?: string };\n result: { sid: string; status: string };\n };\n sendWhatsApp: {\n params: { to: string; body: string };\n result: { sid: string; status: string };\n };\n};\n\n// ============================================================================\n// Email\n// ============================================================================\n\nexport type EmailActions = {\n send: {\n params: {\n to: string;\n subject: string;\n body: string;\n from?: string;\n /** HTML content; when present `body` becomes the plain-text alternative. */\n htmlBody?: string;\n replyTo?: string;\n /** Provider template reference (SendGrid dynamic templates; Resend rejects it loudly). */\n templateId?: string;\n };\n result: { id: string; status: string };\n };\n};\n\n// ============================================================================\n// Webhook\n// ============================================================================\n\nexport type WebhookActions = {\n send: {\n params: { url: string; event: string; payload?: Record<string, string>; secret?: string };\n result: { status: number; ok: boolean; durationMs: number };\n };\n};\n\n// ============================================================================\n// Push (Web Push / VAPID)\n// ============================================================================\n\nexport type PushActions = {\n send: {\n params: {\n subscription: { endpoint: string; keys: { p256dh: string; auth: string } };\n title: string;\n body: string;\n url?: string;\n icon?: string;\n };\n result: { statusCode: number; ok: boolean; expired: boolean };\n };\n};\n\n// ============================================================================\n// Calendar (Google Calendar, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type CalendarActions = {\n listEvents: {\n params: { calendarId?: string; timeMin?: string; timeMax?: string; syncToken?: string; maxResults?: number };\n result: {\n events: Array<{ id: string; summary: string; description: string; location: string; start: string; end: string; status: string; updated: string }>;\n nextSyncToken: string | null;\n };\n };\n createEvent: {\n params: { calendarId?: string; summary: string; description?: string; location?: string; start: string; end?: string; durationMinutes?: number };\n result: { id: string; status: string; htmlLink: string };\n };\n updateEvent: {\n params: { calendarId?: string; eventId: string; summary?: string; description?: string; location?: string; start?: string; end?: string };\n result: { id: string; status: string };\n };\n deleteEvent: {\n params: { calendarId?: string; eventId: string };\n result: { id: string; deleted: boolean };\n };\n freeBusy: {\n params: { calendarId?: string; timeMin: string; timeMax: string };\n result: { busy: Array<{ start: string; end: string }> };\n };\n watch: {\n params: { calendarId?: string; channelId: string; address: string; ttlSeconds?: number };\n result: { channelId: string; resourceId: string; expiration: string };\n };\n stopWatch: {\n params: { channelId: string; resourceId: string };\n result: { stopped: boolean };\n };\n};\n\n// ============================================================================\n// Drive (Google Drive, service account w/ domain-wide delegation)\n// ============================================================================\n\nexport type DriveActions = {\n listFiles: {\n params: { folderId?: string; query?: string; maxResults?: number };\n result: {\n files: Array<{ id: string; name: string; mimeType: string; size: number; modifiedTime: string; webViewLink: string }>;\n };\n };\n getFile: {\n params: { fileId: string };\n result: { id: string; name: string; mimeType: string; content: string; size: number };\n };\n uploadFile: {\n params: { name: string; content: string; mimeType?: string; folderId?: string };\n result: { id: string; name: string; webViewLink: string };\n };\n createFolder: {\n params: { name: string; parentId?: string };\n result: { id: string; name: string };\n };\n shareFile: {\n params: { fileId: string; email: string; role?: 'reader' | 'writer' | 'commenter' };\n result: { shared: boolean; permissionId: string };\n };\n};\n\n// ============================================================================\n// Meta Ads (Graph API Marketing Insights, read-only)\n// ============================================================================\n\nexport type MetaAdsActions = {\n getSpend: {\n params: { accountId?: string; since: string; until: string; clientTag?: string };\n result: { spend: number; currency: string; impressions: number; clicks: number };\n };\n listCampaigns: {\n params: { accountId?: string; status?: string };\n result: { campaigns: Array<{ id: string; name: string; status: string; dailyBudget: number }> };\n };\n};\n\n// ============================================================================\n// Accounting (generic export — provider-pluggable, CSV first)\n// ============================================================================\n\nexport type AccountingActions = {\n exportInvoices: {\n params: {\n invoices: Array<{ id: string; number: string; customer: string; issuedAt: string; dueAt: string; currency: string; net: number; tax: number; gross: number; status: string }>;\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n exportJournal: {\n params: {\n entries: Array<{ date: string; account: string; description: string; debit: number; credit: number; reference: string }>;\n format?: 'csv';\n };\n result: { content: string; filename: string; count: number };\n };\n};\n\n// ============================================================================\n// Banking (GoCardless Bank Account Data)\n// ============================================================================\n\nexport type BankingActions = {\n createRequisition: {\n params: { institutionId: string; redirectUrl: string; reference?: string };\n result: { requisitionId: string; link: string };\n };\n listAccounts: {\n params: { requisitionId: string };\n result: { accounts: string[] };\n };\n listTransactions: {\n params: { accountId: string; dateFrom?: string; dateTo?: string };\n result: {\n transactions: Array<{ id: string; amount: number; currency: string; date: string; description: string; counterparty: string }>;\n };\n };\n};\n\n// ============================================================================\n// E-sign (pluggable, DocuSign first)\n// ============================================================================\n\nexport type EsignActions = {\n sendEnvelope: {\n params: { recipientEmail: string; recipientName: string; documentName: string; documentContent: string; emailSubject?: string };\n result: { envelopeId: string; status: string };\n };\n getEnvelopeStatus: {\n params: { envelopeId: string };\n result: { status: string; completedAt: string };\n };\n downloadDocument: {\n params: { envelopeId: string };\n result: { content: string; documentName: string };\n };\n};\n\n// ============================================================================\n// Docker\n// ============================================================================\n\nexport type DockerActions = {\n build: {\n params: { tag: string; dockerfile?: string; context?: string; buildArgs?: Record<string, string> };\n result: { imageId: string; tag: string; size: number; buildTime: number };\n };\n run: {\n params: {\n image: string;\n name?: string;\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 };\n result: {\n containerId: string;\n name: string;\n status: string;\n ports: Array<{ host: number; container: number; protocol: string }>;\n };\n };\n stop: {\n params: { containerId: string };\n result: { containerId: string; status: string; stoppedAt: number };\n };\n remove: {\n params: { containerId: string; force?: boolean };\n result: { containerId: string; removed: boolean };\n };\n logs: {\n params: { containerId: string; tail?: number; since?: string };\n result: { containerId: string; logs: string[]; lineCount: number };\n };\n status: {\n params: { containerId: string };\n result: {\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 };\n list: {\n params: { all?: boolean; filterByLabel?: string };\n result: {\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 };\n};\n\n// ============================================================================\n// Storage\n// ============================================================================\n\nexport type StorageActions = {\n upload: {\n params: {\n bucket: string;\n // Two upload shapes are admitted: the canonical `{ key, content }`\n // pair, and the file-form `{ file, acl?, maxSize? }` shape that lolo\n // authors use when wiring an `<input type=\"file\">` upload payload\n // straight to storage (UploadDropZone emits\n // `{ name, size, type, content }` with `content` a base64 data URL).\n // The handler reads `file` if present and derives `key`/`content`\n // from it; legacy callers still get the direct `key`/`content` path.\n key?: string;\n content?: string;\n contentType?: string;\n file?: { name: string; size: number; type: string; content?: string };\n acl?: 'public' | 'private';\n maxSize?: number;\n metadata?: IntegrationParams;\n };\n // `id`/`url` mirror `key` and its public/signed address — the fields the\n // .lolo upload consumers (std-service-storage, social-feed, chat) read.\n result: { key: string; bucket: string; size: number; etag: string; id: string; url: string };\n };\n uploadMany: {\n params: {\n bucket: string;\n // The whole UploadDropZone batch in one call — the FSM-friendly shape:\n // one call-service arm, one bulk persist of the returned `items`.\n files: Array<{ name: string; size: number; type: string; content?: string }>;\n acl?: 'public' | 'private';\n maxSize?: number;\n };\n // Each item is shaped ready for a bulk `persist create` of an\n // uploaded-file row: id/url plus name/sizeBytes/mimeType columns.\n result: {\n items: Array<{ id: string; key: string; url: string; name: string; sizeBytes: number; mimeType: string }>;\n count: number;\n };\n };\n download: {\n params: { bucket: string; key: string };\n result: { content: string; contentType: string; size: number; metadata: IntegrationParams };\n };\n list: {\n params: { bucket: string; prefix?: string; maxKeys?: number; continuationToken?: string };\n result: {\n keys: Array<{ key: string; size: number; lastModified: number }>;\n truncated: boolean;\n // Present iff truncated — pass back as `continuationToken` for the next page (I-11).\n nextToken?: string;\n };\n };\n delete: {\n params: { bucket: string; key: string };\n result: { deleted: boolean };\n };\n getSignedUrl: {\n params: { bucket: string; key: string; expiresIn?: number; operation?: 'get' | 'put' };\n result: { url: string; expiresAt: number };\n };\n};\n\n// ============================================================================\n// Queue\n// ============================================================================\n\nexport type QueueActions = {\n enqueue: {\n params: { queue: string; payload: ServiceParams; delay?: number; priority?: number };\n result: { jobId: string; position: number };\n };\n dequeue: {\n params: { queue: string };\n result: { job: { id: string; payload: ServiceParams; enqueuedAt: number; priority: number } | null };\n };\n status: {\n params: { jobId: string };\n result: {\n status: 'pending' | 'processing' | 'completed' | 'failed';\n job: { id: string; payload: ServiceParams; enqueuedAt: number; priority: number } | null;\n };\n };\n complete: {\n params: { jobId: string; result?: ServiceParams };\n result: { completed: boolean };\n };\n fail: {\n params: { jobId: string; error?: string };\n result: { failed: boolean };\n };\n cancel: {\n params: { jobId: string };\n result: { cancelled: boolean };\n };\n size: {\n params: { queue: string };\n result: { size: number; pending: number; processing: number };\n };\n};\n\n// ============================================================================\n// Redis\n// ============================================================================\n\nexport type RedisActions = {\n get: {\n params: { key: string };\n result: { value: ServiceParams };\n };\n set: {\n params: { key: string; value: ServiceParams; ttl?: number };\n result: { ok: boolean };\n };\n delete: {\n params: { key: string };\n result: { deleted: boolean };\n };\n lock: {\n params: { key: string; ttl?: number };\n result: { acquired: boolean; lockId: string };\n };\n unlock: {\n params: { key: string; lockId: string };\n result: { released: boolean };\n };\n increment: {\n params: { key: string; by?: number };\n result: { value: number };\n };\n expire: {\n params: { key: string; ttl: number };\n result: { set: boolean };\n };\n publish: {\n params: { channel: string; message: ServiceParams };\n result: { receivers: number };\n };\n subscribe: {\n params: { channel: string };\n result: { subscribed: boolean };\n };\n};\n\n// ============================================================================\n// OAuth\n// ============================================================================\n\nexport type OAuthActions = {\n authorize: {\n params: { provider: 'google' | 'github' | 'auth0'; scopes: string[]; redirectUri: string };\n result: { authUrl: string; state: string };\n };\n token: {\n params: { code: string; state: string };\n result: { accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' };\n };\n refresh: {\n params: { refreshToken: string };\n result: { accessToken: string; expiresIn: number };\n };\n revoke: {\n params: { token: string };\n result: { revoked: boolean };\n };\n userinfo: {\n params: { accessToken: string };\n result: { sub: string; email: string; name: string; picture: string };\n };\n};\n\n// ============================================================================\n// Credentials (hosted tenant credential store — the settings-page backend)\n// ============================================================================\n\nexport type CredentialsActions = {\n list: {\n params: { service?: string };\n result: {\n enabled: boolean;\n entries: Array<{\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n }>;\n };\n };\n set: {\n params: { service: string; envVar: string; value: string };\n result: { saved: boolean; service: string; envVar: string; last4: string };\n };\n remove: {\n params: { service: string; envVar: string };\n result: { removed: boolean };\n };\n test: {\n params: { service: string };\n result: { service: string; configured: boolean; missing: string[]; probed: boolean; ok: boolean; message: string };\n };\n rotate: {\n params: Record<string, never>;\n result: { rotated: number; alreadyCurrent: number; unreadable: number };\n };\n};\n\n// ============================================================================\n// OpenTelemetry\n// ============================================================================\n\nexport type OtelActions = {\n startSpan: {\n params: { name: string; attributes?: IntegrationParams; traceId?: string };\n result: { spanId: string; traceId: string };\n };\n endSpan: {\n params: { spanId: string; status?: 'ok' | 'error' };\n result: { ended: boolean };\n };\n addEvent: {\n params: { spanId: string; name: string; attributes?: IntegrationParams };\n result: { added: boolean };\n };\n recordMetric: {\n params: { name: string; value: number; type?: 'counter' | 'gauge' | 'histogram'; labels?: IntegrationParams };\n result: { recorded: boolean };\n };\n getSpan: {\n params: { spanId: string };\n result: {\n spanId: string;\n traceId: string;\n name: string;\n startTime: number;\n endTime?: number;\n status?: 'ok' | 'error';\n attributes: IntegrationParams;\n } | null;\n };\n getMetrics: {\n params: Record<string, never>;\n result: Record<string, { name: string; type: string; value: number; values: number[]; labels: IntegrationParams }>;\n };\n};\n\n// ============================================================================\n// CLI\n// ============================================================================\n\nexport type CLIActions = {\n validate: {\n params: { schema: string };\n result: { valid: boolean; errors: string[]; warnings: string[]; summary: string };\n };\n};\n\n// ============================================================================\n// DeepAgent\n// ============================================================================\n\nexport type DeepAgentActions = {\n sendMessage: {\n params: { message: string; threadId?: string; skill?: string; context?: IntegrationParams };\n result: { response: string; threadId: string };\n };\n cancelGeneration: {\n params: { threadId: string };\n result: { cancelled: boolean };\n };\n validateSchema: {\n params: { schema: string };\n result: { valid: boolean; errors: string[] };\n };\n compileSchema: {\n params: { schema: string; shell?: string };\n result: { output: string; files: string[] };\n };\n getThreadHistory: {\n params: { threadId: string };\n result: { messages: Array<{ role: string; content: string; timestamp: number }> };\n };\n};\n\n// ============================================================================\n// Database\n// ============================================================================\n\nexport type DatabaseActions = {\n query: {\n params: {\n connectionRef: string;\n sql: string;\n params?: DatabaseQueryParamValue[];\n };\n result: { rows: DatabaseRow[]; rowCount: number };\n };\n};\n\n// ============================================================================\n// Wikimedia\n// ============================================================================\n\nexport type WikimediaActions = {\n getPage: {\n params: { title: string };\n result: { title?: string; description?: string; portraitUrl?: string; extract?: string };\n };\n};\n\n// ============================================================================\n// Iconify\n// ============================================================================\n\nexport type IconifyActions = {\n svgExists: {\n params: { path: string };\n result: { exists: boolean };\n };\n search: {\n params: { query: string; limit?: number };\n result: { icons: string[] };\n };\n getIconBody: {\n params: { iconId: string };\n result: { body: string | null };\n };\n};\n\n// ============================================================================\n// arXiv\n// ============================================================================\n\nexport type ArxivActions = {\n search: {\n params: { query: string; maxResults?: number };\n result: { results: Array<{ id: string; title: string; summary: string; authors: string[]; published: string; url: string }> };\n };\n};\n\n// ============================================================================\n// Barrel: IntegrationContracts\n// ============================================================================\n\n/**\n * Maps each integration name (as used in `registerIntegration`) to its action\n * map type. Use with `ServiceContract<IntegrationContracts[K]>` to get a fully\n * typed service interface for a specific integration.\n *\n * @example\n * ```typescript\n * import type { ServiceContract } from '@almadar/core';\n * import type { IntegrationContracts } from '@almadar/integrations';\n *\n * type TypedStripe = ServiceContract<IntegrationContracts['stripe']>;\n * ```\n */\nexport type IntegrationContracts = {\n github: GitHubActions;\n stripe: StripeActions;\n llm: LLMIntegrationActions;\n ml: MLActions;\n youtube: YouTubeActions;\n twilio: TwilioActions;\n email: EmailActions;\n webhook: WebhookActions;\n push: PushActions;\n calendar: CalendarActions;\n drive: DriveActions;\n metaAds: MetaAdsActions;\n accounting: AccountingActions;\n banking: BankingActions;\n esign: EsignActions;\n docker: DockerActions;\n storage: StorageActions;\n queue: QueueActions;\n redis: RedisActions;\n oauth: OAuthActions;\n credentials: CredentialsActions;\n otel: OtelActions;\n cli: CLIActions;\n deepagent: DeepAgentActions;\n database: DatabaseActions;\n wikimedia: WikimediaActions;\n iconify: IconifyActions;\n arxiv: ArxivActions;\n};\n\n/** Integration name literal union. */\nexport type IntegrationName = keyof IntegrationContracts;\n\n/**\n * Helper: extract the action names for a given integration.\n *\n * @example\n * ```typescript\n * type StripeAction = IntegrationActionName<'stripe'>;\n * // => 'createPaymentIntent' | 'confirmPayment' | 'refund'\n * ```\n */\nexport type IntegrationActionName<K extends IntegrationName> =\n keyof IntegrationContracts[K] & string;\n\n// ============================================================================\n// Event Map\n// ============================================================================\n\n/** Events emitted by integrations during execution. */\nexport type IntegrationEventMap = {\n INTEGRATION_CALL_STARTED: { integration: string; action: string; timestamp: number };\n INTEGRATION_CALL_SUCCEEDED: { integration: string; action: string; durationMs: number };\n INTEGRATION_CALL_FAILED: { integration: string; action: string; error: string; retryCount: number };\n INTEGRATION_RETRY: { integration: string; action: string; attempt: number; maxRetries: number };\n INTEGRATION_REGISTERED: { integration: string; actions: string[] };\n};\n\n/** Typed event emitter for integration events. */\nexport type IntegrationServiceEvents = ServiceEvents<IntegrationEventMap>;\n\n// ============================================================================\n// Type Assertions\n// ============================================================================\n\n// Compile-time verification that all action maps satisfy Record<string, ServiceAction>.\n// This is a type-level assertion, not runtime code.\ntype _AssertActions<T extends Record<string, ServiceAction>> = T;\ntype _CheckGitHub = _AssertActions<GitHubActions>;\ntype _CheckStripe = _AssertActions<StripeActions>;\ntype _CheckLLM = _AssertActions<LLMIntegrationActions>;\ntype _CheckML = _AssertActions<MLActions>;\ntype _CheckYouTube = _AssertActions<YouTubeActions>;\ntype _CheckTwilio = _AssertActions<TwilioActions>;\ntype _CheckEmail = _AssertActions<EmailActions>;\ntype _CheckWebhook = _AssertActions<WebhookActions>;\ntype _CheckPush = _AssertActions<PushActions>;\ntype _CheckCalendar = _AssertActions<CalendarActions>;\ntype _CheckDrive = _AssertActions<DriveActions>;\ntype _CheckMetaAds = _AssertActions<MetaAdsActions>;\ntype _CheckAccounting = _AssertActions<AccountingActions>;\ntype _CheckBanking = _AssertActions<BankingActions>;\ntype _CheckEsign = _AssertActions<EsignActions>;\ntype _CheckDocker = _AssertActions<DockerActions>;\ntype _CheckStorage = _AssertActions<StorageActions>;\ntype _CheckQueue = _AssertActions<QueueActions>;\ntype _CheckRedis = _AssertActions<RedisActions>;\ntype _CheckOAuth = _AssertActions<OAuthActions>;\ntype _CheckCredentials = _AssertActions<CredentialsActions>;\ntype _CheckOtel = _AssertActions<OtelActions>;\ntype _CheckCLI = _AssertActions<CLIActions>;\ntype _CheckDeepAgent = _AssertActions<DeepAgentActions>;\ntype _CheckDatabase = _AssertActions<DatabaseActions>;\ntype _CheckWikimedia = _AssertActions<WikimediaActions>;\ntype _CheckIconify = _AssertActions<IconifyActions>;\ntype _CheckArxiv = _AssertActions<ArxivActions>;\n\n// ============================================================================\n// Credential Declarations\n// ============================================================================\n\n/** A credential (environment variable) required by an integration. */\nexport interface CredentialDeclaration {\n envVar: string;\n required: boolean;\n description: string;\n}\n\n/**\n * Credential declarations for all integrations.\n *\n * This is the single source of truth for what env vars each service needs.\n * Consumed by:\n * - almadar-service-sync (extracts into services-registry.json)\n * - @almadar-io/terraform (provisions Secret Manager resources)\n * - RuntimeIntegrationManager (validates env configuration)\n */\nexport const serviceCredentials: Record<string, CredentialDeclaration[]> = {\n stripe: [\n { envVar: 'STRIPE_SECRET_KEY', required: true, description: 'Stripe secret API key' },\n { envVar: 'STRIPE_WEBHOOK_SECRET', required: false, description: 'Webhook endpoint signing secret' },\n ],\n youtube: [\n { envVar: 'YOUTUBE_API_KEY', required: true, description: 'YouTube Data API key' },\n ],\n twilio: [\n { envVar: 'TWILIO_ACCOUNT_SID', required: true, description: 'Twilio account SID' },\n { envVar: 'TWILIO_AUTH_TOKEN', required: true, description: 'Twilio auth token' },\n { envVar: 'TWILIO_PHONE_NUMBER', required: false, description: 'Default sender phone number' },\n ],\n email: [\n { envVar: 'SENDGRID_API_KEY', required: false, description: 'SendGrid API key (use this OR RESEND_API_KEY)' },\n { envVar: 'RESEND_API_KEY', required: false, description: 'Resend API key (use this OR SENDGRID_API_KEY)' },\n { envVar: 'FROM_EMAIL', required: false, description: 'Default sender email address' },\n ],\n webhook: [\n { envVar: 'WEBHOOK_SIGNING_SECRET', required: false, description: 'Default HMAC-SHA256 signing secret (per-call secret overrides)' },\n { envVar: 'WEBHOOK_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms, default 10000)' },\n ],\n push: [\n { envVar: 'VAPID_PUBLIC_KEY', required: true, description: 'VAPID public key (web-push generate-vapid-keys)' },\n { envVar: 'VAPID_PRIVATE_KEY', required: true, description: 'VAPID private key' },\n { envVar: 'VAPID_SUBJECT', required: true, description: 'VAPID subject (mailto: or https: contact URI)' },\n ],\n calendar: [\n { envVar: 'GOOGLE_CALENDAR_SA_KEY', required: true, description: 'Google service-account key JSON (raw or base64) with calendar scope; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_CALENDAR_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_CALENDAR_ID', required: false, description: 'Default calendar id (default: primary)' },\n { envVar: 'GOOGLE_CALENDAR_CHANNEL_TOKEN', required: false, description: 'Watch-channel verification token — required to receive inbound calendar hooks (two-way sync)' },\n ],\n drive: [\n { envVar: 'GOOGLE_DRIVE_SA_KEY', required: false, description: 'Google service-account key JSON (raw or base64) with drive scope — serves reads; store in Secret Manager, bind as env' },\n { envVar: 'GOOGLE_DRIVE_SUBJECT', required: false, description: 'Workspace user to impersonate (domain-wide delegation); empty = act as the service account' },\n { envVar: 'GOOGLE_DRIVE_REFRESH_TOKEN', required: false, description: 'User OAuth refresh token (drive-consent.mjs) — serves writes; SA uploads are impossible on personal accounts (no SA storage quota)' },\n { envVar: 'GOOGLE_DRIVE_FOLDER_ID', required: false, description: 'Default parent folder for uploads/new folders when the call names none' },\n ],\n metaAds: [\n { envVar: 'META_ACCESS_TOKEN', required: true, description: 'Meta Graph API access token (Marketing API, ads_read)' },\n { envVar: 'META_AD_ACCOUNT_ID', required: false, description: 'Default ad account id (act_…); per-call accountId overrides' },\n ],\n accounting: [],\n banking: [\n { envVar: 'GOCARDLESS_SECRET_ID', required: true, description: 'GoCardless Bank Account Data secret id' },\n { envVar: 'GOCARDLESS_SECRET_KEY', required: true, description: 'GoCardless Bank Account Data secret key' },\n ],\n esign: [\n { envVar: 'DOCUSIGN_BASE_URL', required: true, description: 'DocuSign REST base (e.g. https://demo.docusign.net/restapi/v2.1/accounts/<accountId>)' },\n { envVar: 'DOCUSIGN_ACCESS_TOKEN', required: true, description: 'DocuSign OAuth access token (JWT grant rotation is the deployment concern)' },\n ],\n llm: [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key (use this OR OPENAI_API_KEY)' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key (use this OR ANTHROPIC_API_KEY)' },\n ],\n 'llm-integration': [\n { envVar: 'ANTHROPIC_API_KEY', required: false, description: 'Anthropic API key' },\n { envVar: 'OPENAI_API_KEY', required: false, description: 'OpenAI API key' },\n ],\n ml: [\n { envVar: 'MASAR_URL', required: true, description: 'Base URL of the deployed model-serving orbital' },\n { envVar: 'MASAR_ML_TRAIT', required: true, description: 'Kebab-case trait name the serving orbital exposes its /events route under' },\n ],\n deepagent: [\n { envVar: 'DEEPAGENT_API_URL', required: true, description: 'DeepAgent server URL' },\n { envVar: 'DEEPAGENT_API_KEY', required: false, description: 'DeepAgent API key' },\n ],\n github: [\n { envVar: 'GITHUB_TOKEN', required: true, description: 'GitHub personal access token' },\n { envVar: 'GITHUB_OWNER', required: false, description: 'Default repository owner' },\n { envVar: 'GITHUB_REPO', required: false, description: 'Default repository name' },\n ],\n docker: [\n { envVar: 'DOCKER_HOST', required: false, description: 'Docker daemon host URL' },\n ],\n storage: [\n { envVar: 'STORAGE_ACCESS_KEY_ID', required: true, description: 'S3-compatible access key id' },\n { envVar: 'STORAGE_SECRET_ACCESS_KEY', required: true, description: 'S3-compatible secret access key' },\n { envVar: 'STORAGE_BUCKET', required: true, description: 'Default bucket name' },\n { envVar: 'STORAGE_REGION', required: false, description: 'Region (default us-east-1)' },\n { envVar: 'STORAGE_ENDPOINT', required: false, description: 'Custom S3-compatible endpoint (R2/MinIO/…); empty = AWS S3' },\n { envVar: 'STORAGE_PUBLIC_URL_BASE', required: false, description: 'Base URL for public-acl object links; empty = endpoint-derived' },\n ],\n queue: [\n { envVar: 'QUEUE_URL', required: true, description: 'Message queue connection URL' },\n ],\n redis: [\n { envVar: 'REDIS_URL', required: true, description: 'Redis connection URL' },\n ],\n oauth: [\n { envVar: 'OAUTH_CLIENT_ID', required: true, description: 'OIDC client ID' },\n { envVar: 'OAUTH_CLIENT_SECRET', required: true, description: 'OIDC client secret' },\n { envVar: 'OAUTH_REDIRECT_URI', required: false, description: 'OIDC redirect URI (default per-call param)' },\n { envVar: 'OIDC_ISSUER_URL', required: false, description: 'OIDC issuer URL (default https://accounts.google.com)' },\n ],\n credentials: [\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY', required: false, description: 'AES-256 master key (64-char hex) enabling the hosted credential store — hold it alone in the platform secret store' },\n { envVar: 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS', required: false, description: 'Previous master key, present only during a rotation window — decrypts old rows until `credentials.rotate` re-encrypts them' },\n ],\n otel: [\n { envVar: 'OTEL_EXPORTER_OTLP_ENDPOINT', required: true, description: 'OpenTelemetry collector endpoint' },\n { envVar: 'OTEL_SERVICE_NAME', required: false, description: 'Service name for traces' },\n ],\n cli: [],\n // No fixed env vars — connection strings are resolved per-query from the\n // caller-supplied connectionRef, so credentials cannot be declared statically.\n database: [],\n wikimedia: [\n { envVar: 'WIKIMEDIA_USER_AGENT', required: false, description: 'Descriptive User-Agent for the Wikipedia API' },\n { envVar: 'WIKIMEDIA_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n iconify: [\n { envVar: 'ICONIFY_USER_AGENT', required: false, description: 'User-Agent for the Iconify API' },\n { envVar: 'ICONIFY_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n arxiv: [\n { envVar: 'ARXIV_TIMEOUT_MS', required: false, description: 'Per-request timeout (ms)' },\n ],\n};\n\n/**\n * Declared side-effect-free \"Test connection\" probes, executed by the\n * `credentials.test` action through the normal factory path. Only services\n * with a genuinely cheap, read-only, env-defaulted action carry one; the\n * rest report credential presence + constructor validation.\n */\n/**\n * One inbound-hook mount a service's provider needs in a deployed app:\n * `POST /api/hooks/:provider` verified by the provider's own token/signature,\n * dispatching `event` onto the app bus. A hook is a PROVIDER property — the\n * service invocation is the `.lolo` surface; codegen derives the mount from\n * the app's invoked services × these declarations (I-26).\n */\nexport interface HookDeclaration {\n /** Provider key mounted at POST /api/hooks/:provider */\n provider: string;\n /** Bus event dispatched into the app on a verified callback */\n event: string;\n /** Env var carrying the provider's verification secret/channel token */\n credentialEnv: string;\n /** Factory export in @almadar/integrations: (secret?) => HookProvider */\n providerExport: string;\n}\n\n/**\n * Inbound-hook declarations per service — the single source the registry,\n * codegen, and the playground mount derive from.\n */\nexport const serviceHooks: Record<string, HookDeclaration[]> = {\n calendar: [\n {\n provider: 'google-calendar',\n event: 'CAL_REMOTE_CHANGED',\n credentialEnv: 'GOOGLE_CALENDAR_CHANNEL_TOKEN',\n providerExport: 'googleCalendarHookProvider',\n },\n ],\n};\n\nexport const serviceProbes: Partial<Record<IntegrationName, { action: string; params: ServiceParams }>> = {\n calendar: { action: 'listEvents', params: { maxResults: 1 } },\n drive: { action: 'listFiles', params: { maxResults: 1 } },\n metaAds: { action: 'listCampaigns', params: {} },\n};\n\n/** Backend maturity grade of an integration implementation. */\nexport type IntegrationBackendGrade = 'production' | 'simulated' | 'stub';\n\n/**\n * Honest backend grade per integration — 'simulated' marks an in-memory\n * implementation that must never be mistaken for a real backend. Synced into\n * services-registry.json (`backend`) by `almadar-sync services` and surfaced\n * by the verify service manifest and /health.\n */\nexport const serviceBackends: Record<IntegrationName, IntegrationBackendGrade> = {\n github: 'production',\n stripe: 'production',\n llm: 'production',\n ml: 'production',\n youtube: 'production',\n twilio: 'production',\n email: 'production',\n webhook: 'production',\n push: 'production',\n calendar: 'production',\n drive: 'production',\n metaAds: 'production',\n accounting: 'production',\n banking: 'production',\n esign: 'production',\n docker: 'simulated',\n storage: 'production',\n queue: 'simulated',\n redis: 'simulated',\n oauth: 'production',\n credentials: 'production',\n otel: 'simulated',\n cli: 'production',\n deepagent: 'production',\n database: 'production',\n wikimedia: 'production',\n iconify: 'production',\n arxiv: 'production',\n};\n","import { createLogger, type Logger } from '@almadar/logger';\nimport type { IntegrationLogger, LogMeta } from '../types';\n\n/**\n * Console-based logger implementation.\n *\n * Routes through `@almadar/logger`'s shared gate so namespace filtering\n * (`ALMADAR_DEBUG`, `globalThis.__ALMADAR_DEBUG__`) and the production\n * level default (WARN+) apply uniformly with the rest of `@almadar/*`.\n *\n * The constructor's `level` argument is retained for backwards\n * compatibility but is now a no-op — the active level is owned by the\n * shared logger (compile-time + env). To filter integration logs at\n * runtime, set `globalThis.__ALMADAR_DEBUG__ = 'almadar:integrations:*'`.\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private readonly log: Logger;\n\n constructor(_level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n void _level;\n this.log = createLogger('almadar:integrations');\n }\n\n debug(message: string, meta?: LogMeta): void {\n this.log.debug(message, meta);\n }\n info(message: string, meta?: LogMeta): void {\n this.log.info(message, meta);\n }\n warn(message: string, meta?: LogMeta): void {\n this.log.warn(message, meta);\n }\n error(message: string, meta?: LogMeta): void {\n this.log.error(message, meta);\n }\n}\n","import type { ValidationResult, ValidationError, IntegrationParams } from '../types';\n\n// Import integrators registry from the package main export (JSON is inlined in the bundle)\nimport { integratorsRegistry } from '@almadar/core/patterns';\n\ninterface ActionParam {\n name: string;\n type: string;\n required?: boolean;\n description?: string;\n}\n\ninterface ActionDef {\n name: string;\n description?: string;\n params: ActionParam[];\n}\n\ninterface IntegratorEntry {\n name: string;\n description?: string;\n category?: string;\n actions: ActionDef[];\n}\n\ntype IntegratorsRegistry = Record<string, {\n version?: string;\n exportedAt?: string;\n integrators: Record<string, IntegratorEntry>;\n}>;\n\n/** Envelope keys owned by the call-service form, never action params. */\nconst RESERVED_ENVELOPE_KEYS = new Set(['emit', 'onSuccess', 'onError', 'timeout']);\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: IntegrationParams,\n): ValidationResult {\n const typedRegistry = integratorsRegistry as IntegratorsRegistry[string];\n const registry = typedRegistry.integrators[integration];\n\n if (!registry) {\n return {\n valid: false,\n errors: [\n {\n param: 'integration',\n message: `Unknown integration: ${integration}`,\n },\n ],\n };\n }\n\n const actionDef = registry.actions.find((a: ActionDef) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Unknown-key check (I-13 runtime parity with orb validate): a param the\n // contract does not declare is an error, not a silent drop. Envelope keys\n // belong to the call-service form itself, never to the action contract.\n const declaredNames = new Set(actionDef.params.map((p: ActionParam) => p.name));\n for (const key of Object.keys(params)) {\n if (RESERVED_ENVELOPE_KEYS.has(key)) continue;\n if (!declaredNames.has(key)) {\n errors.push({\n param: key,\n message: `Unknown parameter: ${key} (declared: ${[...declaredNames].sort().join(', ')})`,\n });\n }\n }\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n IntegrationParams,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\nimport type { IntegrationCallContext } from '../factory';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action. `context` carries the caller's identity when the host\n * supplies one; integrations that gate actions by role read it and fail\n * closed when it is absent.\n */\n abstract execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: IntegrationParams,\n ): ReturnType<typeof validateParams> {\n return validateParams(this.config.name, action, params);\n }\n\n /**\n * Handle errors uniformly\n */\n protected handleError(action: string, error: unknown): IntegrationResult {\n this.logger.error(`Integration error in ${this.config.name}.${action}`, {\n error: error instanceof Error ? error : new Error(String(error)),\n });\n\n const integrationError =\n error instanceof Error\n ? error\n : new Error(String(error));\n\n return {\n success: false,\n error: integrationError as IntegrationError,\n metadata: this.createMetadata(action, 0, 0),\n };\n }\n\n /**\n * Create metadata for result\n */\n protected createMetadata(\n action: string,\n duration: number,\n retries: number = 0,\n ): IntegrationResult['metadata'] {\n return {\n integration: this.config.name,\n action,\n duration,\n retries,\n timestamp: Date.now(),\n };\n }\n\n /**\n * Execute with retry logic\n */\n protected async executeWithRetry<T>(\n fn: () => Promise<T>,\n ): Promise<T> {\n if (!this.config.retry) {\n return fn();\n }\n\n return withRetry(fn, {\n maxAttempts: this.config.retry.maxAttempts,\n backoffMs: this.config.retry.backoffMs,\n maxBackoffMs: this.config.retry.maxBackoffMs,\n retryableErrors: [\n 'TIMEOUT_ERROR',\n 'NETWORK_ERROR',\n 'RATE_LIMIT_ERROR',\n ],\n });\n }\n}\n","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 * Optional per-call context for principal-scoped resolution (W4) and\n * caller-identity enforcement (I-25). The default — absent — means the\n * tenant/app-wide credential set with an anonymous caller; role-gated\n * integrations (credentials) fail closed without it. Additive: every\n * existing call site is untouched.\n */\nexport interface IntegrationCallContext {\n principal?: string;\n /** The caller's roster role, from the same identity entity-ACL enforces against. */\n role?: string;\n}\n\n/** Cache key for (name, principal?) — NUL never appears in either part. */\nfunction instanceKey(name: string, principal?: string): string {\n return principal ? `${name}\\u0000${principal}` : name;\n}\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). A `principal` scopes\n * the config to that principal; the app-wide config (no principal) is the\n * fallback for every principal.\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>, principal?: string): void {\n this.configs.set(instanceKey(name, principal), { name, ...config });\n }\n\n /**\n * Get or create an integration instance. Principal-scoped lookups fall\n * back to the app-wide config when no per-principal config exists.\n */\n get(name: string, principal?: string): BaseIntegration {\n const key = instanceKey(name, principal);\n const cached = this.instances.get(key);\n if (cached) {\n return cached;\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 — per-principal first, app-wide fallback\n const config = this.configs.get(key) ?? 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(key, 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 context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration, context?.principal);\n return await instance.execute(action, params, context);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string, principal?: string): boolean {\n return this.configs.has(instanceKey(name, principal)) || this.configs.has(name);\n }\n\n /**\n * Register an integration instance directly (used by mock infrastructure)\n */\n registerInstance(name: string, instance: BaseIntegration, principal?: string): void {\n this.instances.set(instanceKey(name, principal), instance);\n }\n\n /**\n * Drop the cached instance(s) for a name so the next `get` rebuilds from\n * the current config — how a credential change goes live without restart.\n * Configs are kept; without a name, every instance is dropped.\n */\n invalidate(name?: string): void {\n if (name === undefined) {\n this.instances.clear();\n return;\n }\n for (const key of this.instances.keys()) {\n if (key === name || key.startsWith(`${name}\\u0000`)) {\n this.instances.delete(key);\n }\n }\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","import { createCipheriv, createDecipheriv, createHash, randomBytes } from 'node:crypto';\nimport type { EntityRow } from '@almadar/core';\n\n/** Entity type the credential rows persist under (never a `.lolo`-declared entity). */\nexport const CREDENTIAL_ENTITY_TYPE = 'AlmadarIntegrationCredential';\n\n/** Env var holding the 64-char-hex AES-256 master key (Secret Manager in production). */\nexport const CREDENTIAL_MASTER_KEY_ENV = 'ALMADAR_CREDENTIAL_MASTER_KEY';\n\n/**\n * Env var holding the PREVIOUS master key during a rotation window (I-28):\n * decryption tries the row's stamped key, `rotate()` re-encrypts every row\n * under the current key, then the previous key is retired from the env.\n */\nexport const CREDENTIAL_PREVIOUS_MASTER_KEY_ENV = 'ALMADAR_CREDENTIAL_MASTER_KEY_PREVIOUS';\n\nconst ENCRYPTION_ALGORITHM = 'aes-256-gcm';\n\n/**\n * Structural subset of `@almadar/runtime`'s `PersistenceAdapter` — declared\n * here because the dependency axis runs integrations → runtime, never the\n * reverse. Every `PersistenceAdapter` implementation satisfies it as-is.\n */\nexport interface CredentialPersistence {\n create(entityType: string, data: EntityRow): Promise<{ id: string }>;\n update(entityType: string, id: string, data: EntityRow): Promise<void>;\n delete(entityType: string, id: string): Promise<void>;\n list(entityType: string): Promise<EntityRow[]>;\n}\n\n/** Masked view of one stored credential — safe to return to a settings page. */\nexport interface CredentialEntry {\n service: string;\n envVar: string;\n last4: string;\n updatedAt: number;\n}\n\ninterface StoredCredential extends CredentialEntry {\n id: string;\n value: string;\n}\n\nfunction isNonEmptyString(v: EntityRow[string]): v is string {\n return typeof v === 'string' && v.length > 0;\n}\n\n/** Stable non-secret fingerprint of a master key, stamped on rows as `keyId`. */\nfunction keyIdOf(masterKeyHex: string): string {\n return createHash('sha256').update(masterKeyHex, 'hex').digest('hex').slice(0, 16);\n}\n\nconst MASTER_KEY_SHAPE = /^[0-9a-fA-F]{64}$/;\n\n/**\n * Tenant-scoped (app-wide) credential store: one AES-256-GCM-encrypted row\n * per (service, envVar) through the host's persistence adapter, master key\n * `ALMADAR_CREDENTIAL_MASTER_KEY` held alone in the platform secret store.\n *\n * Resolution contract: credential keys ARE env-var names (the same names\n * `serviceCredentials` declares and `connectionRef` carries), so a stored\n * value transparently shadows its env counterpart — store → env →\n * unconfigured, everywhere.\n *\n * `warm()` decrypts all rows into memory so resolution stays synchronous;\n * every write re-warms the affected entry and notifies subscribers (the\n * `RuntimeIntegrationManager` re-configures on that signal, so new keys go\n * live without a restart).\n */\nexport class CredentialStore {\n private readonly adapter: CredentialPersistence;\n private readonly masterKeyHex: string | undefined;\n private readonly previousKeyHex: string | undefined;\n private readonly byEnvVar = new Map<string, StoredCredential>();\n private readonly listeners = new Set<() => void>();\n private warmed = false;\n\n constructor(adapter: CredentialPersistence, masterKey?: string, previousMasterKey?: string) {\n this.adapter = adapter;\n const key = masterKey ?? process.env[CREDENTIAL_MASTER_KEY_ENV];\n const valid = typeof key === 'string' && MASTER_KEY_SHAPE.test(key);\n if (!valid && process.env.NODE_ENV === 'production') {\n throw new Error(\n `${CREDENTIAL_MASTER_KEY_ENV} must be a 64-character hex string (32 bytes) in production — ` +\n 'generate one with: node -e \"console.log(require(\\'crypto\\').randomBytes(32).toString(\\'hex\\'))\"',\n );\n }\n this.masterKeyHex = valid ? key : undefined;\n const prev = previousMasterKey ?? process.env[CREDENTIAL_PREVIOUS_MASTER_KEY_ENV];\n this.previousKeyHex = typeof prev === 'string' && MASTER_KEY_SHAPE.test(prev) ? prev : undefined;\n }\n\n /** True when a valid master key is present (writes and decryption enabled). */\n get enabled(): boolean {\n return this.masterKeyHex !== undefined;\n }\n\n /** Subscribe to credential changes; returns an unsubscribe function. */\n subscribe(listener: () => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n private notify(): void {\n for (const listener of this.listeners) listener();\n }\n\n private encrypt(plaintext: string): { ciphertext: string; iv: string; authTag: string; keyId: string } {\n if (!this.masterKeyHex) {\n throw new Error(`${CREDENTIAL_MASTER_KEY_ENV} is not configured — cannot store credentials`);\n }\n const iv = randomBytes(12);\n const cipher = createCipheriv(ENCRYPTION_ALGORITHM, Buffer.from(this.masterKeyHex, 'hex'), iv);\n let ciphertext = cipher.update(plaintext, 'utf8', 'hex');\n ciphertext += cipher.final('hex');\n return {\n ciphertext,\n iv: iv.toString('hex'),\n authTag: cipher.getAuthTag().toString('hex'),\n keyId: keyIdOf(this.masterKeyHex),\n };\n }\n\n private decryptWithKey(\n keyHex: string,\n ciphertext: string,\n ivHex: string,\n authTagHex: string,\n ): string {\n const decipher = createDecipheriv(\n ENCRYPTION_ALGORITHM,\n Buffer.from(keyHex, 'hex'),\n Buffer.from(ivHex, 'hex'),\n );\n decipher.setAuthTag(Buffer.from(authTagHex, 'hex'));\n let plaintext = decipher.update(ciphertext, 'hex', 'utf8');\n plaintext += decipher.final('utf8');\n return plaintext;\n }\n\n /**\n * Decrypt one row, selecting the key by the row's stamped `keyId` (I-28):\n * current key first, then the rotation-window previous key. Legacy rows\n * (no `keyId`) try current then previous. Returns null when no held key\n * decrypts the row — the row is unreadable, never silently wrong (GCM\n * auth tags make a wrong-key success impossible).\n */\n private decryptRow(\n ciphertext: string,\n ivHex: string,\n authTagHex: string,\n rowKeyId?: string,\n ): string | null {\n if (!this.masterKeyHex) {\n throw new Error(`${CREDENTIAL_MASTER_KEY_ENV} is not configured — cannot decrypt credentials`);\n }\n const candidates: string[] = [];\n if (rowKeyId === undefined || rowKeyId === keyIdOf(this.masterKeyHex)) {\n candidates.push(this.masterKeyHex);\n }\n if (\n this.previousKeyHex !== undefined &&\n (rowKeyId === undefined || rowKeyId === keyIdOf(this.previousKeyHex))\n ) {\n candidates.push(this.previousKeyHex);\n }\n for (const key of candidates) {\n try {\n return this.decryptWithKey(key, ciphertext, ivHex, authTagHex);\n } catch {\n // wrong key — try the next candidate\n }\n }\n return null;\n }\n\n /**\n * Load and decrypt every stored row into memory. Returns the number of\n * resolvable credentials. Without a master key nothing decrypts (rows are\n * left in place, resolution falls through to env).\n */\n async warm(): Promise<number> {\n this.byEnvVar.clear();\n this.warmed = true;\n if (!this.enabled) return 0;\n const rows = await this.adapter.list(CREDENTIAL_ENTITY_TYPE);\n for (const row of rows) {\n const { id, service, envVar, ciphertext, iv, authTag } = row;\n if (\n !isNonEmptyString(id) ||\n !isNonEmptyString(service) ||\n !isNonEmptyString(envVar) ||\n !isNonEmptyString(ciphertext) ||\n !isNonEmptyString(iv) ||\n !isNonEmptyString(authTag)\n ) {\n continue;\n }\n const value = this.decryptRow(\n ciphertext,\n iv,\n authTag,\n isNonEmptyString(row.keyId) ? row.keyId : undefined,\n );\n if (value === null) continue;\n this.byEnvVar.set(envVar, {\n id,\n service,\n envVar,\n value,\n last4: value.slice(-4),\n updatedAt: typeof row.updatedAt === 'number' ? row.updatedAt : 0,\n });\n }\n return this.byEnvVar.size;\n }\n\n /** Resolve one credential by env-var name (warmed values only). */\n resolve(envVar: string): string | undefined {\n return this.byEnvVar.get(envVar)?.value;\n }\n\n /** All warmed values as an env-shaped map, for merging over the process env. */\n snapshotEnv(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const [envVar, entry] of this.byEnvVar) env[envVar] = entry.value;\n return env;\n }\n\n /** Masked entries for display — never includes plaintext. */\n entries(): CredentialEntry[] {\n return Array.from(this.byEnvVar.values())\n .map(({ service, envVar, last4, updatedAt }) => ({ service, envVar, last4, updatedAt }))\n .sort((a, b) => a.service.localeCompare(b.service) || a.envVar.localeCompare(b.envVar));\n }\n\n /** Upsert one credential (encrypts, persists, re-warms the entry, notifies). */\n async set(service: string, envVar: string, value: string): Promise<CredentialEntry> {\n if (!this.warmed) await this.warm();\n const { ciphertext, iv, authTag, keyId } = this.encrypt(value);\n const updatedAt = Date.now();\n const existing = this.byEnvVar.get(envVar);\n const data: EntityRow = { service, envVar, ciphertext, iv, authTag, keyId, updatedAt };\n let id: string;\n if (existing) {\n id = existing.id;\n await this.adapter.update(CREDENTIAL_ENTITY_TYPE, id, data);\n } else {\n ({ id } = await this.adapter.create(CREDENTIAL_ENTITY_TYPE, data));\n }\n const entry: StoredCredential = { id, service, envVar, value, last4: value.slice(-4), updatedAt };\n this.byEnvVar.set(envVar, entry);\n this.notify();\n const { service: s, envVar: e, last4, updatedAt: u } = entry;\n return { service: s, envVar: e, last4, updatedAt: u };\n }\n\n /**\n * Re-encrypt every readable row under the CURRENT master key (I-28).\n * Rotation window: deploy the new key as `ALMADAR_CREDENTIAL_MASTER_KEY`\n * with the old one as `..._PREVIOUS`, call `rotate()`, then retire the\n * previous key. Rows no held key can read are counted, never dropped.\n */\n async rotate(): Promise<{ rotated: number; alreadyCurrent: number; unreadable: number }> {\n if (!this.masterKeyHex) {\n throw new Error(`${CREDENTIAL_MASTER_KEY_ENV} is not configured — cannot rotate`);\n }\n const currentKeyId = keyIdOf(this.masterKeyHex);\n let rotated = 0;\n let alreadyCurrent = 0;\n let unreadable = 0;\n const rows = await this.adapter.list(CREDENTIAL_ENTITY_TYPE);\n for (const row of rows) {\n const { id, service, envVar, ciphertext, iv, authTag } = row;\n if (\n !isNonEmptyString(id) ||\n !isNonEmptyString(service) ||\n !isNonEmptyString(envVar) ||\n !isNonEmptyString(ciphertext) ||\n !isNonEmptyString(iv) ||\n !isNonEmptyString(authTag)\n ) {\n unreadable += 1;\n continue;\n }\n const rowKeyId = isNonEmptyString(row.keyId) ? row.keyId : undefined;\n if (rowKeyId === currentKeyId) {\n alreadyCurrent += 1;\n continue;\n }\n const value = this.decryptRow(ciphertext, iv, authTag, rowKeyId);\n if (value === null) {\n unreadable += 1;\n continue;\n }\n if (rowKeyId === undefined && this.decryptRow(ciphertext, iv, authTag, currentKeyId) !== null) {\n // Legacy row already under the current key — just stamp it.\n alreadyCurrent += 1;\n await this.adapter.update(CREDENTIAL_ENTITY_TYPE, id, { ...row, keyId: currentKeyId });\n continue;\n }\n const fresh = this.encrypt(value);\n await this.adapter.update(CREDENTIAL_ENTITY_TYPE, id, {\n service,\n envVar,\n ciphertext: fresh.ciphertext,\n iv: fresh.iv,\n authTag: fresh.authTag,\n keyId: fresh.keyId,\n updatedAt: Date.now(),\n });\n rotated += 1;\n }\n await this.warm();\n this.notify();\n return { rotated, alreadyCurrent, unreadable };\n }\n\n /** Delete one credential row; resolution falls back to env afterwards. */\n async remove(envVar: string): Promise<boolean> {\n if (!this.warmed) await this.warm();\n const existing = this.byEnvVar.get(envVar);\n if (!existing) return false;\n await this.adapter.delete(CREDENTIAL_ENTITY_TYPE, existing.id);\n this.byEnvVar.delete(envVar);\n this.notify();\n return true;\n }\n}\n","import type { CredentialStore } from './store';\nimport type { IntegrationFactory } from '../factory';\n\nlet installedStore: CredentialStore | null = null;\nlet activeFactory: IntegrationFactory | null = null;\n\n/**\n * The factory the host's `RuntimeIntegrationManager` configures — installed\n * by its constructor so the `credentials.test` probe executes through the\n * SAME factory (and therefore the same configs) as every other call-service.\n */\nexport function installActiveFactory(factory: IntegrationFactory): void {\n activeFactory = factory;\n}\n\nexport function getActiveFactory(): IntegrationFactory | null {\n return activeFactory;\n}\n\n/**\n * Install the host's credential store as the process-wide resolution source.\n * Called once at boot (playground / generated server) after the store is\n * constructed over the host's persistence adapter.\n */\nexport function installCredentialStore(store: CredentialStore): void {\n installedStore = store;\n}\n\n/** The installed store, for the credentials admin service. */\nexport function getInstalledCredentialStore(): CredentialStore | null {\n return installedStore;\n}\n\n/** Testing/reset hook. */\nexport function uninstallCredentialStore(): void {\n installedStore = null;\n}\n\n/**\n * The one credential-reference resolver: store → env → undefined.\n * `ref` is an env-var name — the same name `serviceCredentials` declares and\n * `connectionRef` params carry. Every place that used to read\n * `process.env[ref]` for a credential routes through here.\n */\nexport function resolveCredentialRef(\n ref: string,\n env: Record<string, string | undefined> = process.env,\n): string | undefined {\n return installedStore?.resolve(ref) ?? env[ref];\n}\n","import { mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { EntityRow } from '@almadar/core';\nimport type { CredentialPersistence } from './store';\n\n/** Env var overriding where the dev credential file lives. */\nexport const CREDENTIALS_FILE_ENV = 'ALMADAR_CREDENTIALS_FILE';\n\nconst DEFAULT_RELATIVE_PATH = join('.almadar', 'dev-credentials.json');\n\n/**\n * File-backed `CredentialPersistence` for dev store-first mode (I-31): rows\n * survive playground restarts so the encrypt-at-rest path is exercised on\n * every dev run, exactly like a deployed app's Firestore-backed store. Rows\n * arrive already encrypted (ciphertext/iv/authTag) — this adapter never sees\n * plaintext. Writes are atomic (tmp file + rename). Never use in production.\n */\nexport class FileCredentialPersistence implements CredentialPersistence {\n private readonly path: string;\n private counter = 0;\n\n constructor(path?: string) {\n this.path =\n path ?? process.env[CREDENTIALS_FILE_ENV] ?? join(process.cwd(), DEFAULT_RELATIVE_PATH);\n }\n\n get filePath(): string {\n return this.path;\n }\n\n private load(): Map<string, EntityRow> {\n try {\n const raw = readFileSync(this.path, 'utf-8');\n const rows = JSON.parse(raw) as EntityRow[];\n const map = new Map<string, EntityRow>();\n for (const row of rows) {\n if (typeof row.id === 'string') map.set(row.id, row);\n }\n return map;\n } catch {\n return new Map();\n }\n }\n\n private save(rows: Map<string, EntityRow>): void {\n mkdirSync(dirname(this.path), { recursive: true });\n const tmp = `${this.path}.tmp`;\n writeFileSync(tmp, JSON.stringify([...rows.values()], null, 2), 'utf-8');\n renameSync(tmp, this.path);\n }\n\n async create(entityType: string, data: EntityRow): Promise<{ id: string }> {\n const rows = this.load();\n const id = `${entityType}-${Date.now()}-${++this.counter}`;\n rows.set(id, { ...data, id });\n this.save(rows);\n return { id };\n }\n\n async update(_entityType: string, id: string, data: EntityRow): Promise<void> {\n const rows = this.load();\n const existing = rows.get(id);\n if (existing) {\n rows.set(id, { ...existing, ...data, id });\n this.save(rows);\n }\n }\n\n async delete(_entityType: string, id: string): Promise<void> {\n const rows = this.load();\n if (rows.delete(id)) this.save(rows);\n }\n\n async list(_entityType: string): Promise<EntityRow[]> {\n return [...this.load().values()];\n }\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, from } = params;\n\n this.logger.debug('Sending SMS', { to: String(to ?? '') });\n\n const message = await this.client.messages.create({\n from: (from as string) || 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, htmlBody, replyTo, templateId } = params;\n\n this.logger.debug('Sending email', { to: String(to), subject: String(subject), provider: this.provider });\n\n const message: SendMessage = {\n to: to as string,\n subject: subject as string,\n body: body as string,\n from: (from as string) || this.fromEmail,\n htmlBody: (htmlBody as string) || undefined,\n replyTo: (replyTo as string) || undefined,\n templateId: (templateId as string) || undefined,\n };\n\n if (this.provider === 'sendgrid') {\n return await this.sendViaSendGrid(message);\n } else if (this.provider === 'resend') {\n return await this.sendViaResend(message);\n }\n\n throw new Error(`Unknown email provider: ${this.provider}`);\n }\n\n private async sendViaSendGrid(message: SendMessage) {\n const msg = {\n to: message.to,\n from: message.from,\n subject: message.subject,\n // htmlBody present → it carries the HTML and body becomes the\n // plain-text alternative; absent → body renders as HTML (legacy).\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n ...(message.templateId ? { templateId: message.templateId } : {}),\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(message: SendMessage) {\n if (!this.resendClient) {\n throw new Error('Resend client not initialized');\n }\n if (message.templateId) {\n // Resend's send API has no template reference — silently ignoring the\n // author's template intent would be a dropped feature.\n throw new Error('templateId is not supported by the resend provider — use sendgrid or drop templateId');\n }\n\n const response = await this.resendClient.emails.send({\n from: message.from,\n to: message.to,\n subject: message.subject,\n html: message.htmlBody ?? message.body,\n ...(message.htmlBody ? { text: message.body } : {}),\n ...(message.replyTo ? { replyTo: message.replyTo } : {}),\n });\n\n return {\n id: response.data?.id,\n status: 'sent',\n };\n }\n}\n\ninterface SendMessage {\n to: string;\n subject: string;\n body: string;\n from: string;\n htmlBody?: string;\n replyTo?: string;\n templateId?: string;\n}\n\n// Auto-register\nregisterIntegration('email', EmailIntegration);\n","import { createHmac } from 'node:crypto';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Outbound webhook integration — signed HTTP POST notifications to external endpoints.\n */\nexport class WebhookIntegration extends BaseIntegration {\n private signingSecret: string;\n private timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.signingSecret = config.env.WEBHOOK_SIGNING_SECRET || '';\n this.timeoutMs = Number(config.env.WEBHOOK_TIMEOUT_MS) || 10000;\n\n this.logger.info('Webhook integration initialized');\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 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 { url, event, payload, secret } = params;\n\n const body = JSON.stringify({\n event: event as string,\n payload: payload ?? {},\n timestamp: new Date().toISOString(),\n });\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Almadar-Event': event as string,\n };\n\n const signingSecret = (secret as string) || this.signingSecret;\n if (signingSecret) {\n headers['X-Almadar-Signature'] =\n 'sha256=' + createHmac('sha256', signingSecret).update(body).digest('hex');\n }\n\n this.logger.debug('Sending webhook', { url: String(url), event: String(event) });\n\n const startTime = Date.now();\n const response = await fetch(url as string, {\n method: 'POST',\n headers,\n body,\n signal: AbortSignal.timeout(this.timeoutMs),\n });\n\n // 5xx should retry via executeWithRetry; 4xx is a caller error and must not.\n if (response.status >= 500) {\n throw new Error(`Webhook endpoint returned ${response.status}`);\n }\n\n return {\n status: response.status,\n ok: response.ok,\n durationMs: Date.now() - startTime,\n };\n }\n}\n\n// Auto-register\nregisterIntegration('webhook', WebhookIntegration);\n","import webpush from 'web-push';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\ninterface PushSubscriptionParam {\n endpoint: string;\n keys: { p256dh: string; auth: string };\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toSubscription(value: IntegrationParamValue | undefined): PushSubscriptionParam {\n if (isParamRecord(value)) {\n const { endpoint, keys } = value;\n if (typeof endpoint === 'string' && isParamRecord(keys)) {\n const { p256dh, auth } = keys;\n if (typeof p256dh === 'string' && typeof auth === 'string') {\n return { endpoint, keys: { p256dh, auth } };\n }\n }\n }\n throw new Error('push.send: subscription must be { endpoint, keys: { p256dh, auth } }');\n}\n\n/**\n * Web Push integration — VAPID-signed push notifications to browser\n * PushSubscription endpoints. VAPID details are passed per call (never via the\n * web-push module singleton) so concurrent configs cannot contaminate each other.\n */\nexport class PushIntegration extends BaseIntegration {\n private vapidPublicKey: string;\n private vapidPrivateKey: string;\n private vapidSubject: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.vapidPublicKey = config.env.VAPID_PUBLIC_KEY || '';\n this.vapidPrivateKey = config.env.VAPID_PRIVATE_KEY || '';\n this.vapidSubject = config.env.VAPID_SUBJECT || '';\n\n this.logger.info('Push integration initialized');\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 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 { subscription, title, body, url, icon } = params;\n const sub = toSubscription(subscription);\n\n const payload = JSON.stringify({\n title: title as string,\n body: body as string,\n url: (url as string) || undefined,\n icon: (icon as string) || undefined,\n });\n\n this.logger.debug('Sending push notification', { endpoint: sub.endpoint });\n\n try {\n const response = await webpush.sendNotification(sub, payload, {\n vapidDetails: {\n subject: this.vapidSubject,\n publicKey: this.vapidPublicKey,\n privateKey: this.vapidPrivateKey,\n },\n });\n return { statusCode: response.statusCode, ok: true, expired: false };\n } catch (error) {\n if (error instanceof webpush.WebPushError) {\n // 5xx retries via executeWithRetry; 404/410 means the subscription is\n // gone — the caller must prune the stored row, never retry.\n if (error.statusCode >= 500) {\n throw new Error(`Push endpoint returned ${error.statusCode}`);\n }\n return {\n statusCode: error.statusCode,\n ok: false,\n expired: error.statusCode === 404 || error.statusCode === 410,\n };\n }\n throw error;\n }\n }\n}\n\n// Auto-register\nregisterIntegration('push', PushIntegration);\n","/**\n * Verify + parse Google Calendar push notifications (watch channels) into the\n * canonical Almadar hook event. Google sends NO body — everything rides the\n * `X-Goog-*` headers — and offers no HMAC; the only verifiable secret is the\n * channel token we supplied at `calendar.watch` time, so pass `expectedToken`\n * whenever the watch was registered with one.\n *\n * The googleapis SDK never appears here or in any route — this module is the\n * whole provider surface, mirroring `stripe/webhooks.ts`.\n */\n\nexport type CalendarHookEvent =\n | {\n type: 'calendar.changed';\n channelId: string;\n resourceId: string;\n /** `sync` (channel handshake), `exists`, or `not_exists`. */\n resourceState: string;\n messageNumber: number;\n }\n | { error: 'missing-headers' }\n | { error: 'bad-token' };\n\n/** Case-insensitive header lookup over a plain header record. */\nfunction header(headers: Record<string, string | undefined>, name: string): string {\n const direct = headers[name] ?? headers[name.toLowerCase()];\n if (direct !== undefined) return direct;\n const found = Object.keys(headers).find((k) => k.toLowerCase() === name.toLowerCase());\n return (found !== undefined ? headers[found] : undefined) ?? '';\n}\n\nexport function parseCalendarPushNotification(\n headers: Record<string, string | undefined>,\n expectedToken?: string,\n): CalendarHookEvent {\n const channelId = header(headers, 'x-goog-channel-id');\n const resourceId = header(headers, 'x-goog-resource-id');\n const resourceState = header(headers, 'x-goog-resource-state');\n if (!channelId || !resourceId || !resourceState) {\n return { error: 'missing-headers' };\n }\n if (expectedToken && header(headers, 'x-goog-channel-token') !== expectedToken) {\n return { error: 'bad-token' };\n }\n return {\n type: 'calendar.changed',\n channelId,\n resourceId,\n resourceState,\n messageNumber: Number(header(headers, 'x-goog-message-number')) || 0,\n };\n}\n\n/**\n * Hook-provider adapter for the shared `/api/hooks/:provider` ingress: maps a\n * Google Calendar push notification to the bus event `CAL_REMOTE_CHANGED`\n * consumed by `std-calendar-sync`. The `sync` handshake message acknowledges\n * without dispatching (it announces the channel, not a data change).\n */\nexport function googleCalendarHookProvider(expectedToken?: string) {\n return (input: { headers: Record<string, string | undefined>; rawBody: string }):\n | { event: string; payload: { channelId: string; resourceId: string; resourceState: string } }\n | { error: string }\n | { ack: true } => {\n const parsed = parseCalendarPushNotification(input.headers, expectedToken);\n if ('error' in parsed) return { error: parsed.error };\n if (parsed.resourceState === 'sync') return { ack: true };\n return {\n event: 'CAL_REMOTE_CHANGED',\n payload: {\n channelId: parsed.channelId,\n resourceId: parsed.resourceId,\n resourceState: parsed.resourceState,\n },\n };\n };\n}\n","export { parseCalendarPushNotification, googleCalendarHookProvider } from './webhooks';\nexport type { CalendarHookEvent } from './webhooks';\n\nimport { google, calendar_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Google Calendar integration — service account auth, optionally acting as a\n * Workspace user via domain-wide delegation (GOOGLE_CALENDAR_SUBJECT). All\n * event times are ISO strings on the wire; a 10-char value (YYYY-MM-DD) maps\n * to an all-day `date`, anything longer to `dateTime`.\n */\nexport class CalendarIntegration extends BaseIntegration {\n private client: calendar_v3.Calendar;\n private defaultCalendarId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_CALENDAR_SA_KEY;\n if (!rawKey) {\n throw new Error('GOOGLE_CALENDAR_SA_KEY not configured');\n }\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n\n const subject = config.env.GOOGLE_CALENDAR_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/calendar'],\n subject,\n });\n\n this.client = google.calendar({ version: 'v3', auth });\n this.defaultCalendarId = config.env.GOOGLE_CALENDAR_ID || 'primary';\n\n this.logger.info('Calendar integration initialized', {\n delegated: Boolean(subject),\n });\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 let retries = 0;\n\n try {\n let data: unknown;\n\n switch (action) {\n case 'listEvents':\n data = await this.executeWithRetry(() => this.listEvents(params));\n break;\n case 'createEvent':\n data = await this.executeWithRetry(() => this.createEvent(params));\n break;\n case 'updateEvent':\n data = await this.executeWithRetry(() => this.updateEvent(params));\n break;\n case 'deleteEvent':\n data = await this.executeWithRetry(() => this.deleteEvent(params));\n break;\n case 'freeBusy':\n data = await this.executeWithRetry(() => this.freeBusy(params));\n break;\n case 'watch':\n data = await this.executeWithRetry(() => this.watch(params));\n break;\n case 'stopWatch':\n data = await this.executeWithRetry(() => this.stopWatch(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 calendarId(params: IntegrationParams): string {\n return (params.calendarId as string) || this.defaultCalendarId;\n }\n\n private toEventTime(value: string): calendar_v3.Schema$EventDateTime {\n return value.length === 10 ? { date: value } : { dateTime: value };\n }\n\n private fromEventTime(time: calendar_v3.Schema$EventDateTime | undefined): string {\n return time?.dateTime ?? time?.date ?? '';\n }\n\n private async listEvents(params: IntegrationParams) {\n const { timeMin, timeMax, syncToken, maxResults } = params;\n const response = await this.client.events.list({\n calendarId: this.calendarId(params),\n // Incremental sync: a syncToken supersedes the window params (the API\n // rejects combining them).\n ...(syncToken\n ? { syncToken: syncToken as string }\n : {\n timeMin: (timeMin as string) || undefined,\n timeMax: (timeMax as string) || undefined,\n singleEvents: true,\n orderBy: 'startTime' as const,\n }),\n maxResults: (maxResults as number) || 250,\n });\n const items = response.data.items ?? [];\n return {\n events: items.map((event) => ({\n id: event.id ?? '',\n summary: event.summary ?? '',\n description: event.description ?? '',\n location: event.location ?? '',\n start: this.fromEventTime(event.start ?? undefined),\n end: this.fromEventTime(event.end ?? undefined),\n status: event.status ?? '',\n updated: event.updated ?? '',\n })),\n nextSyncToken: response.data.nextSyncToken ?? null,\n };\n }\n\n private resolveEnd(start: string, end: string | undefined, durationMinutes: number | undefined): string {\n if (end) return end;\n if (start.length === 10) {\n // All-day start with no end → the exclusive-end convention: next day.\n const next = new Date(Date.parse(start) + 24 * 60 * 60_000);\n return next.toISOString().slice(0, 10);\n }\n if (durationMinutes && durationMinutes > 0) {\n return new Date(Date.parse(start) + durationMinutes * 60_000).toISOString();\n }\n throw new Error('createEvent requires `end` or a positive `durationMinutes`');\n }\n\n private async createEvent(params: IntegrationParams) {\n const { summary, description, location, start, end, durationMinutes } = params;\n const response = await this.client.events.insert({\n calendarId: this.calendarId(params),\n requestBody: {\n summary: summary as string,\n description: (description as string) || undefined,\n location: (location as string) || undefined,\n start: this.toEventTime(start as string),\n end: this.toEventTime(\n this.resolveEnd(start as string, (end as string) || undefined, (durationMinutes as number) || undefined),\n ),\n },\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n htmlLink: response.data.htmlLink ?? '',\n };\n }\n\n private async updateEvent(params: IntegrationParams) {\n const { eventId, summary, description, location, start, end } = params;\n const requestBody: calendar_v3.Schema$Event = {};\n if (typeof summary === 'string') requestBody.summary = summary;\n if (typeof description === 'string') requestBody.description = description;\n if (typeof location === 'string') requestBody.location = location;\n if (typeof start === 'string' && start) requestBody.start = this.toEventTime(start);\n if (typeof end === 'string' && end) requestBody.end = this.toEventTime(end);\n const response = await this.client.events.patch({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n requestBody,\n });\n return {\n id: response.data.id ?? '',\n status: response.data.status ?? '',\n };\n }\n\n private async deleteEvent(params: IntegrationParams) {\n const { eventId } = params;\n await this.client.events.delete({\n calendarId: this.calendarId(params),\n eventId: eventId as string,\n });\n return { id: eventId as string, deleted: true };\n }\n\n private async freeBusy(params: IntegrationParams) {\n const { timeMin, timeMax } = params;\n const id = this.calendarId(params);\n const response = await this.client.freebusy.query({\n requestBody: {\n timeMin: timeMin as string,\n timeMax: timeMax as string,\n items: [{ id }],\n },\n });\n const busy = response.data.calendars?.[id]?.busy ?? [];\n return {\n busy: busy.map((slot) => ({ start: slot.start ?? '', end: slot.end ?? '' })),\n };\n }\n\n private async watch(params: IntegrationParams) {\n const { channelId, address, ttlSeconds } = params;\n const response = await this.client.events.watch({\n calendarId: this.calendarId(params),\n requestBody: {\n id: channelId as string,\n type: 'web_hook',\n address: address as string,\n params: ttlSeconds ? { ttl: String(ttlSeconds) } : undefined,\n },\n });\n return {\n channelId: response.data.id ?? (channelId as string),\n resourceId: response.data.resourceId ?? '',\n expiration: response.data.expiration ?? '',\n };\n }\n\n private async stopWatch(params: IntegrationParams) {\n const { channelId, resourceId } = params;\n await this.client.channels.stop({\n requestBody: {\n id: channelId as string,\n resourceId: resourceId as string,\n },\n });\n return { stopped: true };\n }\n}\n\n// Auto-register\nregisterIntegration('calendar', CalendarIntegration);\n","/**\n * All registered inbound-hook providers, derived from the `serviceHooks`\n * declarations (the single source the registry and codegen also derive from).\n * Hosts that serve arbitrary schemas (the playground) mount this full map;\n * generated apps get a per-app subset via the compiler's hooks-providers.ts.\n *\n * `HOOK_PROVIDER_FACTORIES` is the static factory table TypeScript needs\n * (export names cannot be resolved dynamically without casts); the drift\n * guard below fails loudly if a declaration names a factory this table lacks.\n */\n\nimport type { EventPayload } from '@almadar/core';\nimport { serviceHooks, type HookDeclaration } from './contracts';\nimport { googleCalendarHookProvider } from './integrations/calendar/webhooks';\n\nexport interface HookProviderInput {\n headers: Record<string, string | undefined>;\n rawBody: string;\n}\n\nexport type HookProviderResult =\n | { event: string; payload: EventPayload }\n | { ack: true }\n | { error: string };\n\nexport type RegisteredHookProvider = (input: HookProviderInput) => HookProviderResult;\n\nconst HOOK_PROVIDER_FACTORIES: Record<string, (secret?: string) => RegisteredHookProvider> = {\n googleCalendarHookProvider,\n};\n\n/** Every hook declaration across all services — used by the drift-guard test. */\nexport function allHookDeclarations(): HookDeclaration[] {\n return Object.values(serviceHooks).flat();\n}\n\n/**\n * Build the full provider map from every service's hook declarations,\n * resolving each provider's verification secret from `env`. Throws when a\n * declaration names a factory the table above does not carry — declaration\n * and implementation must advance together.\n */\nexport function registeredHookProviders(\n env: Record<string, string | undefined> = process.env,\n): Record<string, RegisteredHookProvider> {\n const providers: Record<string, RegisteredHookProvider> = {};\n for (const decl of allHookDeclarations()) {\n const factory = HOOK_PROVIDER_FACTORIES[decl.providerExport];\n if (!factory) {\n throw new Error(\n `serviceHooks declares provider export '${decl.providerExport}' but HOOK_PROVIDER_FACTORIES has no entry for it`,\n );\n }\n providers[decl.provider] = factory(env[decl.credentialEnv]);\n }\n return providers;\n}\n","import { Readable } from 'node:stream';\nimport { google, drive_v3 } from 'googleapis';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Google Drive integration — dual auth:\n * - **Service account** (GOOGLE_DRIVE_SA_KEY, optional GOOGLE_DRIVE_SUBJECT\n * delegation) serves reads (list/get/share).\n * - **User OAuth** (GOOGLE_DRIVE_REFRESH_TOKEN + the app's OAUTH_CLIENT_ID/\n * SECRET, obtained once via `scripts/drive-consent.mjs`) serves\n * WRITES (`uploadFile`/`createFolder`) when present — Google enforces zero\n * SA storage quota on personal accounts, so SA writes into a shared My\n * Drive folder are impossible; the user client also covers reads when no\n * SA key is configured. `GOOGLE_DRIVE_FOLDER_ID` is the default upload\n * parent. File content crosses this boundary as base64 (data URL accepted\n * on upload).\n */\nexport class DriveIntegration extends BaseIntegration {\n private readonly saClient: drive_v3.Drive | null;\n private readonly userClient: drive_v3.Drive | null;\n private readonly defaultFolderId: string | undefined;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const rawKey = config.env.GOOGLE_DRIVE_SA_KEY;\n if (rawKey) {\n const keyJson = rawKey.trim().startsWith('{')\n ? rawKey\n : Buffer.from(rawKey, 'base64').toString('utf8');\n const key = JSON.parse(keyJson) as { client_email: string; private_key: string };\n const subject = config.env.GOOGLE_DRIVE_SUBJECT || undefined;\n const auth = new google.auth.JWT({\n email: key.client_email,\n key: key.private_key,\n scopes: ['https://www.googleapis.com/auth/drive'],\n subject,\n });\n this.saClient = google.drive({ version: 'v3', auth });\n } else {\n this.saClient = null;\n }\n\n const refreshToken = config.env.GOOGLE_DRIVE_REFRESH_TOKEN;\n const clientId = config.env.OAUTH_CLIENT_ID;\n const clientSecret = config.env.OAUTH_CLIENT_SECRET;\n if (refreshToken && clientId && clientSecret) {\n const oauth2 = new google.auth.OAuth2(clientId, clientSecret);\n oauth2.setCredentials({ refresh_token: refreshToken });\n this.userClient = google.drive({ version: 'v3', auth: oauth2 });\n } else {\n this.userClient = null;\n }\n\n if (!this.saClient && !this.userClient) {\n throw new Error(\n 'Drive not configured — set GOOGLE_DRIVE_SA_KEY (reads) and/or GOOGLE_DRIVE_REFRESH_TOKEN + OAUTH_CLIENT_ID/SECRET (writes)',\n );\n }\n\n this.defaultFolderId = config.env.GOOGLE_DRIVE_FOLDER_ID || undefined;\n\n this.logger.info('Drive integration initialized', {\n serviceAccount: this.saClient !== null,\n userToken: this.userClient !== null,\n delegated: Boolean(config.env.GOOGLE_DRIVE_SUBJECT),\n });\n }\n\n /** Reads prefer the SA client (delegation-aware); user client covers its absence. */\n private readClient(): drive_v3.Drive {\n const client = this.saClient ?? this.userClient;\n if (!client) throw new Error('Drive not configured');\n return client;\n }\n\n /** Writes REQUIRE the user client on personal accounts (SA has no storage quota); SA only as a Workspace fallback. */\n private writeClient(): drive_v3.Drive {\n const client = this.userClient ?? this.saClient;\n if (!client) throw new Error('Drive not configured');\n return client;\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 'listFiles':\n data = await this.executeWithRetry(() => this.listFiles(params));\n break;\n case 'getFile':\n data = await this.executeWithRetry(() => this.getFile(params));\n break;\n case 'uploadFile':\n data = await this.executeWithRetry(() => this.uploadFile(params));\n break;\n case 'createFolder':\n data = await this.executeWithRetry(() => this.createFolder(params));\n break;\n case 'shareFile':\n data = await this.executeWithRetry(() => this.shareFile(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 listFiles(params: IntegrationParams) {\n const { folderId, query, maxResults } = params;\n const clauses = ['trashed = false'];\n if (folderId) clauses.push(`'${String(folderId).replace(/'/g, \"\\\\'\")}' in parents`);\n if (query) clauses.push(String(query));\n const response = await this.readClient().files.list({\n q: clauses.join(' and '),\n pageSize: (maxResults as number) || 100,\n fields: 'files(id, name, mimeType, size, modifiedTime, webViewLink)',\n });\n return {\n files: (response.data.files ?? []).map((file) => ({\n id: file.id ?? '',\n name: file.name ?? '',\n mimeType: file.mimeType ?? '',\n size: Number(file.size ?? 0),\n modifiedTime: file.modifiedTime ?? '',\n webViewLink: file.webViewLink ?? '',\n })),\n };\n }\n\n private async getFile(params: IntegrationParams) {\n const fileId = params.fileId as string;\n const meta = await this.readClient().files.get({\n fileId,\n fields: 'id, name, mimeType, size',\n });\n const content = await this.readClient().files.get(\n { fileId, alt: 'media' },\n { responseType: 'arraybuffer' },\n );\n const bytes = Buffer.from(content.data as ArrayBuffer);\n return {\n id: meta.data.id ?? fileId,\n name: meta.data.name ?? '',\n mimeType: meta.data.mimeType ?? 'application/octet-stream',\n content: bytes.toString('base64'),\n size: bytes.length,\n };\n }\n\n private async uploadFile(params: IntegrationParams) {\n const { name, content, mimeType, folderId } = params;\n const { bytes, contentType } = decodeContent(content as string);\n const parent = (folderId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n parents: parent ? [parent] : undefined,\n },\n media: {\n mimeType: (mimeType as string) || contentType || 'application/octet-stream',\n body: Readable.from(bytes),\n },\n fields: 'id, name, webViewLink',\n });\n return {\n id: response.data.id ?? '',\n name: response.data.name ?? (name as string),\n webViewLink: response.data.webViewLink ?? '',\n };\n }\n\n private async createFolder(params: IntegrationParams) {\n const { name, parentId } = params;\n const parent = (parentId as string | undefined) || this.defaultFolderId;\n const response = await this.writeClient().files.create({\n requestBody: {\n name: name as string,\n mimeType: 'application/vnd.google-apps.folder',\n parents: parent ? [parent] : undefined,\n },\n fields: 'id, name',\n });\n return { id: response.data.id ?? '', name: response.data.name ?? (name as string) };\n }\n\n private async shareFile(params: IntegrationParams) {\n const { fileId, email, role } = params;\n const response = await this.readClient().permissions.create({\n fileId: fileId as string,\n requestBody: {\n type: 'user',\n role: (role as string) || 'reader',\n emailAddress: email as string,\n },\n fields: 'id',\n });\n return { shared: true, permissionId: response.data.id ?? '' };\n }\n}\n\n// Auto-register\nregisterIntegration('drive', DriveIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GRAPH_BASE = 'https://graph.facebook.com/v21.0';\n\n/**\n * Meta Ads integration — Graph API Marketing Insights, READ-ONLY (spend and\n * campaign listings for profitability reporting). No SDK: plain fetch with\n * the webhook integration's 5xx-retries / 4xx-returns split.\n */\nexport class MetaAdsIntegration extends BaseIntegration {\n private accessToken: string;\n private defaultAccountId: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.accessToken = config.env.META_ACCESS_TOKEN || '';\n if (!this.accessToken) {\n throw new Error('META_ACCESS_TOKEN not configured');\n }\n this.defaultAccountId = config.env.META_AD_ACCOUNT_ID || '';\n\n this.logger.info('Meta Ads integration initialized');\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 'getSpend':\n data = await this.executeWithRetry(() => this.getSpend(params));\n break;\n case 'listCampaigns':\n data = await this.executeWithRetry(() => this.listCampaigns(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 accountId(params: IntegrationParams): string {\n const id = (params.accountId as string) || this.defaultAccountId;\n if (!id) {\n throw new Error('No ad account: pass `accountId` or set META_AD_ACCOUNT_ID');\n }\n return id.startsWith('act_') ? id : `act_${id}`;\n }\n\n private async graphGet(path: string, query: Record<string, string>): Promise<unknown> {\n const url = new URL(`${GRAPH_BASE}/${path}`);\n for (const [key, value] of Object.entries(query)) {\n url.searchParams.set(key, value);\n }\n url.searchParams.set('access_token', this.accessToken);\n const response = await fetch(url, { signal: AbortSignal.timeout(15000) });\n if (response.status >= 500) {\n // 5xx retries via executeWithRetry; 4xx is a caller/token error.\n throw new Error(`Meta Graph API returned ${response.status}`);\n }\n const body = (await response.json()) as { error?: { message?: string }; data?: unknown };\n if (!response.ok) {\n throw new Error(`Meta Graph API error: ${body.error?.message ?? response.status}`);\n }\n return body.data ?? body;\n }\n\n private async getSpend(params: IntegrationParams) {\n const { since, until } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/insights`, {\n fields: 'spend,impressions,clicks,account_currency',\n time_range: JSON.stringify({ since: since as string, until: until as string }),\n level: 'account',\n })) as Array<{ spend?: string; impressions?: string; clicks?: string; account_currency?: string }>;\n const row = Array.isArray(rows) ? rows[0] : undefined;\n return {\n spend: Number(row?.spend ?? 0),\n currency: row?.account_currency ?? '',\n impressions: Number(row?.impressions ?? 0),\n clicks: Number(row?.clicks ?? 0),\n };\n }\n\n private async listCampaigns(params: IntegrationParams) {\n const { status } = params;\n const rows = (await this.graphGet(`${this.accountId(params)}/campaigns`, {\n fields: 'id,name,status,daily_budget',\n ...(status ? { effective_status: JSON.stringify([status]) } : {}),\n })) as Array<{ id?: string; name?: string; status?: string; daily_budget?: string }>;\n return {\n campaigns: (Array.isArray(rows) ? rows : []).map((row) => ({\n id: row.id ?? '',\n name: row.name ?? '',\n status: row.status ?? '',\n // Meta reports budgets in minor units (cents).\n dailyBudget: Number(row.daily_budget ?? 0) / 100,\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('metaAds', MetaAdsIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Accounting export integration — the generic half of \"export to accounting\n * software\": shapes invoice / journal rows into import-ready CSV without\n * committing to a vendor. A `provider` field is reserved on the config for\n * direct DATEV/Xero/QuickBooks connectors later; the CSV column sets follow\n * the common import templates those systems accept.\n */\nexport class AccountingIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Accounting integration initialized (generic CSV export)');\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 'exportInvoices':\n data = this.exportRows(params.invoices, INVOICE_COLUMNS, 'invoices');\n break;\n case 'exportJournal':\n data = this.exportRows(params.entries, JOURNAL_COLUMNS, 'journal');\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 exportRows(\n rowsValue: IntegrationParamValue | undefined,\n columns: readonly string[],\n kind: string,\n ): { content: string; filename: string; count: number } {\n if (!Array.isArray(rowsValue)) {\n throw new Error(`${kind} export requires an array of rows`);\n }\n const lines = [columns.join(',')];\n for (const row of rowsValue) {\n if (row === null || typeof row !== 'object' || Array.isArray(row) || row instanceof Date) {\n throw new Error(`${kind} export: every row must be an object`);\n }\n const record = row as { readonly [key: string]: IntegrationParamValue };\n lines.push(columns.map((column) => csvCell(record[column])).join(','));\n }\n const stamp = new Date().toISOString().slice(0, 10);\n return {\n content: lines.join('\\r\\n') + '\\r\\n',\n filename: `${kind}-export-${stamp}.csv`,\n count: rowsValue.length,\n };\n }\n}\n\nconst INVOICE_COLUMNS = ['id', 'number', 'customer', 'issuedAt', 'dueAt', 'currency', 'net', 'tax', 'gross', 'status'] as const;\nconst JOURNAL_COLUMNS = ['date', 'account', 'description', 'debit', 'credit', 'reference'] as const;\n\nfunction csvCell(value: IntegrationParamValue | undefined): string {\n if (value === undefined || value === null) return '';\n const raw = value instanceof Date ? value.toISOString() : String(value);\n return /[\",\\r\\n]/.test(raw) ? `\"${raw.replace(/\"/g, '\"\"')}\"` : raw;\n}\n\n// Auto-register\nregisterIntegration('accounting', AccountingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\nconst GC_BASE = 'https://bankaccountdata.gocardless.com/api/v2';\n\n/**\n * Banking integration — GoCardless Bank Account Data (read-only requisition →\n * accounts → transactions flow feeding reconciliation). Access tokens are\n * minted per instance from the secret pair and refreshed on expiry.\n */\nexport class BankingIntegration extends BaseIntegration {\n private secretId: string;\n private secretKey: string;\n private accessToken: string | null = null;\n private accessTokenExpiresAt = 0;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.secretId = config.env.GOCARDLESS_SECRET_ID || '';\n this.secretKey = config.env.GOCARDLESS_SECRET_KEY || '';\n if (!this.secretId || !this.secretKey) {\n throw new Error('GOCARDLESS_SECRET_ID / GOCARDLESS_SECRET_KEY not configured');\n }\n\n this.logger.info('Banking integration initialized (GoCardless Bank Account Data)');\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 'createRequisition':\n data = await this.executeWithRetry(() => this.createRequisition(params));\n break;\n case 'listAccounts':\n data = await this.executeWithRetry(() => this.listAccounts(params));\n break;\n case 'listTransactions':\n data = await this.executeWithRetry(() => this.listTransactions(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 token(): Promise<string> {\n if (this.accessToken && Date.now() < this.accessTokenExpiresAt - 60_000) {\n return this.accessToken;\n }\n const response = await fetch(`${GC_BASE}/token/new/`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json', Accept: 'application/json' },\n body: JSON.stringify({ secret_id: this.secretId, secret_key: this.secretKey }),\n signal: AbortSignal.timeout(15000),\n });\n if (!response.ok) {\n throw new Error(`GoCardless token request failed: ${response.status}`);\n }\n const body = (await response.json()) as { access: string; access_expires: number };\n this.accessToken = body.access;\n this.accessTokenExpiresAt = Date.now() + body.access_expires * 1000;\n return this.accessToken;\n }\n\n private async gcRequest(path: string, init?: { method?: string; body?: unknown }): Promise<unknown> {\n const response = await fetch(`${GC_BASE}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${await this.token()}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(20000),\n });\n if (response.status >= 500) {\n throw new Error(`GoCardless returned ${response.status}`);\n }\n const body: unknown = await response.json();\n if (!response.ok) {\n throw new Error(`GoCardless error ${response.status}: ${JSON.stringify(body).slice(0, 300)}`);\n }\n return body;\n }\n\n private async createRequisition(params: IntegrationParams) {\n const { institutionId, redirectUrl, reference } = params;\n const body = (await this.gcRequest('/requisitions/', {\n method: 'POST',\n body: {\n institution_id: institutionId as string,\n redirect: redirectUrl as string,\n reference: (reference as string) || undefined,\n },\n })) as { id?: string; link?: string };\n return { requisitionId: body.id ?? '', link: body.link ?? '' };\n }\n\n private async listAccounts(params: IntegrationParams) {\n const { requisitionId } = params;\n const body = (await this.gcRequest(`/requisitions/${requisitionId as string}/`)) as { accounts?: string[] };\n return { accounts: body.accounts ?? [] };\n }\n\n private async listTransactions(params: IntegrationParams) {\n const { accountId, dateFrom, dateTo } = params;\n const query = new URLSearchParams();\n if (dateFrom) query.set('date_from', dateFrom as string);\n if (dateTo) query.set('date_to', dateTo as string);\n const suffix = query.size > 0 ? `?${query.toString()}` : '';\n const body = (await this.gcRequest(`/accounts/${accountId as string}/transactions/${suffix}`)) as {\n transactions?: {\n booked?: Array<{\n transactionId?: string;\n internalTransactionId?: string;\n transactionAmount?: { amount?: string; currency?: string };\n bookingDate?: string;\n remittanceInformationUnstructured?: string;\n creditorName?: string;\n debtorName?: string;\n }>;\n };\n };\n return {\n transactions: (body.transactions?.booked ?? []).map((tx) => ({\n id: tx.transactionId ?? tx.internalTransactionId ?? '',\n amount: Number(tx.transactionAmount?.amount ?? 0),\n currency: tx.transactionAmount?.currency ?? '',\n date: tx.bookingDate ?? '',\n description: tx.remittanceInformationUnstructured ?? '',\n counterparty: tx.creditorName ?? tx.debtorName ?? '',\n })),\n };\n }\n}\n\n// Auto-register\nregisterIntegration('banking', BankingIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * E-signature integration — DocuSign eSignature REST first, deliberately\n * provider-pluggable: the action surface (sendEnvelope / getEnvelopeStatus /\n * downloadDocument) is vendor-neutral and every DocuSign shape stays inside\n * this module. `DOCUSIGN_BASE_URL` carries the account-scoped REST base;\n * `DOCUSIGN_ACCESS_TOKEN` the OAuth token (JWT-grant rotation is the\n * deployment's concern — the token is read per call so a rotated env value\n * takes effect without restart).\n */\nexport class EsignIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n\n if (!config.env.DOCUSIGN_BASE_URL || !config.env.DOCUSIGN_ACCESS_TOKEN) {\n throw new Error('DOCUSIGN_BASE_URL / DOCUSIGN_ACCESS_TOKEN not configured');\n }\n\n this.logger.info('E-sign integration initialized (DocuSign)');\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 'sendEnvelope':\n data = await this.executeWithRetry(() => this.sendEnvelope(params));\n break;\n case 'getEnvelopeStatus':\n data = await this.executeWithRetry(() => this.getEnvelopeStatus(params));\n break;\n case 'downloadDocument':\n data = await this.executeWithRetry(() => this.downloadDocument(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 dsRequest(\n path: string,\n init?: { method?: string; body?: unknown; raw?: boolean },\n ): Promise<unknown> {\n const base = this.config.env.DOCUSIGN_BASE_URL.replace(/\\/$/, '');\n const response = await fetch(`${base}${path}`, {\n method: init?.method ?? 'GET',\n headers: {\n Accept: init?.raw ? 'application/pdf' : 'application/json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${this.config.env.DOCUSIGN_ACCESS_TOKEN}`,\n },\n body: init?.body === undefined ? undefined : JSON.stringify(init.body),\n signal: AbortSignal.timeout(30000),\n });\n if (response.status >= 500) {\n throw new Error(`DocuSign returned ${response.status}`);\n }\n if (!response.ok) {\n const detail = await response.text();\n throw new Error(`DocuSign error ${response.status}: ${detail.slice(0, 300)}`);\n }\n if (init?.raw) {\n return Buffer.from(await response.arrayBuffer());\n }\n return response.json();\n }\n\n private async sendEnvelope(params: IntegrationParams) {\n const { recipientEmail, recipientName, documentName, documentContent, emailSubject } = params;\n const rawContent = documentContent as string;\n // Accept a data URL or raw base64.\n const base64 = rawContent.startsWith('data:') ? rawContent.slice(rawContent.indexOf(',') + 1) : rawContent;\n const body = (await this.dsRequest('/envelopes', {\n method: 'POST',\n body: {\n emailSubject: (emailSubject as string) || `Please sign: ${documentName as string}`,\n status: 'sent',\n documents: [\n {\n documentBase64: base64,\n name: documentName as string,\n fileExtension: String(documentName).split('.').pop() || 'pdf',\n documentId: '1',\n },\n ],\n recipients: {\n signers: [\n {\n email: recipientEmail as string,\n name: recipientName as string,\n recipientId: '1',\n routingOrder: '1',\n },\n ],\n },\n },\n })) as { envelopeId?: string; status?: string };\n return { envelopeId: body.envelopeId ?? '', status: body.status ?? 'sent' };\n }\n\n private async getEnvelopeStatus(params: IntegrationParams) {\n const { envelopeId } = params;\n const body = (await this.dsRequest(`/envelopes/${envelopeId as string}`)) as {\n status?: string;\n completedDateTime?: string;\n };\n return { status: body.status ?? '', completedAt: body.completedDateTime ?? '' };\n }\n\n private async downloadDocument(params: IntegrationParams) {\n const { envelopeId } = params;\n const bytes = (await this.dsRequest(`/envelopes/${envelopeId as string}/documents/combined`, {\n raw: true,\n })) as Buffer;\n return { content: bytes.toString('base64'), documentName: `envelope-${envelopeId as string}.pdf` };\n }\n}\n\n// Auto-register\nregisterIntegration('esign', EsignIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport {\n LLMClient,\n EmbeddingClient,\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 5 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 * - embed: Generate embeddings for an array of texts\n */\nexport class LLMIntegration extends BaseIntegration {\n private client: LLMClient | null = null;\n private embeddings: EmbeddingClient | 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 /**\n * Lazily create the embeddings client. Embeddings route through a dedicated\n * embedding model (default OpenRouter `baai/bge-base-en-v1.5`, matching\n * `@almadar/curation-core`), independent of the chat provider/key, because\n * most chat providers do not expose an embeddings endpoint. Override via\n * `EMBEDDING_PROVIDER` / `EMBEDDING_MODEL` / `EMBEDDING_API_KEY`.\n */\n private getEmbeddings(): EmbeddingClient {\n if (!this.embeddings) {\n this.embeddings = new EmbeddingClient({\n provider: (this.config.env.EMBEDDING_PROVIDER as 'openai' | 'openrouter') ?? 'openrouter',\n model: this.config.env.EMBEDDING_MODEL ?? 'baai/bge-base-en-v1.5',\n apiKey: this.config.env.EMBEDDING_API_KEY,\n });\n }\n return this.embeddings;\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 case 'embed':\n data = await this.executeWithRetry(() => this.embed(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 private async embed(params: IntegrationParams) {\n const { texts } = params as { texts: string[] };\n\n if (!Array.isArray(texts)) {\n throw new Error('llm.embed: `texts` must be an array of strings');\n }\n\n this.logger.debug('Embedding texts', { count: texts.length });\n\n const batch = await this.getEmbeddings().embedBatch(texts);\n return { embeddings: batch.embeddings };\n }\n}\n\n// Auto-register\nregisterIntegration('llm', LLMIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport { IntegrationError } from '../../types';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport type { ServiceParams, ServiceParamsValue } from '@almadar/core';\n\n/**\n * ML integration — model inference via a deployed serving orbital.\n *\n * The serving orbital is a separate compiled app (Python/PyTorch) with no\n * dedicated inference route; it is reached through the generic per-trait\n * event endpoint every compiled Almadar app exposes: `POST\n * /api/<kebab-trait>/events`. This integration posts an `INFER` event and\n * reads the prediction back out of the returned `effectResults` — the\n * `emit` effect result whose `data.event` matches `INFERRED_EVENT`.\n *\n * Provides 1 action:\n * - infer: Run inference against a deployed model checkpoint\n */\n\n/** Success/failure event names the serving orbital's `INFER` transition emits — mirrors `std-ml-infer`'s own emit vocabulary. */\nconst INFERRED_EVENT = 'INFERRED';\nconst INFER_FAILED_EVENT = 'INFER_FAILED';\n\nconst DEFAULT_TIMEOUT_MS = 60_000; // masar scales to zero — cold starts run long.\n\ninterface MLEffectResult {\n effect: string;\n action?: string;\n entityType?: string;\n data?: ServiceParamsValue;\n success: boolean;\n error?: string;\n}\n\ninterface MLEventsResponse {\n success: boolean;\n newState?: string;\n data?: Record<string, ServiceParamsValue>;\n effectResults?: MLEffectResult[];\n error?: string;\n}\n\ninterface InferResult {\n output: ServiceParamsValue;\n confidence: number;\n violations: readonly ServiceParamsValue[];\n}\n\nfunction isServiceParams(value: ServiceParamsValue | undefined): value is ServiceParams {\n return typeof value === 'object' && value !== null && !Array.isArray(value) && !(value instanceof Date);\n}\n\n/**\n * Find the `INFERRED` emit result in the serving orbital's `effectResults`\n * and pull `{ output, confidence, violations }` out of its payload. Returns\n * `null` on any shape mismatch — the caller turns that into a typed failure,\n * never a fabricated result.\n */\nfunction extractInferResult(response: MLEventsResponse): InferResult | null {\n const emitted = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && result.success && isServiceParams(result.data) && result.data.event === INFERRED_EVENT,\n );\n if (!emitted || !isServiceParams(emitted.data)) {\n return null;\n }\n\n const payload = emitted.data.payload;\n if (!isServiceParams(payload)) {\n return null;\n }\n\n if (!('output' in payload) || typeof payload.confidence !== 'number' || !Array.isArray(payload.violations)) {\n return null;\n }\n\n return {\n output: payload.output,\n confidence: payload.confidence,\n violations: payload.violations,\n };\n}\n\nexport class MLIntegration extends BaseIntegration {\n private readonly eventsUrl: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const baseUrl = config.env.MASAR_URL;\n const traitPrefix = config.env.MASAR_ML_TRAIT;\n if (!baseUrl || !traitPrefix) {\n throw new Error(\n 'ML integration requires MASAR_URL (serving orbital host) and MASAR_ML_TRAIT (kebab-case trait name of its /events route) to be configured',\n );\n }\n\n this.eventsUrl = `${baseUrl.replace(/\\/+$/, '')}/api/${traitPrefix}/events`;\n this.timeoutMs = config.env.MASAR_ML_TIMEOUT_MS ? Number(config.env.MASAR_ML_TIMEOUT_MS) : DEFAULT_TIMEOUT_MS;\n\n this.logger.info('ML integration initialized', { eventsUrl: this.eventsUrl });\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 'infer':\n data = await this.executeWithRetry(() => this.infer(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 infer(params: IntegrationParams): Promise<InferResult> {\n const { model, input } = params as { model: string; input: ServiceParamsValue };\n\n this.logger.debug('Running ML inference', { model });\n\n const response = await this.postEvent(model, input);\n\n if (!response.success) {\n throw new IntegrationError(\n `ML service reported failure: ${response.error ?? 'unknown error'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const failed = (response.effectResults ?? []).find(\n (result) => result.effect === 'emit' && isServiceParams(result.data) && result.data.event === INFER_FAILED_EVENT,\n );\n if (failed) {\n throw new IntegrationError(\n `ML service could not infer: ${failed.error ?? 'model unavailable'}`,\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n const inferred = extractInferResult(response);\n if (!inferred) {\n throw new IntegrationError(\n 'ML service response did not include a valid inference result',\n 'SERVICE_ERROR',\n { model, response },\n );\n }\n\n return inferred;\n }\n\n private async postEvent(model: string, input: ServiceParamsValue): Promise<MLEventsResponse> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n\n let httpResponse: Response;\n try {\n httpResponse = await fetch(this.eventsUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ event: 'INFER', payload: { model, input } }),\n signal: controller.signal,\n });\n } catch (error) {\n if (error instanceof DOMException && error.name === 'AbortError') {\n throw new IntegrationError(\n `ML service request timed out after ${this.timeoutMs}ms (model may be cold-starting)`,\n 'TIMEOUT_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n }\n throw new IntegrationError(\n `ML service request failed: ${error instanceof Error ? error.message : String(error)}`,\n 'NETWORK_ERROR',\n { model, eventsUrl: this.eventsUrl },\n );\n } finally {\n clearTimeout(timer);\n }\n\n if (!httpResponse.ok) {\n const body = await httpResponse.text().catch(() => '');\n throw new IntegrationError(\n `ML service responded with status ${httpResponse.status}`,\n 'SERVICE_ERROR',\n { model, status: httpResponse.status, body },\n );\n }\n\n try {\n return (await httpResponse.json()) as MLEventsResponse;\n } catch (error) {\n throw new IntegrationError(\n `ML service returned a malformed response body: ${error instanceof Error ? error.message : String(error)}`,\n 'SERVICE_ERROR',\n { model },\n );\n }\n }\n}\n\n// Auto-register\nregisterIntegration('ml', MLIntegration);\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 * 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 * as oidc from 'openid-client';\nimport { 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/** Default OIDC issuer per provider (Google Workspace first — W4 decision). */\nconst PROVIDER_ISSUERS: Partial<Record<OAuthProvider, string>> = {\n google: 'https://accounts.google.com',\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/** Server-held per-authorization state (never leaves the process). */\ninterface PendingAuthorization {\n provider: OAuthProvider;\n redirectUri: string;\n pkceVerifier: string;\n}\n\n/**\n * Where pending OIDC authorizations (PKCE verifier, redirect URI) live\n * between `authorize` and `token`. The in-memory default works single-\n * instance; a multi-instance deployment injects a shared-store impl (the\n * FirestoreCredentialPersistence structural pattern) via\n * `installPendingGrantStore` — no sticky routing needed once it does.\n * `take` is single-use: it returns AND removes, so a state token can never\n * be replayed. `sweep` drops expired grants.\n */\nexport interface PendingGrantStore {\n put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void>;\n take(state: string): Promise<PendingAuthorization | null>;\n sweep(): Promise<void>;\n}\n\nconst PENDING_GRANT_TTL_MS = 10 * 60 * 1000;\n\nexport class InMemoryPendingGrantStore implements PendingGrantStore {\n private readonly grants = new Map<string, { grant: PendingAuthorization; expiresAt: number }>();\n\n async put(state: string, grant: PendingAuthorization, ttlMs: number): Promise<void> {\n this.grants.set(state, { grant, expiresAt: Date.now() + ttlMs });\n }\n\n async take(state: string): Promise<PendingAuthorization | null> {\n const entry = this.grants.get(state);\n if (!entry) return null;\n this.grants.delete(state);\n return entry.expiresAt >= Date.now() ? entry.grant : null;\n }\n\n async sweep(): Promise<void> {\n const now = Date.now();\n for (const [state, entry] of this.grants) {\n if (entry.expiresAt < now) this.grants.delete(state);\n }\n }\n}\n\nlet installedPendingGrantStore: PendingGrantStore | null = null;\n\n/** Install a shared pending-grant store (multi-instance hosts); null resets to in-memory. */\nexport function installPendingGrantStore(store: PendingGrantStore | null): void {\n installedPendingGrantStore = store;\n}\n\n/**\n * OAuth2/OIDC integration.\n *\n * Two backends behind one contract:\n * - **OIDC (production)** — `openid-client` against a discovered issuer\n * (default Google; override via `OIDC_ISSUER_URL`), authorization-code +\n * PKCE, real token exchange / refresh / revocation / userinfo. Selected\n * whenever `OAUTH_CLIENT_ID` + `OAUTH_CLIENT_SECRET` are configured and\n * `OAUTH_MODE` is not `mock`.\n * - **Mock (dev/tests)** — the original in-memory backend, kept verbatim\n * behind `OAUTH_MODE=mock` (or absent client credentials) so existing\n * tests and offline dev flows are untouched.\n *\n * Pending-authorization state (PKCE verifier, redirect URI) lives in a\n * `PendingGrantStore` — in-memory by default (single instance), injectable\n * via `installPendingGrantStore` for multi-instance deployments (a shared\n * store replaces the old sticky-routing requirement). Grants are TTL-bound\n * and single-use.\n */\nexport class OAuthIntegration extends BaseIntegration {\n /** Maps state token -> provider for pending MOCK authorization flows */\n private states: Map<string, OAuthProvider> = new Map();\n\n /** Maps access token -> token set (mock backend) */\n private tokens: Map<string, TokenSet> = new Map();\n\n /** Maps refresh token -> access token for refresh lookups (mock backend) */\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 /** Pending OIDC authorizations (real backend) — injectable, in-memory default. */\n private readonly fallbackPending = new InMemoryPendingGrantStore();\n\n private pendingStore(): PendingGrantStore {\n return installedPendingGrantStore ?? this.fallbackPending;\n }\n\n /** Maps access token -> ID-token subject, for userinfo subject checks */\n private subjects: Map<string, string> = new Map();\n\n /** Discovered issuer configurations, keyed by issuer URL */\n private discovered: Map<string, oidc.Configuration> = new Map();\n\n private readonly real: boolean;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.real =\n config.env.OAUTH_MODE !== 'mock' &&\n Boolean(config.env.OAUTH_CLIENT_ID) &&\n Boolean(config.env.OAUTH_CLIENT_SECRET);\n this.logger.info(\n this.real\n ? 'OAuth integration initialized (OIDC backend via openid-client)'\n : 'OAuth integration initialized (mock backend)',\n );\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.real ? this.oidcAuthorize(params) : this.authorize(params)));\n break;\n case 'token':\n data = await this.executeWithRetry(() => (this.real ? this.oidcToken(params) : this.token(params)));\n break;\n case 'refresh':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRefresh(params) : this.refresh(params)));\n break;\n case 'revoke':\n data = await this.executeWithRetry(() => (this.real ? this.oidcRevoke(params) : this.revoke(params)));\n break;\n case 'userinfo':\n data = await this.executeWithRetry(() => (this.real ? this.oidcUserinfo(params) : 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 // OIDC backend (openid-client)\n // ---------------------------------------------------------------------------\n\n private issuerFor(provider: OAuthProvider): string {\n const configured = this.config.env.OIDC_ISSUER_URL;\n if (configured) return configured;\n const issuer = PROVIDER_ISSUERS[provider];\n if (!issuer) {\n throw new Error(\n `Provider \"${provider}\" has no OIDC issuer — set OIDC_ISSUER_URL to an OIDC-compliant issuer, or use OAUTH_MODE=mock`,\n );\n }\n return issuer;\n }\n\n private async configurationFor(provider: OAuthProvider): Promise<oidc.Configuration> {\n const issuer = this.issuerFor(provider);\n const cached = this.discovered.get(issuer);\n if (cached) return cached;\n const configuration = await oidc.discovery(\n new URL(issuer),\n this.config.env.OAUTH_CLIENT_ID,\n this.config.env.OAUTH_CLIENT_SECRET,\n );\n this.discovered.set(issuer, configuration);\n return configuration;\n }\n\n private async oidcAuthorize(\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) || this.config.env.OAUTH_REDIRECT_URI;\n\n const configuration = await this.configurationFor(provider);\n const state = oidc.randomState();\n const pkceVerifier = oidc.randomPKCECodeVerifier();\n const codeChallenge = await oidc.calculatePKCECodeChallenge(pkceVerifier);\n\n const parameters: Record<string, string> = {\n redirect_uri: redirectUri,\n scope: scopes.join(' '),\n state,\n code_challenge: codeChallenge,\n code_challenge_method: 'S256',\n };\n // Google issues a refresh token only for offline-consented requests.\n if (provider === 'google') {\n parameters.access_type = 'offline';\n parameters.prompt = 'consent';\n }\n\n const authUrl = oidc.buildAuthorizationUrl(configuration, parameters);\n await this.pendingStore().put(state, { provider, redirectUri, pkceVerifier }, PENDING_GRANT_TTL_MS);\n void this.pendingStore().sweep();\n return { authUrl: authUrl.toString(), state };\n }\n\n private async oidcToken(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; refreshToken: string; expiresIn: number; tokenType: 'bearer' }> {\n const code = params.code as string;\n const state = params.state as string;\n\n const pendingAuth = await this.pendingStore().take(state);\n if (!pendingAuth) {\n throw new Error(`Invalid or expired state token: ${state}`);\n }\n\n const configuration = await this.configurationFor(pendingAuth.provider);\n const callbackUrl = new URL(pendingAuth.redirectUri);\n callbackUrl.searchParams.set('code', code);\n callbackUrl.searchParams.set('state', state);\n\n const tokens = await oidc.authorizationCodeGrant(configuration, callbackUrl, {\n expectedState: state,\n pkceCodeVerifier: pendingAuth.pkceVerifier,\n });\n\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n\n return {\n accessToken: tokens.access_token,\n refreshToken: tokens.refresh_token ?? '',\n expiresIn: tokens.expires_in ?? 3600,\n tokenType: 'bearer',\n };\n }\n\n private async oidcRefresh(\n params: IntegrationParams,\n ): Promise<{ accessToken: string; expiresIn: number }> {\n const refreshToken = params.refreshToken as string;\n const configuration = await this.configurationFor('google');\n\n const tokens = await oidc.refreshTokenGrant(configuration, refreshToken);\n const claims = tokens.claims();\n if (claims?.sub) {\n this.subjects.set(tokens.access_token, claims.sub);\n }\n return {\n accessToken: tokens.access_token,\n expiresIn: tokens.expires_in ?? 3600,\n };\n }\n\n private async oidcRevoke(params: IntegrationParams): Promise<{ revoked: boolean }> {\n const token = params.token as string;\n const configuration = await this.configurationFor('google');\n await oidc.tokenRevocation(configuration, token);\n this.subjects.delete(token);\n return { revoked: true };\n }\n\n private async oidcUserinfo(params: IntegrationParams): Promise<UserInfo> {\n const accessToken = params.accessToken as string;\n const configuration = await this.configurationFor('google');\n const subject = this.subjects.get(accessToken);\n const info = await oidc.fetchUserInfo(\n configuration,\n accessToken,\n subject ?? oidc.skipSubjectCheck,\n );\n return {\n sub: info.sub,\n email: typeof info.email === 'string' ? info.email : '',\n name: typeof info.name === 'string' ? info.name : '',\n picture: typeof info.picture === 'string' ? info.picture : '',\n };\n }\n\n // ---------------------------------------------------------------------------\n // Mock backend 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 // Mock backend 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 { IntegrationError, type IntegrationConfig, type IntegrationResult, type IntegrationParams } from '../../types';\nimport type { IntegrationCallContext } from '../../factory';\nimport { registerIntegration } from '../../registry';\nimport {\n getActiveFactory,\n getInstalledCredentialStore,\n resolveCredentialRef,\n} from '../../credentials';\nimport { serviceCredentials, serviceProbes, type IntegrationName } from '../../contracts';\n\n/** Env-var name shape accepted for the `database` connectionRef exception. */\nconst ENV_VAR_NAME = /^[A-Z][A-Z0-9_]*$/;\n\n/** Write/probe actions require an admin-role caller; `list` stays open (masked last-4 only). */\nconst ROLE_GATED_ACTIONS = new Set(['set', 'remove', 'test', 'rotate']);\n\nconst DEFAULT_ADMIN_ROLES = ['admin', 'owner'];\n\ninterface CredentialListEntry {\n service: string;\n envVar: string;\n required: boolean;\n description: string;\n configured: boolean;\n source: 'store' | 'env' | 'none';\n last4: string;\n}\n\nfunction isProbeService(service: string): service is IntegrationName {\n return service in serviceProbes;\n}\n\n/**\n * The hosted credential store's service surface (W4 Tier C) — what the\n * Owner-gated Integrations settings page calls through the NORMAL\n * call-service path (server-side only; organisms own the access policy,\n * per the I-16 std-atom ACL constraint).\n *\n * Security contract: `list` returns masked entries only (last-4, never\n * plaintext); `set` accepts only env vars DECLARED in `serviceCredentials`\n * for the named service (plus well-formed connection refs for `database`),\n * so the page can never become an arbitrary env-injection surface; values\n * are never logged. `set`/`remove`/`test` additionally require the caller's\n * role (from IntegrationCallContext) to be in the admin list\n * (ALMADAR_CREDENTIAL_ADMIN_ROLES, default admin,owner) and FAIL CLOSED\n * without one — the un-bypassable twin of the organism-side page gate (I-25).\n */\nexport class CredentialsIntegration extends BaseIntegration {\n constructor(config: IntegrationConfig) {\n super(config);\n this.logger.info('Credentials integration initialized (tenant credential store surface)');\n }\n\n async execute(\n action: string,\n params: IntegrationParams,\n context?: IntegrationCallContext,\n ): Promise<IntegrationResult> {\n if (ROLE_GATED_ACTIONS.has(action)) {\n const allowed = this.adminRoles();\n if (!context?.role || !allowed.includes(context.role)) {\n return {\n success: false,\n error: new IntegrationError(\n `forbidden: \"${action}\" requires one of roles: ${allowed.join(', ')}`,\n 'AUTH_ERROR',\n ),\n metadata: this.createMetadata(action, 0),\n };\n }\n }\n\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 'list':\n data = this.list(typeof params.service === 'string' ? params.service : undefined);\n break;\n case 'set':\n data = await this.set(params.service as string, params.envVar as string, params.value as string);\n break;\n case 'remove':\n data = await this.remove(params.service as string, params.envVar as string);\n break;\n case 'test':\n data = await this.test(params.service as string, context);\n break;\n case 'rotate': {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n data = await store.rotate();\n break;\n }\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 adminRoles(): string[] {\n const raw = this.config.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || process.env['ALMADAR_CREDENTIAL_ADMIN_ROLES'] || '';\n const roles = raw.split(',').map((r) => r.trim()).filter((r) => r.length > 0);\n return roles.length > 0 ? roles : DEFAULT_ADMIN_ROLES;\n }\n\n private declaredFor(service: string): { envVar: string; required: boolean; description: string }[] {\n return serviceCredentials[service] ?? [];\n }\n\n private assertSettable(service: string, envVar: string): void {\n if (service === 'database') {\n if (!ENV_VAR_NAME.test(envVar)) {\n throw new Error(`\"${envVar}\" is not a well-formed connection reference (expected an env-var name)`);\n }\n return;\n }\n const declared = this.declaredFor(service);\n if (declared.length === 0) {\n throw new Error(`Service \"${service}\" declares no credentials`);\n }\n if (!declared.some((c) => c.envVar === envVar)) {\n const valid = declared.map((c) => c.envVar).join(', ');\n throw new Error(`\"${envVar}\" is not a declared credential of \"${service}\" (declared: ${valid})`);\n }\n }\n\n private storeFirst(): boolean {\n const flag = this.config.env['ALMADAR_CREDENTIALS_SOURCE'] || process.env['ALMADAR_CREDENTIALS_SOURCE'];\n return flag === 'store';\n }\n\n private list(serviceFilter?: string): { enabled: boolean; entries: CredentialListEntry[] } {\n const store = getInstalledCredentialStore();\n const stored = new Map((store?.entries() ?? []).map((e) => [`${e.service}\\u0000${e.envVar}`, e]));\n const entries: CredentialListEntry[] = [];\n for (const [service, declared] of Object.entries(serviceCredentials)) {\n if (serviceFilter && service !== serviceFilter) continue;\n for (const { envVar, required, description } of declared) {\n const fromStore = stored.get(`${service}\\u0000${envVar}`);\n stored.delete(`${service}\\u0000${envVar}`);\n // Store-first (I-31): declared refs resolve ONLY through the store, so\n // an env-only value reports 'none' — never a source the runtime won't use.\n const fromEnv = this.storeFirst() ? undefined : process.env[envVar];\n const source: CredentialListEntry['source'] = fromStore ? 'store' : fromEnv ? 'env' : 'none';\n entries.push({\n service,\n envVar,\n required,\n description,\n configured: source !== 'none',\n source,\n last4: fromStore ? fromStore.last4 : fromEnv ? fromEnv.slice(-4) : '',\n });\n }\n }\n // Stored rows outside the declared tables (database connection refs).\n for (const e of stored.values()) {\n if (serviceFilter && e.service !== serviceFilter) continue;\n entries.push({\n service: e.service,\n envVar: e.envVar,\n required: false,\n description: 'Stored connection reference',\n configured: true,\n source: 'store',\n last4: e.last4,\n });\n }\n return { enabled: store?.enabled ?? false, entries };\n }\n\n private async set(\n service: string,\n envVar: string,\n value: string,\n ): Promise<{ saved: boolean; service: string; envVar: string; last4: string }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host — set credentials via the environment');\n }\n this.assertSettable(service, envVar);\n const entry = await store.set(service, envVar, value);\n return { saved: true, service, envVar, last4: entry.last4 };\n }\n\n private async remove(service: string, envVar: string): Promise<{ removed: boolean }> {\n const store = getInstalledCredentialStore();\n if (!store) {\n throw new Error('No credential store is installed on this host');\n }\n this.assertSettable(service, envVar);\n return { removed: await store.remove(envVar) };\n }\n\n private async test(service: string, context?: IntegrationCallContext): Promise<{\n service: string;\n configured: boolean;\n missing: string[];\n probed: boolean;\n ok: boolean;\n message: string;\n }> {\n const declared = this.declaredFor(service);\n const missing = declared\n .filter((c) => c.required && !resolveCredentialRef(c.envVar))\n .map((c) => c.envVar);\n const configured = missing.length === 0;\n if (!configured) {\n return { service, configured, missing, probed: false, ok: false, message: `Missing required credentials: ${missing.join(', ')}` };\n }\n\n const factory = getActiveFactory();\n const probe = isProbeService(service) ? serviceProbes[service] : undefined;\n if (!factory || !probe) {\n return { service, configured, missing, probed: false, ok: true, message: 'Credentials present (no live probe declared for this service)' };\n }\n if (!factory.isConfigured(service)) {\n return { service, configured, missing, probed: false, ok: false, message: 'Credentials present but the service is not configured on this host — restart or re-save a credential' };\n }\n const result = await factory.execute(service, probe.action, probe.params as IntegrationParams, context);\n if (!result.success) {\n return { service, configured, missing, probed: true, ok: false, message: result.error?.message ?? `Probe ${probe.action} failed` };\n }\n const echoed = result.data !== null && typeof result.data === 'object' && '_mock' in result.data;\n if (echoed) {\n return { service, configured, missing, probed: false, ok: false, message: 'Probe was mock-echoed — the service is not actually configured' };\n }\n return { service, configured, missing, probed: true, ok: true, message: `Probe ${probe.action} succeeded` };\n }\n}\n\n// Auto-register\nregisterIntegration('credentials', CredentialsIntegration);\n","import { createHash } from 'node:crypto';\nimport {\n S3Client,\n PutObjectCommand,\n GetObjectCommand,\n DeleteObjectCommand,\n ListObjectsV2Command,\n type ObjectCannedACL,\n} from '@aws-sdk/client-s3';\nimport { getSignedUrl as s3GetSignedUrl } from '@aws-sdk/s3-request-presigner';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams, IntegrationParamValue } 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\ninterface UploadResult {\n key: string;\n bucket: string;\n size: number;\n etag: string;\n /** Mirror of `key` — the field the .lolo upload consumers read. */\n id: string;\n /** Public (acl: public) or signed GET address of the uploaded object. */\n url: string;\n}\n\n/** The file-form upload payload (UploadDropZone emit shape). */\ninterface UploadFilePayload {\n name: string;\n size: number;\n type: string;\n /** base64 data URL (`data:<mime>;base64,...`) or raw base64. */\n content?: string;\n}\n\nfunction isParamRecord(\n value: IntegrationParamValue | undefined,\n): value is { readonly [key: string]: IntegrationParamValue } {\n return value !== null && typeof value === 'object' && !Array.isArray(value) && !(value instanceof Date);\n}\n\nfunction toFilePayload(value: IntegrationParamValue | undefined): UploadFilePayload | null {\n if (!isParamRecord(value)) return null;\n const { name, size, type, content } = value;\n if (typeof name !== 'string') return null;\n return {\n name,\n size: typeof size === 'number' ? size : 0,\n type: typeof type === 'string' ? type : 'application/octet-stream',\n content: typeof content === 'string' ? content : undefined,\n };\n}\n\n/** Decode a data URL / raw base64 string to bytes; plain text passes through. */\nfunction decodeContent(content: string): { bytes: Buffer; contentType: string | null } {\n const dataUrlMatch = /^data:([^;,]+)?(;base64)?,(.*)$/s.exec(content);\n if (dataUrlMatch) {\n const [, mime, isB64, body] = dataUrlMatch;\n const bytes = isB64 ? Buffer.from(body, 'base64') : Buffer.from(decodeURIComponent(body), 'utf8');\n return { bytes, contentType: mime || null };\n }\n return { bytes: Buffer.from(content, 'utf8'), contentType: null };\n}\n\n/**\n * Object storage integration — real S3-compatible backend (AWS S3, R2, MinIO,\n * …) when `STORAGE_ACCESS_KEY_ID`/`STORAGE_SECRET_ACCESS_KEY` are configured,\n * in-memory simulation otherwise. Production REFUSES the in-memory fallback:\n * a missing credential must fail loudly, never simulate success (D-3).\n *\n * `upload` admits two shapes: the canonical `{ key, content }` pair and the\n * file-form `{ file: { name, size, type, content }, acl?, maxSize? }` that\n * lolo authors wire from UploadDropZone. The result carries `id`/`url`\n * alongside `key` — the fields the .lolo consumers read.\n */\nexport class StorageIntegration extends BaseIntegration {\n private objects: Map<string, StoredObject> = new Map();\n private s3: S3Client | null = null;\n private defaultBucket: string;\n private publicUrlBase: string;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n this.defaultBucket = config.env.STORAGE_BUCKET || '';\n this.publicUrlBase = config.env.STORAGE_PUBLIC_URL_BASE || '';\n\n const accessKeyId = config.env.STORAGE_ACCESS_KEY_ID || '';\n const secretAccessKey = config.env.STORAGE_SECRET_ACCESS_KEY || '';\n if (accessKeyId && secretAccessKey) {\n const endpoint = config.env.STORAGE_ENDPOINT || undefined;\n this.s3 = new S3Client({\n region: config.env.STORAGE_REGION || 'us-east-1',\n endpoint,\n // Path-style is what MinIO/R2-style endpoints expect.\n forcePathStyle: Boolean(endpoint),\n credentials: { accessKeyId, secretAccessKey },\n });\n this.logger.info('Storage integration initialized (S3 backend)', {\n endpoint: endpoint ?? 'aws',\n bucket: this.defaultBucket,\n });\n } else {\n if (process.env.NODE_ENV === 'production') {\n throw new Error(\n 'Storage credentials missing in production (STORAGE_ACCESS_KEY_ID / STORAGE_SECRET_ACCESS_KEY) — refusing the in-memory fallback. See SECRETS.md.',\n );\n }\n this.logger.warn('Storage integration initialized (in-memory backend — dev only, nothing persists)');\n }\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 'uploadMany':\n data = await this.executeWithRetry(() => this.uploadMany(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 private bucketOf(params: IntegrationParams): string {\n return (params.bucket as string) || this.defaultBucket;\n }\n\n private compositeKey(bucket: string, key: string): string {\n return `${bucket}/${key}`;\n }\n\n private generateEtag(bytes: Buffer): string {\n return `\"${createHash('md5').update(bytes).digest('hex')}\"`;\n }\n\n /** Resolve the upload inputs from either admitted shape. */\n private resolveUpload(params: IntegrationParams): {\n key: string;\n bytes: Buffer;\n contentType: string;\n acl: ObjectCannedACL | undefined;\n } {\n const file = toFilePayload(params.file);\n if (file) {\n const maxSize = typeof params.maxSize === 'number' ? params.maxSize : 0;\n if (maxSize > 0 && file.size > maxSize) {\n throw new Error(`Upload rejected: ${file.name} is ${file.size} bytes (max ${maxSize})`);\n }\n if (!file.content) {\n throw new Error(\n `Upload rejected: file payload for '${file.name}' carries no content — the uploader must include the base64 data URL`,\n );\n }\n const { bytes, contentType } = decodeContent(file.content);\n // Timestamped key keeps concurrent uploads of a same-named file distinct.\n const safeName = file.name.replace(/[^A-Za-z0-9._-]/g, '_');\n return {\n key: `${Date.now()}-${safeName}`,\n bytes,\n contentType: contentType ?? file.type,\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n const key = params.key as string | undefined;\n const content = params.content;\n if (!key || content === undefined || content === null) {\n throw new Error('upload requires either `file` (with content) or the `key` + `content` pair');\n }\n const raw = typeof content === 'string' ? content : JSON.stringify(content);\n const { bytes, contentType } = decodeContent(raw);\n return {\n key,\n bytes,\n contentType: (params.contentType as string) || contentType || 'application/octet-stream',\n acl: params.acl === 'public' ? 'public-read' : undefined,\n };\n }\n\n private publicUrl(bucket: string, key: string): string {\n if (this.publicUrlBase) {\n return `${this.publicUrlBase.replace(/\\/$/, '')}/${key}`;\n }\n const endpoint = this.config.env.STORAGE_ENDPOINT;\n if (endpoint) {\n return `${endpoint.replace(/\\/$/, '')}/${bucket}/${key}`;\n }\n const region = this.config.env.STORAGE_REGION || 'us-east-1';\n return `https://${bucket}.s3.${region}.amazonaws.com/${key}`;\n }\n\n // ---------------------------------------------------------------------------\n // Actions\n // ---------------------------------------------------------------------------\n\n private async upload(params: IntegrationParams): Promise<UploadResult> {\n const bucket = this.bucketOf(params);\n const { key, bytes, contentType, acl } = this.resolveUpload(params);\n const etag = this.generateEtag(bytes);\n\n this.logger.debug('Storage UPLOAD', { bucket, key, contentType, size: bytes.length });\n\n if (this.s3) {\n await this.s3.send(\n new PutObjectCommand({\n Bucket: bucket,\n Key: key,\n Body: bytes,\n ContentType: contentType,\n ACL: acl,\n }),\n );\n } else {\n this.objects.set(this.compositeKey(bucket, key), {\n content: bytes.toString('base64'),\n contentType,\n size: bytes.length,\n metadata: (params.metadata as IntegrationParams | undefined) ?? {},\n lastModified: Date.now(),\n etag,\n });\n }\n\n // In-memory (no-credentials) mode: the bytes live only in this process, so\n // a fabricated S3/signed address is a DEAD link — every uploaded image\n // renders broken in the playground. A data: URL is the only address that\n // resolves to the actual bytes; consumers persist it and <img>/download\n // chips read it directly. Real-credential paths are unchanged.\n const url = this.s3\n ? acl === 'public-read'\n ? this.publicUrl(bucket, key)\n : (await this.signUrl(bucket, key, 'get', 3600)).url\n : `data:${contentType};base64,${bytes.toString('base64')}`;\n\n return { key, bucket, size: bytes.length, etag, id: key, url };\n }\n\n /**\n * Upload a whole UploadDropZone batch in one action — the FSM-friendly\n * shape for multi-file atoms (std-image-upload-multi): one call-service\n * arm in, one bulk-persistable `items` array out. Each item carries\n * id/url plus the name/sizeBytes/mimeType columns an uploaded-file row\n * declares.\n */\n private async uploadMany(params: IntegrationParams): Promise<{\n items: Array<{ id: string; key: string; url: string; name: string; sizeBytes: number; mimeType: string }>;\n count: number;\n }> {\n const rawFiles = Array.isArray(params.files) ? params.files : [];\n const files = rawFiles\n .map((f) => toFilePayload(f))\n .filter((f): f is UploadFilePayload => f !== null);\n if (files.length === 0) {\n throw new Error('uploadMany requires a non-empty `files` array (UploadDropZone batch shape)');\n }\n const items = [];\n for (const file of files) {\n const result = await this.upload({\n bucket: params.bucket,\n file: { name: file.name, size: file.size, type: file.type, content: file.content },\n acl: params.acl,\n maxSize: params.maxSize,\n });\n items.push({\n id: result.id,\n key: result.key,\n url: result.url,\n name: file.name,\n sizeBytes: file.size,\n mimeType: file.type,\n });\n }\n return { items, count: items.length };\n }\n\n private async download(\n params: IntegrationParams,\n ): Promise<{ content: string; contentType: string; size: number; metadata: IntegrationParams }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DOWNLOAD', { bucket, key });\n\n if (this.s3) {\n const response = await this.s3.send(new GetObjectCommand({ Bucket: bucket, Key: key }));\n const bytes = Buffer.from(await response.Body!.transformToByteArray());\n return {\n content: bytes.toString('base64'),\n contentType: response.ContentType ?? 'application/octet-stream',\n size: bytes.length,\n metadata: {},\n };\n }\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 return {\n content: String(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<{ keys: Array<{ key: string; size: number; lastModified: number }>; truncated: boolean; nextToken?: string }> {\n const bucket = this.bucketOf(params);\n const prefix = (params.prefix as string | undefined) ?? '';\n const maxKeys = (params.maxKeys as number | undefined) ?? 1000;\n const continuationToken = params.continuationToken as string | undefined;\n\n this.logger.debug('Storage LIST', { bucket, prefix, maxKeys });\n\n if (this.s3) {\n const response = await this.s3.send(\n new ListObjectsV2Command({\n Bucket: bucket,\n Prefix: prefix || undefined,\n MaxKeys: maxKeys,\n ContinuationToken: continuationToken,\n }),\n );\n return {\n keys: (response.Contents ?? []).map((entry) => ({\n key: entry.Key ?? '',\n size: entry.Size ?? 0,\n lastModified: entry.LastModified?.getTime() ?? 0,\n })),\n truncated: Boolean(response.IsTruncated),\n ...(response.IsTruncated && response.NextContinuationToken !== undefined\n ? { nextToken: response.NextContinuationToken }\n : {}),\n };\n }\n\n const bucketPrefix = `${bucket}/`;\n const fullPrefix = `${bucket}/${prefix}`;\n const results: Array<{ key: string; size: number; lastModified: number }> = [];\n for (const [compositeKey, obj] of this.objects) {\n if (!compositeKey.startsWith(fullPrefix)) continue;\n results.push({\n key: compositeKey.slice(bucketPrefix.length),\n size: obj.size,\n lastModified: obj.lastModified,\n });\n }\n results.sort((a, b) => a.key.localeCompare(b.key));\n // Dev backend: the token is a plain offset into the sorted listing.\n const offset = continuationToken !== undefined ? Number.parseInt(continuationToken, 10) || 0 : 0;\n const page = results.slice(offset, offset + maxKeys);\n const truncated = offset + maxKeys < results.length;\n return {\n keys: page,\n truncated,\n ...(truncated ? { nextToken: String(offset + maxKeys) } : {}),\n };\n }\n\n private async deleteObject(params: IntegrationParams): Promise<{ deleted: boolean }> {\n const bucket = this.bucketOf(params);\n const key = params.key as string;\n\n this.logger.debug('Storage DELETE', { bucket, key });\n\n if (this.s3) {\n await this.s3.send(new DeleteObjectCommand({ Bucket: bucket, Key: key }));\n return { deleted: true };\n }\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 signUrl(\n bucket: string,\n key: string,\n operation: 'get' | 'put',\n expiresIn: number,\n ): Promise<{ url: string; expiresAt: number }> {\n const expiresAt = Date.now() + expiresIn * 1000;\n if (this.s3) {\n const command =\n operation === 'put'\n ? new PutObjectCommand({ Bucket: bucket, Key: key })\n : new GetObjectCommand({ Bucket: bucket, Key: key });\n const url = await s3GetSignedUrl(this.s3, command, { expiresIn });\n return { url, expiresAt };\n }\n const token = createHash('sha256').update(`${bucket}/${key}/${expiresAt}`).digest('hex').slice(0, 16);\n const url =\n `https://storage.mock.local/${bucket}/${key}` +\n `?X-Amz-Algorithm=MOCK-HMAC-SHA256&X-Amz-Expires=${expiresIn}` +\n `&X-Amz-SignedHeaders=host&X-Amz-Signature=${token}&operation=${operation}`;\n return { url, expiresAt };\n }\n\n private async getSignedUrl(params: IntegrationParams): Promise<{ url: string; expiresAt: number }> {\n const bucket = this.bucketOf(params);\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 this.logger.debug('Storage GET_SIGNED_URL', { bucket, key, expiresIn, operation });\n return this.signUrl(bucket, key, operation, expiresIn);\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","/**\n * Read-only SQL enforcement for the database integration.\n *\n * The guard accepts exactly one SELECT statement (optionally CTE-led) and\n * nothing else. Comments are stripped and string/identifier contents are\n * blanked before keyword checks, so denied keywords inside literals (e.g.\n * `WHERE note = 'delete this'`) never false-positive, and comment/quote\n * tricks cannot smuggle a second statement past the check.\n */\n\nexport interface SqlGuardResult {\n ok: boolean;\n reason?: string;\n}\n\n/**\n * Reserved words that mutate or lock wherever they appear inside a SELECT:\n * data-modifying CTE bodies (INSERT/UPDATE/DELETE/MERGE), `SELECT ... INTO`\n * DDL, and `FOR UPDATE`/`FOR SHARE` locking clauses.\n */\nconst DENIED_KEYWORDS = new Set(['INSERT', 'UPDATE', 'DELETE', 'MERGE', 'INTO', 'FOR']);\n\nfunction isWordChar(ch: string): boolean {\n return (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch === '_' || ch === '$';\n}\n\n/** Skip a single-quoted literal starting at `start` (the opening quote). */\nfunction skipSingleQuoted(sql: string, start: number, eString: boolean): number {\n let i = start + 1;\n while (i < sql.length) {\n if (eString && sql[i] === '\\\\') {\n i += 2;\n continue;\n }\n if (sql[i] === \"'\") {\n if (sql[i + 1] === \"'\") {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Skip a double-quoted identifier starting at `start` (the opening quote). */\nfunction skipDoubleQuoted(sql: string, start: number): number {\n let i = start + 1;\n while (i < sql.length) {\n if (sql[i] === '\"') {\n if (sql[i + 1] === '\"') {\n i += 2;\n continue;\n }\n return i + 1;\n }\n i++;\n }\n return sql.length;\n}\n\n/** Match a dollar-quote tag ($$ or $tag$) at `start`; `$1` placeholders are not tags. */\nfunction matchDollarTag(sql: string, start: number): string | undefined {\n let i = start + 1;\n if (sql[i] === '$') return '$$';\n const first = sql[i];\n if (!first || !((first >= 'a' && first <= 'z') || (first >= 'A' && first <= 'Z') || first === '_')) {\n return undefined;\n }\n i++;\n while (i < sql.length && isWordChar(sql[i]) && sql[i] !== '$') i++;\n if (sql[i] !== '$') return undefined;\n return sql.slice(start, i + 1);\n}\n\n/** Strip comments and blank string/identifier contents, keeping structure. */\nfunction sanitizeSql(sql: string): string {\n const out: string[] = [];\n let i = 0;\n\n while (i < sql.length) {\n const ch = sql[i];\n\n if (ch === '-' && sql[i + 1] === '-') {\n while (i < sql.length && sql[i] !== '\\n') i++;\n out.push(' ');\n continue;\n }\n\n if (ch === '/' && sql[i + 1] === '*') {\n // Postgres nests block comments\n let depth = 1;\n i += 2;\n while (i < sql.length && depth > 0) {\n if (sql[i] === '/' && sql[i + 1] === '*') {\n depth++;\n i += 2;\n } else if (sql[i] === '*' && sql[i + 1] === '/') {\n depth--;\n i += 2;\n } else {\n i++;\n }\n }\n out.push(' ');\n continue;\n }\n\n if (ch === \"'\") {\n // E'…' strings honor backslash escapes; standard strings do not\n let j = i - 1;\n while (j >= 0 && (sql[j] === ' ' || sql[j] === '\\t' || sql[j] === '\\n' || sql[j] === '\\r')) j--;\n const prev = j >= 0 ? sql[j] : '';\n const eString = (prev === 'e' || prev === 'E') && (j === 0 || !isWordChar(sql[j - 1]));\n i = skipSingleQuoted(sql, i, eString);\n out.push(\"''\");\n continue;\n }\n\n if (ch === '\"') {\n i = skipDoubleQuoted(sql, i);\n out.push('\"\"');\n continue;\n }\n\n if (ch === '$') {\n const tag = matchDollarTag(sql, i);\n if (tag) {\n const close = sql.indexOf(tag, i + tag.length);\n i = close === -1 ? sql.length : close + tag.length;\n out.push('$$');\n continue;\n }\n }\n\n out.push(ch);\n i++;\n }\n\n return out.join('');\n}\n\n/**\n * Verify `sql` is a single read-only SELECT statement.\n * Returns `{ ok: false, reason }` for anything else.\n */\nexport function assertReadOnlySelect(sql: string): SqlGuardResult {\n const sanitized = sanitizeSql(sql);\n\n const statements = sanitized\n .split(';')\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n if (statements.length === 0) {\n return { ok: false, reason: 'Empty statement' };\n }\n if (statements.length > 1) {\n return { ok: false, reason: 'Only a single statement is allowed' };\n }\n\n const words = (statements[0].match(/\\b[A-Za-z_][A-Za-z0-9_]*\\b/g) ?? []).map((w) =>\n w.toUpperCase(),\n );\n const first = words[0];\n if (first !== 'SELECT' && first !== 'WITH') {\n return { ok: false, reason: 'Only SELECT statements are allowed' };\n }\n\n const denied = words.find((w) => DENIED_KEYWORDS.has(w));\n if (denied) {\n return { ok: false, reason: `Keyword not allowed in a read-only query: ${denied}` };\n }\n\n return { ok: true };\n}\n","/**\n * Database Integration for Almadar\n * Read-only SQL queries over external connections (migration fetch seam).\n */\n\nimport { Pool } from 'pg';\nimport { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationParams } from '../../types';\nimport { IntegrationError } from '../../types';\nimport { registerIntegration } from '../../registry';\nimport { resolveCredentialRef } from '../../credentials';\nimport { assertReadOnlySelect } from './sql-guard';\nimport type {\n DatabaseDriver,\n DatabaseQueryParams,\n DatabaseQueryParamValue,\n DatabaseQueryResult,\n DatabaseRow,\n} from './types';\n\nconst DEFAULT_STATEMENT_TIMEOUT_MS = 10_000;\n\n/** Postgres SQLSTATE raised when statement_timeout cancels a query. */\nconst PG_QUERY_CANCELED = '57014';\n\nclass PostgresDriver implements DatabaseDriver {\n private pool: Pool;\n\n constructor(connectionString: string, statementTimeoutMs: number) {\n this.pool = new Pool({\n connectionString,\n statement_timeout: statementTimeoutMs,\n query_timeout: statementTimeoutMs,\n });\n }\n\n async query(\n sql: string,\n params: readonly DatabaseQueryParamValue[],\n ): Promise<DatabaseQueryResult> {\n const result = await this.pool.query(sql, [...params]);\n return {\n rows: result.rows as DatabaseRow[],\n rowCount: result.rowCount ?? result.rows.length,\n };\n }\n\n async end(): Promise<void> {\n await this.pool.end();\n }\n}\n\nfunction mapDriverError(error: unknown): IntegrationError {\n if (error instanceof IntegrationError) return error;\n const code = (error as { code?: string }).code;\n if (code === PG_QUERY_CANCELED) {\n return new IntegrationError('Statement timeout exceeded', 'TIMEOUT_ERROR');\n }\n const message = error instanceof Error ? error.message : String(error);\n return new IntegrationError(message, 'SERVICE_ERROR');\n}\n\n/**\n * Generic database integration. One action — `query` — with read-only\n * enforced in the integration itself (single SELECT only, statement\n * timeout). `connectionRef` is an environment variable NAME, never the\n * secret; the connection string is resolved from `process.env` at run time.\n */\nexport class DatabaseIntegration extends BaseIntegration {\n private drivers: Map<string, DatabaseDriver> = new Map();\n private statementTimeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n\n const fromEnv = config.env.DATABASE_STATEMENT_TIMEOUT_MS;\n if (fromEnv) {\n const parsed = Number(fromEnv);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n throw new Error(`Invalid DATABASE_STATEMENT_TIMEOUT_MS: ${fromEnv}`);\n }\n this.statementTimeoutMs = parsed;\n } else {\n this.statementTimeoutMs = config.timeout ?? DEFAULT_STATEMENT_TIMEOUT_MS;\n }\n\n this.logger.info('Database integration initialized', {\n statementTimeoutMs: this.statementTimeoutMs,\n });\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 'query':\n data = await this.executeWithRetry(() => this.runQuery(params as DatabaseQueryParams));\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 runQuery(params: DatabaseQueryParams): Promise<DatabaseQueryResult> {\n const guard = assertReadOnlySelect(params.sql);\n if (!guard.ok) {\n throw new IntegrationError(\n `Read-only violation: ${guard.reason ?? 'not a SELECT statement'}`,\n 'VALIDATION_ERROR',\n );\n }\n\n const driver = this.driverFor(params.connectionRef);\n\n this.logger.debug('Database QUERY', { connectionRef: params.connectionRef });\n\n try {\n return await driver.query(params.sql, params.params ?? []);\n } catch (error) {\n throw mapDriverError(error);\n }\n }\n\n /** Resolve (and cache) the driver for a connection reference. */\n private driverFor(connectionRef: string): DatabaseDriver {\n const connectionString = resolveCredentialRef(connectionRef);\n if (!connectionString) {\n throw new IntegrationError(\n `Connection reference \"${connectionRef}\" is not set in the credential store or environment`,\n 'AUTH_ERROR',\n );\n }\n\n const cached = this.drivers.get(connectionString);\n if (cached) return cached;\n\n const driver = new PostgresDriver(connectionString, this.statementTimeoutMs);\n this.drivers.set(connectionString, driver);\n return driver;\n }\n}\n\n// Auto-register\nregisterIntegration('database', DatabaseIntegration);\n\n// Export types\nexport * from './types';\nexport { assertReadOnlySelect, type SqlGuardResult } from './sql-guard';\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Wikimedia (Wikipedia API) integration — redirect-resolved page lookup returning\n * a verified one-line description, a real Commons portrait, and the lead-section\n * extract. The single canonical home for the User-Agent + timeout that kflow's\n * persona services previously duplicated as ad-hoc `fetch` calls.\n */\nconst WIKI_ENDPOINT = 'https://en.wikipedia.org/w/api.php';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\nconst EXTRACT_CHAR_CAP = 2000;\n\ninterface WikiPage {\n missing?: '' | boolean;\n title?: string;\n description?: string;\n extract?: string;\n thumbnail?: { source?: string };\n}\ninterface WikiQueryResponse {\n query?: { pages?: Record<string, WikiPage> };\n}\n\nexport class WikimediaIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.WIKIMEDIA_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.WIKIMEDIA_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Wikimedia integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): 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 try {\n let data: unknown;\n switch (action) {\n case 'getPage':\n data = await this.executeWithRetry(() => this.getPage(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n /** Look up a title on Wikipedia: description, portrait, lead extract. Empty fields on miss. */\n private async getPage(params: IntegrationParams): Promise<{ title?: string; description?: string; portraitUrl?: string; extract?: string }> {\n const title = String(params.title ?? '').trim();\n if (!title) return {};\n const url =\n `${WIKI_ENDPOINT}?action=query&format=json&redirects=1` +\n `&prop=pageimages|description|extracts&explaintext=1&exintro=1` +\n `&piprop=thumbnail&pithumbsize=240&titles=${encodeURIComponent(title)}`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return {};\n const data = (await res.json()) as WikiQueryResponse;\n const pages = data.query?.pages;\n if (!pages) return {};\n const page = Object.values(pages)[0];\n if (!page || page.missing !== undefined) return {};\n const extract = typeof page.extract === 'string' ? page.extract.slice(0, EXTRACT_CHAR_CAP).trim() : undefined;\n return {\n title: page.title,\n description: page.description ?? (typeof page.extract === 'string' ? page.extract.split('.')[0] : undefined),\n portraitUrl: page.thumbnail?.source,\n extract,\n };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('wikimedia', WikimediaIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * Iconify integration — brand-logo / icon resolution via the Iconify API.\n * Exposes the three atomic HTTP calls kflow's concept-icon service previously\n * made as ad-hoc `fetch`: existence check, relevance search, and icon-body\n * fetch (for color-tone classification). Caching + tone classification stay\n * in the caller; this owns only the transport (UA, timeout, retry).\n */\nconst ICONIFY_API = 'https://api.iconify.design';\nconst DEFAULT_UA = 'Almadar/1.0 (https://almadar.dev)';\nconst DEFAULT_TIMEOUT_MS = 6000;\n\ninterface IconCollection { icons?: Record<string, { body: string }>; aliases?: Record<string, { body: string }>; }\ninterface SearchResponse { icons?: string[]; }\n\nexport class IconifyIntegration extends BaseIntegration {\n private readonly userAgent: string;\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.userAgent = config.env?.ICONIFY_USER_AGENT ?? DEFAULT_UA;\n this.timeoutMs = Number(config.env?.ICONIFY_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('Iconify integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): 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 try {\n let data: unknown;\n switch (action) {\n case 'svgExists':\n data = await this.executeWithRetry(() => this.svgExists(params));\n break;\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n case 'getIconBody':\n data = await this.executeWithRetry(() => this.getIconBody(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async svgExists(params: IntegrationParams): Promise<{ exists: boolean }> {\n const path = String(params.path ?? '');\n if (!path) return { exists: false };\n return { exists: await this.headOk(`${ICONIFY_API}/${path}`) };\n }\n\n private async search(params: IntegrationParams): Promise<{ icons: string[] }> {\n const query = String(params.query ?? '');\n if (!query) return { icons: [] };\n const limit = Number(params.limit ?? 1);\n const data = await this.getJson<SearchResponse>(`${ICONIFY_API}/search?query=${encodeURIComponent(query)}&limit=${limit}`);\n return { icons: data?.icons ?? [] };\n }\n\n private async getIconBody(params: IntegrationParams): Promise<{ body: string | null }> {\n const iconId = String(params.iconId ?? '');\n const [prefix, name] = iconId.split(':');\n if (!prefix || !name) return { body: null };\n const data = await this.getJson<IconCollection>(`${ICONIFY_API}/${prefix}.json?icons=${encodeURIComponent(name)}`);\n return { body: data?.icons?.[name]?.body ?? data?.aliases?.[name]?.body ?? null };\n }\n\n private async headOk(url: string): Promise<boolean> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { method: 'GET', headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n return res.ok;\n } catch {\n return false;\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async getJson<T>(url: string): Promise<T | null> {\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'User-Agent': this.userAgent }, signal: ctrl.signal });\n if (!res.ok) return null;\n return (await res.json()) as T;\n } catch {\n return null;\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('iconify', IconifyIntegration);\n","import { BaseIntegration } from '../../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult, IntegrationError, IntegrationParams } from '../../types';\nimport { registerIntegration } from '../../registry';\n\n/**\n * arXiv integration — the live-search backend for the knowledge-worker's\n * \"emerging\" axis (frontier academic concepts beyond the user's graph). Wraps\n * the public Atom API at export.arxiv.org. Chosen as the placeholder web-search\n * vendor; the action shape matches a generic search so the backend can be\n * swapped without touching the rabit tool surface.\n */\nconst ARXIV_ENDPOINT = 'https://export.arxiv.org/api/query';\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_MAX_RESULTS = 8;\n\nexport interface ArxivResult {\n id: string;\n title: string;\n summary: string;\n authors: string[];\n published: string;\n url: string;\n}\n\n/** Minimal Atom `<entry>` extractor — arXiv's feed is regular; no XML dep needed. */\nfunction parseAtom(xml: string): ArxivResult[] {\n const entries: ArxivResult[] = [];\n for (const block of xml.split('<entry>').slice(1)) {\n const grab = (tag: string): string => {\n const m = block.match(new RegExp(`<${tag}[^>]*>([\\\\s\\\\S]*?)</${tag}>`, 'i'));\n return m ? m[1].replace(/<[^>]+>/g, '').trim() : '';\n };\n const id = grab('id');\n const title = grab('title').replace(/\\s+/g, ' ');\n const summary = grab('summary').replace(/\\s+/g, ' ');\n const published = grab('published');\n const authors = Array.from(block.matchAll(/<author>\\s*<name>([^<]+)<\\/name>/g)).map(m => m[1].trim());\n const linkMatch = block.match(/<link[^>]*rel=\"alternate\"[^>]*href=\"([^\"]+)\"/i);\n const url = linkMatch ? linkMatch[1] : id;\n if (id || title) entries.push({ id, title, summary, authors, published, url });\n }\n return entries;\n}\n\nexport class ArxivIntegration extends BaseIntegration {\n private readonly timeoutMs: number;\n\n constructor(config: IntegrationConfig) {\n super(config);\n this.timeoutMs = Number(config.env?.ARXIV_TIMEOUT_MS ?? DEFAULT_TIMEOUT_MS);\n this.logger.info('arXiv integration initialized');\n }\n\n async execute(action: string, params: IntegrationParams): 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 try {\n let data: unknown;\n switch (action) {\n case 'search':\n data = await this.executeWithRetry(() => this.search(params));\n break;\n default:\n throw new Error(`Unknown action: ${action}`);\n }\n return { success: true, data, metadata: this.createMetadata(action, Date.now() - startTime) };\n } catch (error) {\n return this.handleError(action, error);\n }\n }\n\n private async search(params: IntegrationParams): Promise<{ results: ArxivResult[] }> {\n const query = String(params.query ?? '').trim();\n if (!query) return { results: [] };\n const maxResults = Number(params.maxResults ?? DEFAULT_MAX_RESULTS);\n // arXiv search_query: quote the term as an all-fields term.\n const url = `${ARXIV_ENDPOINT}?search_query=${encodeURIComponent(`all:${query}`)}&start=0&max_results=${maxResults}&sortBy=relevance`;\n const ctrl = new AbortController();\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\n try {\n const res = await fetch(url, { headers: { 'Accept': 'application/atom+xml' }, signal: ctrl.signal });\n if (!res.ok) return { results: [] };\n const xml = await res.text();\n return { results: parseAtom(xml) };\n } finally {\n clearTimeout(timer);\n }\n }\n}\n\n// Auto-register\nregisterIntegration('arxiv', ArxivIntegration);\n"]}