@almadar/integrations 1.0.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/LICENSE +72 -0
- package/README.md +290 -0
- package/dist/factory-rMujCO3M.d.ts +159 -0
- package/dist/index.d.ts +189 -0
- package/dist/index.js +1336 -0
- package/dist/index.js.map +1 -0
- package/dist/mocks/index.d.ts +50 -0
- package/dist/mocks/index.js +342 -0
- package/dist/mocks/index.js.map +1 -0
- package/dist/runtime/index.d.ts +29 -0
- package/dist/runtime/index.js +179 -0
- package/dist/runtime/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/core/logger.ts","../../src/core/validation.ts","../../src/core/retry.ts","../../src/core/BaseIntegration.ts","../../src/mocks/MockIntegration.ts","../../src/registry.ts","../../src/factory.ts","../../src/mocks/MockIntegrationFactory.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { IntegrationLogger } from '../types';\n\n/**\n * Console-based logger implementation\n */\nexport class ConsoleLogger implements IntegrationLogger {\n private level: 'debug' | 'info' | 'warn' | 'error';\n\n constructor(level: 'debug' | 'info' | 'warn' | 'error' = 'info') {\n this.level = level;\n }\n\n debug(message: string, meta?: Record<string, unknown>): void {\n if (this.shouldLog('debug')) {\n console.debug(`[DEBUG] ${message}`, meta || '');\n }\n }\n\n info(message: string, meta?: Record<string, unknown>): void {\n if (this.shouldLog('info')) {\n console.log(`[INFO] ${message}`, meta || '');\n }\n }\n\n warn(message: string, meta?: Record<string, unknown>): void {\n if (this.shouldLog('warn')) {\n console.warn(`[WARN] ${message}`, meta || '');\n }\n }\n\n error(message: string, meta?: Record<string, unknown>): void {\n if (this.shouldLog('error')) {\n console.error(`[ERROR] ${message}`, meta || '');\n }\n }\n\n private shouldLog(level: string): boolean {\n const levels = ['debug', 'info', 'warn', 'error'];\n return levels.indexOf(level) >= levels.indexOf(this.level);\n }\n}\n","import type { ValidationResult, ValidationError } from '../types';\n\n// Import integrators registry\nimport integratorsRegistry from '@almadar/patterns/integrators-registry.json';\n\n/**\n * Validate action params against registry schema\n */\nexport function validateParams(\n integration: string,\n action: string,\n params: Record<string, unknown>,\n): ValidationResult {\n const registry = (integratorsRegistry as any).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: any) => a.name === action);\n\n if (!actionDef) {\n return {\n valid: false,\n errors: [{ param: 'action', message: `Unknown action: ${action}` }],\n };\n }\n\n const errors: ValidationError[] = [];\n\n // Check required params\n for (const paramDef of actionDef.params) {\n if (paramDef.required && !(paramDef.name in params)) {\n errors.push({\n param: paramDef.name,\n message: `Missing required parameter: ${paramDef.name}`,\n });\n }\n\n // Type validation\n if (paramDef.name in params) {\n const value = params[paramDef.name];\n const expectedType = paramDef.type;\n const actualType = typeof value;\n\n if (expectedType === 'number' && actualType !== 'number') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'string' && actualType !== 'string') {\n errors.push({\n param: paramDef.name,\n message: `Expected ${expectedType}, got ${actualType}`,\n });\n }\n\n if (expectedType === 'array' && !Array.isArray(value)) {\n errors.push({\n param: paramDef.name,\n message: `Expected array, got ${actualType}`,\n });\n }\n\n if (\n expectedType === 'object' &&\n (actualType !== 'object' || Array.isArray(value) || value === null)\n ) {\n errors.push({\n param: paramDef.name,\n message: `Expected object, got ${actualType}`,\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n };\n}\n","import type { IntegrationError, IntegrationErrorCode } from '../types';\n\n/**\n * Retry configuration\n */\nexport interface RetryConfig {\n maxAttempts: number;\n backoffMs: number;\n maxBackoffMs?: number;\n retryableErrors?: IntegrationErrorCode[];\n}\n\n/**\n * Execute a function with retry logic\n */\nexport async function withRetry<T>(\n fn: () => Promise<T>,\n config: RetryConfig,\n): Promise<T> {\n const {\n maxAttempts,\n backoffMs,\n maxBackoffMs = 30000,\n retryableErrors,\n } = config;\n\n let lastError: unknown;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n try {\n return await fn();\n } catch (error) {\n lastError = error;\n\n // Check if error is retryable\n if (\n error &&\n typeof error === 'object' &&\n 'code' in error &&\n retryableErrors\n ) {\n const integrationError = error as IntegrationError;\n if (!retryableErrors.includes(integrationError.code)) {\n throw error;\n }\n }\n\n // Last attempt, throw\n if (attempt === maxAttempts) {\n throw error;\n }\n\n // Wait before retry (exponential backoff)\n const delay = Math.min(\n backoffMs * Math.pow(2, attempt - 1),\n maxBackoffMs,\n );\n await new Promise((resolve) => setTimeout(resolve, delay));\n }\n }\n\n throw lastError;\n}\n","import type {\n IntegrationConfig,\n IntegrationResult,\n IntegrationLogger,\n IntegrationError,\n} from '../types';\nimport { ConsoleLogger } from './logger';\nimport { validateParams } from './validation';\nimport { withRetry } from './retry';\n\n/**\n * Base class for all integrations\n */\nexport abstract class BaseIntegration {\n protected config: IntegrationConfig;\n protected logger: IntegrationLogger;\n\n constructor(config: IntegrationConfig) {\n this.config = config;\n this.logger = config.logger || new ConsoleLogger();\n }\n\n /**\n * Execute an action\n */\n abstract execute(\n action: string,\n params: Record<string, unknown>,\n ): Promise<IntegrationResult>;\n\n /**\n * Validate action params against registry\n */\n protected validateParams(\n action: string,\n params: Record<string, unknown>,\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,\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 { BaseIntegration } from '../core/BaseIntegration';\nimport type { IntegrationConfig, IntegrationResult } from '../types';\n\n/**\n * Mock integration for testing\n */\nexport class MockIntegration extends BaseIntegration {\n private responses: Map<string, unknown> = new Map();\n private calls: Array<{ action: string; params: Record<string, unknown> }> =\n [];\n\n constructor(config: IntegrationConfig) {\n super(config);\n }\n\n /**\n * Set mock response for an action\n */\n setResponse(action: string, data: unknown): void {\n this.responses.set(action, data);\n }\n\n /**\n * Get all calls made to this integration\n */\n getCalls(): Array<{ action: string; params: Record<string, unknown> }> {\n return this.calls;\n }\n\n /**\n * Clear all calls\n */\n clearCalls(): void {\n this.calls = [];\n }\n\n async execute(\n action: string,\n params: Record<string, unknown>,\n ): Promise<IntegrationResult> {\n // Record the call\n this.calls.push({ action, params });\n\n const data = this.responses.get(action);\n\n if (!data) {\n return {\n success: false,\n error: {\n name: 'IntegrationError',\n message: `No mock response for action: ${action}`,\n code: 'UNKNOWN_ERROR',\n } as any,\n metadata: this.createMetadata(action, 0),\n };\n }\n\n return {\n success: true,\n data,\n metadata: this.createMetadata(action, 0),\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 } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\nimport { getIntegration } from './registry';\n\n/**\n * Factory for creating and managing integration instances\n */\nexport class IntegrationFactory {\n private instances: Map<string, BaseIntegration> = new Map();\n private configs: Map<string, IntegrationConfig> = new Map();\n\n /**\n * Configure an integration (doesn't instantiate yet)\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>): void {\n this.configs.set(name, { name, ...config });\n }\n\n /**\n * Get or create an integration instance\n */\n get(name: string): BaseIntegration {\n // Return existing instance\n if (this.instances.has(name)) {\n return this.instances.get(name)!;\n }\n\n // Get constructor\n const Constructor = getIntegration(name);\n if (!Constructor) {\n throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);\n }\n\n // Get config\n const config = this.configs.get(name);\n if (!config) {\n throw new Error(\n `Integration not configured: ${name}. Call configure() first.`,\n );\n }\n\n // Create instance\n const instance = new Constructor(config);\n this.instances.set(name, instance);\n\n return instance;\n }\n\n /**\n * Execute an action on an integration\n */\n async execute(\n integration: string,\n action: string,\n params: Record<string, unknown>,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration);\n return await instance.execute(action, params);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string): boolean {\n return this.configs.has(name);\n }\n\n /**\n * 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","import { IntegrationFactory } from '../factory';\nimport { MockIntegration } from './MockIntegration';\nimport { registerIntegration } from '../registry';\n\n/**\n * Mock integration factory for testing\n */\nexport class MockIntegrationFactory extends IntegrationFactory {\n constructor() {\n super();\n \n // Register mock integration for all known services\n const services = ['stripe', 'youtube', 'twilio', 'email', 'llm', 'deepagent'];\n services.forEach((service) => {\n registerIntegration(`mock-${service}`, MockIntegration);\n \n // Configure with mock config\n this.configure(service, {\n env: {},\n });\n });\n }\n\n /**\n * Set mock response for an integration action\n */\n setMockResponse(integration: string, action: string, data: unknown): void {\n const instance = this.get(integration) as MockIntegration;\n instance.setResponse(action, data);\n }\n\n /**\n * Get calls made to an integration\n */\n getMockCalls(\n integration: string,\n ): Array<{ action: string; params: Record<string, unknown> }> {\n const instance = this.get(integration) as MockIntegration;\n return instance.getCalls();\n }\n\n /**\n * Clear calls for an integration\n */\n clearMockCalls(integration: string): void {\n const instance = this.get(integration) as MockIntegration;\n instance.clearCalls();\n }\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { e as IntegrationFactory } from '../factory-rMujCO3M.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Runtime integration manager
|
|
5
|
+
* Auto-configures integrations from environment variables
|
|
6
|
+
*/
|
|
7
|
+
declare class RuntimeIntegrationManager {
|
|
8
|
+
private factory;
|
|
9
|
+
constructor();
|
|
10
|
+
/**
|
|
11
|
+
* Configure from environment variables
|
|
12
|
+
*/
|
|
13
|
+
configureFromEnv(): void;
|
|
14
|
+
/**
|
|
15
|
+
* Get effect handler for runtime
|
|
16
|
+
*/
|
|
17
|
+
getCallServiceHandler(): (service: string, action: string, params: Record<string, unknown> | undefined) => Promise<unknown>;
|
|
18
|
+
/**
|
|
19
|
+
* Get factory (for advanced usage)
|
|
20
|
+
*/
|
|
21
|
+
getFactory(): IntegrationFactory;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Create a callService effect handler for @almadar/runtime
|
|
26
|
+
*/
|
|
27
|
+
declare function createCallServiceHandler(factory: IntegrationFactory): (service: string, action: string, params: Record<string, unknown> | undefined) => Promise<unknown>;
|
|
28
|
+
|
|
29
|
+
export { RuntimeIntegrationManager, createCallServiceHandler };
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
// src/registry.ts
|
|
2
|
+
var INTEGRATION_REGISTRY = {};
|
|
3
|
+
function getIntegration(name) {
|
|
4
|
+
return INTEGRATION_REGISTRY[name];
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
// src/factory.ts
|
|
8
|
+
var IntegrationFactory = class {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.instances = /* @__PURE__ */ new Map();
|
|
11
|
+
this.configs = /* @__PURE__ */ new Map();
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Configure an integration (doesn't instantiate yet)
|
|
15
|
+
*/
|
|
16
|
+
configure(name, config) {
|
|
17
|
+
this.configs.set(name, { name, ...config });
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get or create an integration instance
|
|
21
|
+
*/
|
|
22
|
+
get(name) {
|
|
23
|
+
if (this.instances.has(name)) {
|
|
24
|
+
return this.instances.get(name);
|
|
25
|
+
}
|
|
26
|
+
const Constructor = getIntegration(name);
|
|
27
|
+
if (!Constructor) {
|
|
28
|
+
throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);
|
|
29
|
+
}
|
|
30
|
+
const config = this.configs.get(name);
|
|
31
|
+
if (!config) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`Integration not configured: ${name}. Call configure() first.`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
const instance = new Constructor(config);
|
|
37
|
+
this.instances.set(name, instance);
|
|
38
|
+
return instance;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Execute an action on an integration
|
|
42
|
+
*/
|
|
43
|
+
async execute(integration, action, params) {
|
|
44
|
+
const instance = this.get(integration);
|
|
45
|
+
return await instance.execute(action, params);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Check if integration is configured
|
|
49
|
+
*/
|
|
50
|
+
isConfigured(name) {
|
|
51
|
+
return this.configs.has(name);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Clear all instances (useful for testing)
|
|
55
|
+
*/
|
|
56
|
+
clear() {
|
|
57
|
+
this.instances.clear();
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Clear all instances and configs
|
|
61
|
+
*/
|
|
62
|
+
reset() {
|
|
63
|
+
this.instances.clear();
|
|
64
|
+
this.configs.clear();
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// src/runtime/effectHandler.ts
|
|
69
|
+
function createCallServiceHandler(factory) {
|
|
70
|
+
return async (service, action, params) => {
|
|
71
|
+
const result = await factory.execute(service, action, params || {});
|
|
72
|
+
if (!result.success) {
|
|
73
|
+
throw result.error;
|
|
74
|
+
}
|
|
75
|
+
return result.data;
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// src/runtime/RuntimeIntegrationManager.ts
|
|
80
|
+
var RuntimeIntegrationManager = class {
|
|
81
|
+
constructor() {
|
|
82
|
+
this.factory = new IntegrationFactory();
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Configure from environment variables
|
|
86
|
+
*/
|
|
87
|
+
configureFromEnv() {
|
|
88
|
+
const env = process.env;
|
|
89
|
+
if (env.STRIPE_SECRET_KEY) {
|
|
90
|
+
this.factory.configure("stripe", {
|
|
91
|
+
env: {
|
|
92
|
+
STRIPE_SECRET_KEY: env.STRIPE_SECRET_KEY
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
if (env.YOUTUBE_API_KEY) {
|
|
97
|
+
this.factory.configure("youtube", {
|
|
98
|
+
env: {
|
|
99
|
+
YOUTUBE_API_KEY: env.YOUTUBE_API_KEY
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
if (env.TWILIO_ACCOUNT_SID && env.TWILIO_AUTH_TOKEN) {
|
|
104
|
+
this.factory.configure("twilio", {
|
|
105
|
+
env: {
|
|
106
|
+
TWILIO_ACCOUNT_SID: env.TWILIO_ACCOUNT_SID,
|
|
107
|
+
TWILIO_AUTH_TOKEN: env.TWILIO_AUTH_TOKEN,
|
|
108
|
+
TWILIO_PHONE_NUMBER: env.TWILIO_PHONE_NUMBER || ""
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
if (env.SENDGRID_API_KEY) {
|
|
113
|
+
this.factory.configure("email", {
|
|
114
|
+
env: {
|
|
115
|
+
PROVIDER: "sendgrid",
|
|
116
|
+
SENDGRID_API_KEY: env.SENDGRID_API_KEY,
|
|
117
|
+
FROM_EMAIL: env.FROM_EMAIL || "noreply@example.com"
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
} else if (env.RESEND_API_KEY) {
|
|
121
|
+
this.factory.configure("email", {
|
|
122
|
+
env: {
|
|
123
|
+
PROVIDER: "resend",
|
|
124
|
+
RESEND_API_KEY: env.RESEND_API_KEY,
|
|
125
|
+
FROM_EMAIL: env.FROM_EMAIL || "noreply@example.com"
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
if (env.ANTHROPIC_API_KEY) {
|
|
130
|
+
this.factory.configure("llm", {
|
|
131
|
+
env: {
|
|
132
|
+
PROVIDER: "anthropic",
|
|
133
|
+
ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
} else if (env.OPENAI_API_KEY) {
|
|
137
|
+
this.factory.configure("llm", {
|
|
138
|
+
env: {
|
|
139
|
+
PROVIDER: "openai",
|
|
140
|
+
OPENAI_API_KEY: env.OPENAI_API_KEY
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
}
|
|
144
|
+
if (env.DEEPAGENT_API_URL) {
|
|
145
|
+
this.factory.configure("deepagent", {
|
|
146
|
+
env: {
|
|
147
|
+
DEEPAGENT_API_URL: env.DEEPAGENT_API_URL,
|
|
148
|
+
DEEPAGENT_API_KEY: env.DEEPAGENT_API_KEY || ""
|
|
149
|
+
}
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
if (env.GITHUB_TOKEN) {
|
|
153
|
+
this.factory.configure("github", {
|
|
154
|
+
env: {
|
|
155
|
+
GITHUB_TOKEN: env.GITHUB_TOKEN,
|
|
156
|
+
GITHUB_OWNER: env.GITHUB_OWNER || "",
|
|
157
|
+
GITHUB_REPO: env.GITHUB_REPO || "",
|
|
158
|
+
GITHUB_WORK_DIR: env.GITHUB_WORK_DIR || ""
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get effect handler for runtime
|
|
165
|
+
*/
|
|
166
|
+
getCallServiceHandler() {
|
|
167
|
+
return createCallServiceHandler(this.factory);
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Get factory (for advanced usage)
|
|
171
|
+
*/
|
|
172
|
+
getFactory() {
|
|
173
|
+
return this.factory;
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
|
|
177
|
+
export { RuntimeIntegrationManager, createCallServiceHandler };
|
|
178
|
+
//# sourceMappingURL=index.js.map
|
|
179
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/registry.ts","../../src/factory.ts","../../src/runtime/effectHandler.ts","../../src/runtime/RuntimeIntegrationManager.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["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 } from './types';\nimport { BaseIntegration } from './core/BaseIntegration';\nimport { getIntegration } from './registry';\n\n/**\n * Factory for creating and managing integration instances\n */\nexport class IntegrationFactory {\n private instances: Map<string, BaseIntegration> = new Map();\n private configs: Map<string, IntegrationConfig> = new Map();\n\n /**\n * Configure an integration (doesn't instantiate yet)\n */\n configure(name: string, config: Omit<IntegrationConfig, 'name'>): void {\n this.configs.set(name, { name, ...config });\n }\n\n /**\n * Get or create an integration instance\n */\n get(name: string): BaseIntegration {\n // Return existing instance\n if (this.instances.has(name)) {\n return this.instances.get(name)!;\n }\n\n // Get constructor\n const Constructor = getIntegration(name);\n if (!Constructor) {\n throw new Error(`Unknown integration: ${name}. Make sure it's imported.`);\n }\n\n // Get config\n const config = this.configs.get(name);\n if (!config) {\n throw new Error(\n `Integration not configured: ${name}. Call configure() first.`,\n );\n }\n\n // Create instance\n const instance = new Constructor(config);\n this.instances.set(name, instance);\n\n return instance;\n }\n\n /**\n * Execute an action on an integration\n */\n async execute(\n integration: string,\n action: string,\n params: Record<string, unknown>,\n ): Promise<IntegrationResult> {\n const instance = this.get(integration);\n return await instance.execute(action, params);\n }\n\n /**\n * Check if integration is configured\n */\n isConfigured(name: string): boolean {\n return this.configs.has(name);\n }\n\n /**\n * 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","import { IntegrationFactory } from '../factory';\nimport type { IntegrationResult } from '../types';\n\n/**\n * Create a callService effect handler for @almadar/runtime\n */\nexport function createCallServiceHandler(factory: IntegrationFactory) {\n return async (\n service: string,\n action: string,\n params: Record<string, unknown> | undefined,\n ): Promise<unknown> => {\n const result = await factory.execute(service, action, params || {});\n\n if (!result.success) {\n throw result.error;\n }\n\n return result.data;\n };\n}\n","import { IntegrationFactory } from '../factory';\nimport { createCallServiceHandler } from './effectHandler';\n\n/**\n * Runtime integration manager\n * Auto-configures integrations from environment variables\n */\nexport class RuntimeIntegrationManager {\n private factory: IntegrationFactory;\n\n constructor() {\n this.factory = new IntegrationFactory();\n }\n\n /**\n * Configure from environment variables\n */\n configureFromEnv(): void {\n const env = process.env;\n\n // Stripe\n if (env.STRIPE_SECRET_KEY) {\n this.factory.configure('stripe', {\n env: {\n STRIPE_SECRET_KEY: env.STRIPE_SECRET_KEY,\n },\n });\n }\n\n // YouTube\n if (env.YOUTUBE_API_KEY) {\n this.factory.configure('youtube', {\n env: {\n YOUTUBE_API_KEY: env.YOUTUBE_API_KEY,\n },\n });\n }\n\n // Twilio\n if (env.TWILIO_ACCOUNT_SID && env.TWILIO_AUTH_TOKEN) {\n this.factory.configure('twilio', {\n env: {\n TWILIO_ACCOUNT_SID: env.TWILIO_ACCOUNT_SID,\n TWILIO_AUTH_TOKEN: env.TWILIO_AUTH_TOKEN,\n TWILIO_PHONE_NUMBER: env.TWILIO_PHONE_NUMBER || '',\n },\n });\n }\n\n // Email (SendGrid)\n if (env.SENDGRID_API_KEY) {\n this.factory.configure('email', {\n env: {\n PROVIDER: 'sendgrid',\n SENDGRID_API_KEY: env.SENDGRID_API_KEY,\n FROM_EMAIL: env.FROM_EMAIL || 'noreply@example.com',\n },\n });\n }\n // Email (Resend)\n else if (env.RESEND_API_KEY) {\n this.factory.configure('email', {\n env: {\n PROVIDER: 'resend',\n RESEND_API_KEY: env.RESEND_API_KEY,\n FROM_EMAIL: env.FROM_EMAIL || 'noreply@example.com',\n },\n });\n }\n\n // LLM (Anthropic)\n if (env.ANTHROPIC_API_KEY) {\n this.factory.configure('llm', {\n env: {\n PROVIDER: 'anthropic',\n ANTHROPIC_API_KEY: env.ANTHROPIC_API_KEY,\n },\n });\n }\n // LLM (OpenAI)\n else if (env.OPENAI_API_KEY) {\n this.factory.configure('llm', {\n env: {\n PROVIDER: 'openai',\n OPENAI_API_KEY: env.OPENAI_API_KEY,\n },\n });\n }\n\n // DeepAgent\n if (env.DEEPAGENT_API_URL) {\n this.factory.configure('deepagent', {\n env: {\n DEEPAGENT_API_URL: env.DEEPAGENT_API_URL,\n DEEPAGENT_API_KEY: env.DEEPAGENT_API_KEY || '',\n },\n });\n }\n\n // GitHub\n if (env.GITHUB_TOKEN) {\n this.factory.configure('github', {\n env: {\n GITHUB_TOKEN: env.GITHUB_TOKEN,\n GITHUB_OWNER: env.GITHUB_OWNER || '',\n GITHUB_REPO: env.GITHUB_REPO || '',\n GITHUB_WORK_DIR: env.GITHUB_WORK_DIR || '',\n },\n });\n }\n }\n\n /**\n * Get effect handler for runtime\n */\n getCallServiceHandler() {\n return createCallServiceHandler(this.factory);\n }\n\n /**\n * Get factory (for advanced usage)\n */\n getFactory(): IntegrationFactory {\n return this.factory;\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@almadar/integrations",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "External service integrations for Almadar applications",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
},
|
|
14
|
+
"./runtime": {
|
|
15
|
+
"import": "./dist/runtime/index.js",
|
|
16
|
+
"types": "./dist/runtime/index.d.ts"
|
|
17
|
+
},
|
|
18
|
+
"./mocks": {
|
|
19
|
+
"import": "./dist/mocks/index.js",
|
|
20
|
+
"types": "./dist/mocks/index.d.ts"
|
|
21
|
+
}
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"README.md"
|
|
26
|
+
],
|
|
27
|
+
"publishConfig": {
|
|
28
|
+
"access": "public"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"stripe": "^17.5.0",
|
|
32
|
+
"twilio": "^5.3.6",
|
|
33
|
+
"@sendgrid/mail": "^8.1.4",
|
|
34
|
+
"resend": "^4.0.1",
|
|
35
|
+
"googleapis": "^144.0.0",
|
|
36
|
+
"dotenv": "^16.4.0",
|
|
37
|
+
"@almadar/core": "1.0.1",
|
|
38
|
+
"@almadar/patterns": "1.0.1",
|
|
39
|
+
"@almadar/llm": "1.0.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@types/node": "^20.0.0",
|
|
43
|
+
"tsup": "^8.0.0",
|
|
44
|
+
"typescript": "^5.7.0",
|
|
45
|
+
"vitest": "^2.1.0"
|
|
46
|
+
},
|
|
47
|
+
"repository": {
|
|
48
|
+
"type": "git",
|
|
49
|
+
"url": "https://github.com/almadar-io/almadar.git",
|
|
50
|
+
"directory": "packages/almadar-integrations"
|
|
51
|
+
},
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"keywords": [
|
|
54
|
+
"almadar",
|
|
55
|
+
"integrations",
|
|
56
|
+
"stripe",
|
|
57
|
+
"twilio",
|
|
58
|
+
"youtube",
|
|
59
|
+
"email",
|
|
60
|
+
"llm",
|
|
61
|
+
"api"
|
|
62
|
+
],
|
|
63
|
+
"scripts": {
|
|
64
|
+
"build": "tsup",
|
|
65
|
+
"build:watch": "tsup --watch",
|
|
66
|
+
"test": "vitest --run",
|
|
67
|
+
"test:watch": "vitest",
|
|
68
|
+
"typecheck": "tsc --noEmit",
|
|
69
|
+
"lint": "eslint src/"
|
|
70
|
+
}
|
|
71
|
+
}
|