@vly-ai/integrations 0.6.1 → 0.6.3

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.d.mts CHANGED
@@ -1,8 +1,10 @@
1
1
  import * as _ai_sdk_openai_compatible from '@ai-sdk/openai-compatible';
2
+ export { ScreenshotMessage, initScreenshotListener, initVly } from './project-thumbnail/index.mjs';
3
+ import { Plugin } from 'vite';
2
4
  export { CoreMessage } from 'ai';
3
5
 
4
6
  interface VlyConfig {
5
- deploymentToken: string;
7
+ deploymentToken?: string;
6
8
  debug?: boolean;
7
9
  }
8
10
  interface RequestOptions {
@@ -112,11 +114,31 @@ declare class VlyEmail extends VlyClient {
112
114
  }>>>;
113
115
  }
114
116
 
117
+ /**
118
+ * VLY Vite Plugin
119
+ *
120
+ * Injects the @vly-ai/integrations runtime into the page.
121
+ * This includes:
122
+ * - HMR error reporting
123
+ * - Other VLY platform integrations
124
+ *
125
+ * Usage in vite.config.ts:
126
+ * ```typescript
127
+ * import { vlyPlugin } from '@vly-ai/integrations';
128
+ *
129
+ * export default defineConfig({
130
+ * plugins: [vlyPlugin()],
131
+ * });
132
+ * ```
133
+ */
134
+ declare function vlyPlugin(): Plugin;
135
+
115
136
  declare class VlyIntegrations {
116
- ai: VlyAI;
117
- email: VlyEmail;
137
+ readonly ai: VlyAI;
138
+ readonly email: VlyEmail;
139
+ readonly config: Required<VlyConfig>;
118
140
  constructor(config: VlyConfig);
119
141
  }
120
142
  declare function createVlyIntegrations(config: VlyConfig): VlyIntegrations;
121
143
 
122
- export { type AICompletionRequest, type AICompletionResponse, type AIModel, type ApiResponse, type EmailRequest, type EmailResponse, type RequestOptions, VlyAI, type VlyConfig, VlyEmail, VlyIntegrations, createVlyIntegrations };
144
+ export { type AICompletionRequest, type AICompletionResponse, type AIModel, type ApiResponse, type EmailRequest, type EmailResponse, type RequestOptions, VlyAI, type VlyConfig, VlyEmail, VlyIntegrations, createVlyIntegrations, vlyPlugin };
package/dist/index.d.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import * as _ai_sdk_openai_compatible from '@ai-sdk/openai-compatible';
2
+ export { ScreenshotMessage, initScreenshotListener, initVly } from './project-thumbnail/index.js';
3
+ import { Plugin } from 'vite';
2
4
  export { CoreMessage } from 'ai';
3
5
 
4
6
  interface VlyConfig {
5
- deploymentToken: string;
7
+ deploymentToken?: string;
6
8
  debug?: boolean;
7
9
  }
8
10
  interface RequestOptions {
@@ -112,11 +114,31 @@ declare class VlyEmail extends VlyClient {
112
114
  }>>>;
113
115
  }
114
116
 
117
+ /**
118
+ * VLY Vite Plugin
119
+ *
120
+ * Injects the @vly-ai/integrations runtime into the page.
121
+ * This includes:
122
+ * - HMR error reporting
123
+ * - Other VLY platform integrations
124
+ *
125
+ * Usage in vite.config.ts:
126
+ * ```typescript
127
+ * import { vlyPlugin } from '@vly-ai/integrations';
128
+ *
129
+ * export default defineConfig({
130
+ * plugins: [vlyPlugin()],
131
+ * });
132
+ * ```
133
+ */
134
+ declare function vlyPlugin(): Plugin;
135
+
115
136
  declare class VlyIntegrations {
116
- ai: VlyAI;
117
- email: VlyEmail;
137
+ readonly ai: VlyAI;
138
+ readonly email: VlyEmail;
139
+ readonly config: Required<VlyConfig>;
118
140
  constructor(config: VlyConfig);
119
141
  }
120
142
  declare function createVlyIntegrations(config: VlyConfig): VlyIntegrations;
121
143
 
122
- export { type AICompletionRequest, type AICompletionResponse, type AIModel, type ApiResponse, type EmailRequest, type EmailResponse, type RequestOptions, VlyAI, type VlyConfig, VlyEmail, VlyIntegrations, createVlyIntegrations };
144
+ export { type AICompletionRequest, type AICompletionResponse, type AIModel, type ApiResponse, type EmailRequest, type EmailResponse, type RequestOptions, VlyAI, type VlyConfig, VlyEmail, VlyIntegrations, createVlyIntegrations, vlyPlugin };
package/dist/index.js CHANGED
@@ -146,8 +146,8 @@ var VlyClient = class {
146
146
  config;
147
147
  constructor(config) {
148
148
  this.config = {
149
- deploymentToken: config.deploymentToken,
150
- debug: config.debug || false
149
+ deploymentToken: config.deploymentToken || "vlytomoonF2024",
150
+ debug: config.debug ?? false
151
151
  };
152
152
  }
153
153
  async request(endpoint, method, data, options) {
@@ -231,7 +231,7 @@ var VlyEmail = class extends VlyClient {
231
231
  });
232
232
  const payload = {
233
233
  to: Array.isArray(email.to) ? email.to : [email.to],
234
- from: email.from || "noreply@vly.io",
234
+ from: email.from || "noreply@project.vly.sh",
235
235
  subject: email.subject,
236
236
  html: email.html,
237
237
  text: email.text,
@@ -305,16 +305,148 @@ var VlyEmail = class extends VlyClient {
305
305
  }
306
306
  };
307
307
 
308
+ // src/project-thumbnail/screenshot.ts
309
+ function initScreenshotListener() {
310
+ console.log("[VLY Runtime] Screenshot listener initialized");
311
+ if (typeof window.html2canvas === "undefined") {
312
+ const script = document.createElement("script");
313
+ script.src = "https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js";
314
+ script.async = true;
315
+ document.head.appendChild(script);
316
+ }
317
+ window.addEventListener("message", async (event) => {
318
+ const message = event.data;
319
+ if (message.type !== "vly-screenshot-request") return;
320
+ try {
321
+ if (typeof window.html2canvas === "undefined") {
322
+ throw new Error("html2canvas not loaded yet");
323
+ }
324
+ const html2canvas = window.html2canvas;
325
+ const canvas = await html2canvas(document.body, {
326
+ useCORS: true,
327
+ allowTaint: false,
328
+ backgroundColor: "#ffffff",
329
+ logging: false,
330
+ scale: 0.5,
331
+ width: window.innerWidth,
332
+ height: window.innerHeight
333
+ });
334
+ const format = message.format || "jpeg";
335
+ const quality = message.quality || 0.85;
336
+ const mimeType = `image/${format}`;
337
+ canvas.toBlob((blob) => {
338
+ if (!blob) {
339
+ throw new Error("Failed to convert canvas to blob");
340
+ }
341
+ const reader = new FileReader();
342
+ reader.onload = () => {
343
+ window.parent.postMessage({
344
+ type: "vly-screenshot-response",
345
+ requestId: message.requestId,
346
+ dataUrl: reader.result
347
+ }, "*");
348
+ console.log("[VLY Runtime] Screenshot sent to parent");
349
+ };
350
+ reader.onerror = () => {
351
+ throw new Error("FileReader error");
352
+ };
353
+ reader.readAsDataURL(blob);
354
+ }, mimeType, quality);
355
+ } catch (error) {
356
+ console.error("[VLY Runtime] Screenshot failed:", error);
357
+ window.parent.postMessage({
358
+ type: "vly-screenshot-error",
359
+ requestId: message.requestId,
360
+ error: error instanceof Error ? error.message : "Unknown error"
361
+ }, "*");
362
+ }
363
+ });
364
+ }
365
+
366
+ // src/project-thumbnail/index.ts
367
+ function isVlyPlatform() {
368
+ if (typeof window === "undefined") return false;
369
+ const hostname = window.location.hostname;
370
+ return hostname.endsWith(".vly.ai") || hostname.endsWith(".vly.sh") || hostname.includes("localhost") || // For dev
371
+ hostname.includes("127.0.0.1");
372
+ }
373
+ function initVly() {
374
+ if (!isVlyPlatform()) {
375
+ console.log("[VLY Runtime] Not on VLY platform, skipping initialization");
376
+ return;
377
+ }
378
+ console.log("[VLY Runtime] Initializing...");
379
+ initScreenshotListener();
380
+ initHmrErrorReporting();
381
+ console.log("[VLY Runtime] Ready");
382
+ }
383
+ function initHmrErrorReporting() {
384
+ if (undefined) {
385
+ undefined.on("vite:error", (payload) => {
386
+ window.parent.postMessage(
387
+ {
388
+ type: "vly-vite-hmr-error",
389
+ error: {
390
+ message: payload.err?.message || String(payload.err || payload),
391
+ stack: payload.err?.stack,
392
+ plugin: payload.err?.plugin,
393
+ loc: payload.err?.loc
394
+ },
395
+ timestamp: Date.now()
396
+ },
397
+ "*"
398
+ );
399
+ });
400
+ undefined.on("vite:beforeFullReload", () => {
401
+ window.parent.postMessage(
402
+ {
403
+ type: "vly-vite-hmr-success",
404
+ timestamp: Date.now()
405
+ },
406
+ "*"
407
+ );
408
+ });
409
+ }
410
+ }
411
+ if (typeof window !== "undefined") {
412
+ if (document.readyState === "loading") {
413
+ document.addEventListener("DOMContentLoaded", initVly);
414
+ } else {
415
+ initVly();
416
+ }
417
+ }
418
+
419
+ // src/vite-plugin.ts
420
+ function vlyPlugin() {
421
+ return {
422
+ name: "vly-plugin",
423
+ transformIndexHtml() {
424
+ return [
425
+ {
426
+ tag: "script",
427
+ attrs: { type: "module" },
428
+ children: `import '@vly-ai/integrations';`,
429
+ injectTo: "head"
430
+ }
431
+ ];
432
+ }
433
+ };
434
+ }
435
+
308
436
  // src/index.ts
437
+ var DEFAULT_DEPLOYMENT_TOKEN = "vlytomoonF2024";
309
438
  var VlyIntegrations = class {
310
439
  ai;
311
440
  email;
441
+ config;
312
442
  constructor(config) {
313
- if (!config.deploymentToken) {
314
- throw new Error("Deployment token is required");
315
- }
316
- this.ai = new VlyAI(config);
317
- this.email = new VlyEmail(config);
443
+ const normalizedToken = config.deploymentToken && config.deploymentToken.trim().length > 0 ? config.deploymentToken : DEFAULT_DEPLOYMENT_TOKEN;
444
+ this.config = {
445
+ deploymentToken: normalizedToken,
446
+ debug: config.debug ?? false
447
+ };
448
+ this.ai = new VlyAI(this.config);
449
+ this.email = new VlyEmail(this.config);
318
450
  }
319
451
  };
320
452
  function createVlyIntegrations(config) {
@@ -325,5 +457,8 @@ exports.VlyAI = VlyAI;
325
457
  exports.VlyEmail = VlyEmail;
326
458
  exports.VlyIntegrations = VlyIntegrations;
327
459
  exports.createVlyIntegrations = createVlyIntegrations;
460
+ exports.initScreenshotListener = initScreenshotListener;
461
+ exports.initVly = initVly;
462
+ exports.vlyPlugin = vlyPlugin;
328
463
  //# sourceMappingURL=index.js.map
329
464
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/index.ts","../src/client.ts","../src/email/index.ts","../src/index.ts"],"names":["createOpenAICompatible","generateText","streamText"],"mappings":"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","file":"index.js","sourcesContent":["import { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { generateText, streamText, type CoreMessage } from 'ai';\nimport type { \n AICompletionRequest, \n AICompletionResponse,\n RequestOptions,\n ApiResponse,\n VlyConfig\n} from '../types';\n\nexport class VlyAI {\n private provider: ReturnType<typeof createOpenAICompatible>;\n private config: VlyConfig;\n\n constructor(config: VlyConfig) {\n this.config = config;\n this.provider = createOpenAICompatible({\n name: 'vly-gateway',\n baseURL: 'https://integrations.vly.ai/v1/llm',\n headers: {\n 'Authorization': `Bearer ${config.deploymentToken}`,\n },\n });\n }\n\n private getModel(modelName?: string) {\n return this.provider(modelName || 'gpt-5');\n }\n\n private mapMessages(messages: AICompletionRequest['messages']): CoreMessage[] {\n return messages.map(msg => ({\n role: msg.role,\n content: msg.content,\n }));\n }\n\n async completion(\n request: AICompletionRequest, \n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await generateText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n const responseData: AICompletionResponse = {\n id: `vly-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: result.text\n },\n finishReason: result.finishReason || 'stop'\n }],\n usage: {\n promptTokens: result.usage?.inputTokens || 0,\n completionTokens: result.usage?.outputTokens || 0,\n totalTokens: result.usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Request failed'\n };\n }\n }\n\n async streamCompletion(\n request: AICompletionRequest,\n onChunk: (chunk: string) => void,\n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating streaming AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await streamText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n let fullResponse = '';\n\n for await (const delta of result.textStream) {\n fullResponse += delta;\n onChunk(delta);\n }\n\n // Wait for the stream to complete and get usage info\n const usage = await result.usage;\n\n const responseData: AICompletionResponse = {\n id: `vly-stream-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: fullResponse\n },\n finishReason: 'stop'\n }],\n usage: {\n promptTokens: usage?.inputTokens || 0,\n completionTokens: usage?.outputTokens || 0,\n totalTokens: usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] Streaming AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] Streaming AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Streaming request failed'\n };\n }\n }\n\n async embeddings(\n input: string | string[],\n _options?: RequestOptions & { model?: string }\n ): Promise<ApiResponse<{ embeddings: number[][]; usage: any }>> {\n if (this.config.debug) {\n console.log('[Vly] Creating embeddings', { inputCount: Array.isArray(input) ? input.length : 1 });\n }\n \n // Note: AI SDK doesn't have embeddings support for OpenAI-compatible providers yet\n // This would need to be implemented separately or use a different approach\n return {\n success: false,\n error: 'Embeddings not yet supported with AI SDK OpenAI-compatible provider'\n };\n }\n\n // Helper method to get the provider for direct AI SDK usage\n getProvider() {\n return this.provider;\n }\n}","import type { VlyConfig, RequestOptions, ApiResponse } from './types';\n\nexport class VlyClient {\n protected config: Required<VlyConfig>;\n\n constructor(config: VlyConfig) {\n this.config = {\n deploymentToken: config.deploymentToken,\n debug: config.debug || false\n };\n }\n\n protected async request<T = any>(\n endpoint: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n data?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n const url = `https://integrations.vly.ai${endpoint}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.config.deploymentToken}`,\n 'Content-Type': 'application/json',\n 'X-Vly-Version': '0.1.0'\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n body: data ? JSON.stringify(data) : undefined,\n };\n\n // Add timeout using AbortController\n const controller = new AbortController();\n const timeout = options?.timeout || 30000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n fetchOptions.signal = controller.signal;\n\n try {\n const response = await fetch(url, fetchOptions);\n clearTimeout(timeoutId);\n \n const responseData = await response.json().catch(() => ({})) as any;\n\n if (response.ok) {\n return {\n success: true,\n data: responseData as T,\n usage: responseData?.usage\n };\n } else {\n const error = responseData?.error || `Request failed with status ${response.status}`;\n \n if (this.config.debug) {\n console.error(`Vly API Error: ${error}`, {\n endpoint,\n status: response.status,\n data: responseData\n });\n }\n\n return {\n success: false,\n error\n };\n }\n } catch (error: any) {\n clearTimeout(timeoutId);\n const errorMessage = error.name === 'AbortError' ? 'Request timeout' : error.message || 'Unknown error occurred';\n \n if (this.config.debug) {\n console.error(`Vly API Request Failed: ${errorMessage}`, {\n endpoint,\n error\n });\n }\n\n if (options?.retries && options.retries > 0) {\n if (this.config.debug) {\n console.log(`Retrying request... (${options.retries} retries left)`);\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000));\n return this.request(endpoint, method, data, { \n ...options, \n retries: options.retries - 1 \n });\n }\n\n return {\n success: false,\n error: errorMessage\n };\n }\n }\n\n protected log(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[Vly] ${message}`, data || '');\n }\n }\n}","import { VlyClient } from '../client';\nimport type { \n EmailRequest, \n EmailResponse,\n RequestOptions,\n ApiResponse\n} from '../types';\n\nexport class VlyEmail extends VlyClient {\n async send(\n email: EmailRequest, \n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Sending email', { \n to: email.to, \n subject: email.subject \n });\n\n const payload = {\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@vly.io',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n };\n\n const response = await this.request<EmailResponse>(\n '/v1/email/send',\n 'POST',\n payload,\n options\n );\n\n if (response.success) {\n this.log('Email sent successfully', { \n id: response.data?.id,\n status: response.data?.status \n });\n }\n\n return response;\n }\n\n async sendBatch(\n emails: EmailRequest[],\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse[]>> {\n this.log('Sending batch emails', { count: emails.length });\n\n const payload = {\n emails: emails.map(email => ({\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@vly.io',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n }))\n };\n\n return this.request<EmailResponse[]>(\n '/v1/email/batch',\n 'POST',\n payload,\n options\n );\n }\n\n async getStatus(\n emailId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Getting email status', { emailId });\n\n return this.request<EmailResponse>(\n `/v1/email/status/${emailId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async verifyDomain(\n domain: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n domain: string;\n verified: boolean;\n dnsRecords: Array<{\n type: string;\n name: string;\n value: string;\n verified: boolean;\n }>;\n }>> {\n this.log('Verifying domain', { domain });\n\n return this.request(\n '/v1/email/domains/verify',\n 'POST',\n { domain },\n options\n );\n }\n\n async listDomains(\n options?: RequestOptions\n ): Promise<ApiResponse<Array<{\n domain: string;\n verified: boolean;\n createdAt: string;\n verifiedAt?: string;\n }>>> {\n this.log('Listing email domains');\n\n return this.request(\n '/v1/email/domains',\n 'GET',\n undefined,\n options\n );\n }\n}","import type { VlyConfig } from './types';\nimport { VlyAI } from './ai';\nimport { VlyEmail } from './email';\n\nexport * from './types';\nexport type { AIModel } from './types';\n\n// Re-export AI SDK types for convenience\nexport type { CoreMessage } from 'ai';\n\nexport class VlyIntegrations {\n public ai: VlyAI;\n public email: VlyEmail;\n\n constructor(config: VlyConfig) {\n if (!config.deploymentToken) {\n throw new Error('Deployment token is required');\n }\n\n this.ai = new VlyAI(config);\n this.email = new VlyEmail(config);\n }\n}\n\nexport function createVlyIntegrations(config: VlyConfig): VlyIntegrations {\n return new VlyIntegrations(config);\n}\n\nexport { VlyAI, VlyEmail };"]}
1
+ {"version":3,"sources":["../src/ai/index.ts","../src/client.ts","../src/email/index.ts","../src/project-thumbnail/screenshot.ts","../src/project-thumbnail/index.ts","../src/vite-plugin.ts","../src/index.ts"],"names":["createOpenAICompatible","generateText","streamText"],"mappings":"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","file":"index.js","sourcesContent":["import { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { generateText, streamText, type CoreMessage } from 'ai';\nimport type { \n AICompletionRequest, \n AICompletionResponse,\n RequestOptions,\n ApiResponse,\n VlyConfig\n} from '../types';\n\nexport class VlyAI {\n private provider: ReturnType<typeof createOpenAICompatible>;\n private config: VlyConfig;\n\n constructor(config: VlyConfig) {\n this.config = config;\n this.provider = createOpenAICompatible({\n name: 'vly-gateway',\n baseURL: 'https://integrations.vly.ai/v1/llm',\n headers: {\n 'Authorization': `Bearer ${config.deploymentToken}`,\n },\n });\n }\n\n private getModel(modelName?: string) {\n return this.provider(modelName || 'gpt-5');\n }\n\n private mapMessages(messages: AICompletionRequest['messages']): CoreMessage[] {\n return messages.map(msg => ({\n role: msg.role,\n content: msg.content,\n }));\n }\n\n async completion(\n request: AICompletionRequest, \n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await generateText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n const responseData: AICompletionResponse = {\n id: `vly-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: result.text\n },\n finishReason: result.finishReason || 'stop'\n }],\n usage: {\n promptTokens: result.usage?.inputTokens || 0,\n completionTokens: result.usage?.outputTokens || 0,\n totalTokens: result.usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Request failed'\n };\n }\n }\n\n async streamCompletion(\n request: AICompletionRequest,\n onChunk: (chunk: string) => void,\n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating streaming AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await streamText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n let fullResponse = '';\n\n for await (const delta of result.textStream) {\n fullResponse += delta;\n onChunk(delta);\n }\n\n // Wait for the stream to complete and get usage info\n const usage = await result.usage;\n\n const responseData: AICompletionResponse = {\n id: `vly-stream-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: fullResponse\n },\n finishReason: 'stop'\n }],\n usage: {\n promptTokens: usage?.inputTokens || 0,\n completionTokens: usage?.outputTokens || 0,\n totalTokens: usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] Streaming AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] Streaming AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Streaming request failed'\n };\n }\n }\n\n async embeddings(\n input: string | string[],\n _options?: RequestOptions & { model?: string }\n ): Promise<ApiResponse<{ embeddings: number[][]; usage: any }>> {\n if (this.config.debug) {\n console.log('[Vly] Creating embeddings', { inputCount: Array.isArray(input) ? input.length : 1 });\n }\n \n // Note: AI SDK doesn't have embeddings support for OpenAI-compatible providers yet\n // This would need to be implemented separately or use a different approach\n return {\n success: false,\n error: 'Embeddings not yet supported with AI SDK OpenAI-compatible provider'\n };\n }\n\n // Helper method to get the provider for direct AI SDK usage\n getProvider() {\n return this.provider;\n }\n}","import type { VlyConfig, RequestOptions, ApiResponse } from './types';\n\nexport class VlyClient {\n protected config: Required<VlyConfig>;\n\n constructor(config: VlyConfig) {\n this.config = {\n deploymentToken: config.deploymentToken || 'vlytomoonF2024',\n debug: config.debug ?? false\n };\n }\n\n protected async request<T = any>(\n endpoint: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n data?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n const url = `https://integrations.vly.ai${endpoint}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.config.deploymentToken}`,\n 'Content-Type': 'application/json',\n 'X-Vly-Version': '0.1.0'\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n body: data ? JSON.stringify(data) : undefined,\n };\n\n // Add timeout using AbortController\n const controller = new AbortController();\n const timeout = options?.timeout || 30000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n fetchOptions.signal = controller.signal;\n\n try {\n const response = await fetch(url, fetchOptions);\n clearTimeout(timeoutId);\n \n const responseData = await response.json().catch(() => ({})) as any;\n\n if (response.ok) {\n return {\n success: true,\n data: responseData as T,\n usage: responseData?.usage\n };\n } else {\n const error = responseData?.error || `Request failed with status ${response.status}`;\n \n if (this.config.debug) {\n console.error(`Vly API Error: ${error}`, {\n endpoint,\n status: response.status,\n data: responseData\n });\n }\n\n return {\n success: false,\n error\n };\n }\n } catch (error: any) {\n clearTimeout(timeoutId);\n const errorMessage = error.name === 'AbortError' ? 'Request timeout' : error.message || 'Unknown error occurred';\n \n if (this.config.debug) {\n console.error(`Vly API Request Failed: ${errorMessage}`, {\n endpoint,\n error\n });\n }\n\n if (options?.retries && options.retries > 0) {\n if (this.config.debug) {\n console.log(`Retrying request... (${options.retries} retries left)`);\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000));\n return this.request(endpoint, method, data, { \n ...options, \n retries: options.retries - 1 \n });\n }\n\n return {\n success: false,\n error: errorMessage\n };\n }\n }\n\n protected log(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[Vly] ${message}`, data || '');\n }\n }\n}","import { VlyClient } from '../client';\nimport type { \n EmailRequest, \n EmailResponse,\n RequestOptions,\n ApiResponse\n} from '../types';\n\nexport class VlyEmail extends VlyClient {\n async send(\n email: EmailRequest, \n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Sending email', { \n to: email.to, \n subject: email.subject \n });\n\n const payload = {\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@project.vly.sh',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n };\n\n const response = await this.request<EmailResponse>(\n '/v1/email/send',\n 'POST',\n payload,\n options\n );\n\n if (response.success) {\n this.log('Email sent successfully', { \n id: response.data?.id,\n status: response.data?.status \n });\n }\n\n return response;\n }\n\n async sendBatch(\n emails: EmailRequest[],\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse[]>> {\n this.log('Sending batch emails', { count: emails.length });\n\n const payload = {\n emails: emails.map(email => ({\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@vly.io',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n }))\n };\n\n return this.request<EmailResponse[]>(\n '/v1/email/batch',\n 'POST',\n payload,\n options\n );\n }\n\n async getStatus(\n emailId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Getting email status', { emailId });\n\n return this.request<EmailResponse>(\n `/v1/email/status/${emailId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async verifyDomain(\n domain: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n domain: string;\n verified: boolean;\n dnsRecords: Array<{\n type: string;\n name: string;\n value: string;\n verified: boolean;\n }>;\n }>> {\n this.log('Verifying domain', { domain });\n\n return this.request(\n '/v1/email/domains/verify',\n 'POST',\n { domain },\n options\n );\n }\n\n async listDomains(\n options?: RequestOptions\n ): Promise<ApiResponse<Array<{\n domain: string;\n verified: boolean;\n createdAt: string;\n verifiedAt?: string;\n }>>> {\n this.log('Listing email domains');\n\n return this.request(\n '/v1/email/domains',\n 'GET',\n undefined,\n options\n );\n }\n}","export interface ScreenshotMessage {\n type: 'vly-screenshot-request' | 'vly-screenshot-response' | 'vly-screenshot-error';\n requestId?: string;\n dataUrl?: string;\n error?: string;\n format?: 'png' | 'jpeg' | 'webp';\n quality?: number;\n}\n\nexport function initScreenshotListener() {\n console.log('[VLY Runtime] Screenshot listener initialized');\n\n // Load html2canvas-pro from CDN (supports modern CSS like oklch)\n if (typeof (window as any).html2canvas === 'undefined') {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js';\n script.async = true\n document.head.appendChild(script);\n }\n\n // Listen for screenshot requests from parent\n window.addEventListener('message', async (event) => {\n const message = event.data as ScreenshotMessage;\n\n if (message.type !== 'vly-screenshot-request') return;\n\n try {\n // Wait for html2canvas to load\n if (typeof (window as any).html2canvas === 'undefined') {\n throw new Error('html2canvas not loaded yet');\n }\n\n const html2canvas = (window as any).html2canvas;\n\n // Capture screenshot\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n allowTaint: false,\n backgroundColor: '#ffffff',\n logging: false,\n scale: 0.5,\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n // Convert to blob and data URL\n const format = message.format || 'jpeg';\n const quality = message.quality || 0.85;\n const mimeType = `image/${format}`;\n\n canvas.toBlob((blob: Blob | null) => {\n if (!blob) {\n throw new Error('Failed to convert canvas to blob');\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n window.parent.postMessage({\n type: 'vly-screenshot-response',\n requestId: message.requestId,\n dataUrl: reader.result as string,\n } as ScreenshotMessage, '*');\n\n console.log('[VLY Runtime] Screenshot sent to parent');\n };\n reader.onerror = () => {\n throw new Error('FileReader error');\n };\n reader.readAsDataURL(blob);\n }, mimeType, quality);\n\n } catch (error) {\n console.error('[VLY Runtime] Screenshot failed:', error);\n\n window.parent.postMessage({\n type: 'vly-screenshot-error',\n requestId: message.requestId,\n error: error instanceof Error ? error.message : 'Unknown error',\n } as ScreenshotMessage, '*');\n }\n });\n}\n","/// <reference types=\"vite/client\" />\nimport { initScreenshotListener } from './screenshot';\n\nfunction isVlyPlatform(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hostname = window.location.hostname;\n return (\n hostname.endsWith('.vly.ai') ||\n hostname.endsWith('.vly.sh') ||\n hostname.includes('localhost') || // For dev\n hostname.includes('127.0.0.1')\n );\n}\n\nexport function initVly() {\n if (!isVlyPlatform()) {\n console.log('[VLY Runtime] Not on VLY platform, skipping initialization');\n return;\n }\n\n console.log('[VLY Runtime] Initializing...');\n initScreenshotListener();\n initHmrErrorReporting();\n console.log('[VLY Runtime] Ready');\n}\n\n/**\n * Initialize HMR error reporting\n * Sends Vite HMR errors to parent window via postMessage\n */\nfunction initHmrErrorReporting() {\n if (import.meta.hot) {\n import.meta.hot.on('vite:error', (payload: any) => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-error',\n error: {\n message: payload.err?.message || String(payload.err || payload),\n stack: payload.err?.stack,\n plugin: payload.err?.plugin,\n loc: payload.err?.loc,\n },\n timestamp: Date.now(),\n },\n '*'\n );\n });\n\n import.meta.hot.on('vite:beforeFullReload', () => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-success',\n timestamp: Date.now(),\n },\n '*'\n );\n });\n }\n}\n\n// Auto-initialize on import\nif (typeof window !== 'undefined') {\n // Wait for DOM to be ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initVly);\n } else {\n initVly();\n }\n}\n\nexport { initScreenshotListener } from './screenshot';\nexport type { ScreenshotMessage } from './screenshot';\n","import type { Plugin } from 'vite';\n\n/**\n * VLY Vite Plugin\n *\n * Injects the @vly-ai/integrations runtime into the page.\n * This includes:\n * - HMR error reporting\n * - Other VLY platform integrations\n *\n * Usage in vite.config.ts:\n * ```typescript\n * import { vlyPlugin } from '@vly-ai/integrations';\n *\n * export default defineConfig({\n * plugins: [vlyPlugin()],\n * });\n * ```\n */\nexport function vlyPlugin(): Plugin {\n return {\n name: 'vly-plugin',\n transformIndexHtml() {\n return [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: `import '@vly-ai/integrations';`,\n injectTo: 'head',\n },\n ];\n },\n };\n}\n","import type { VlyConfig } from './types';\nimport { VlyAI } from './ai';\nimport { VlyEmail } from './email';\nimport './project-thumbnail';\n\nexport * from './types';\nexport type { AIModel } from './types';\n\n// Vite plugin export\nexport { vlyPlugin } from './vite-plugin';\n\n// Re-export AI SDK types for convenience\nexport type { CoreMessage } from 'ai';\n\n// Re-export project thumbnail types\nexport type { ScreenshotMessage } from './project-thumbnail';\nexport { initScreenshotListener, initVly } from './project-thumbnail';\n\nconst DEFAULT_DEPLOYMENT_TOKEN = 'vlytomoonF2024';\n\nexport class VlyIntegrations {\n public readonly ai: VlyAI;\n public readonly email: VlyEmail;\n public readonly config: Required<VlyConfig>;\n\n constructor(config: VlyConfig) {\n const normalizedToken =\n config.deploymentToken && config.deploymentToken.trim().length > 0\n ? config.deploymentToken\n : DEFAULT_DEPLOYMENT_TOKEN;\n\n this.config = {\n deploymentToken: normalizedToken,\n debug: config.debug ?? false,\n };\n\n this.ai = new VlyAI(this.config);\n this.email = new VlyEmail(this.config);\n }\n}\n\nexport function createVlyIntegrations(config: VlyConfig): VlyIntegrations {\n return new VlyIntegrations(config);\n}\n\nexport { VlyAI, VlyEmail };"]}
package/dist/index.mjs CHANGED
@@ -144,8 +144,8 @@ var VlyClient = class {
144
144
  config;
145
145
  constructor(config) {
146
146
  this.config = {
147
- deploymentToken: config.deploymentToken,
148
- debug: config.debug || false
147
+ deploymentToken: config.deploymentToken || "vlytomoonF2024",
148
+ debug: config.debug ?? false
149
149
  };
150
150
  }
151
151
  async request(endpoint, method, data, options) {
@@ -229,7 +229,7 @@ var VlyEmail = class extends VlyClient {
229
229
  });
230
230
  const payload = {
231
231
  to: Array.isArray(email.to) ? email.to : [email.to],
232
- from: email.from || "noreply@vly.io",
232
+ from: email.from || "noreply@project.vly.sh",
233
233
  subject: email.subject,
234
234
  html: email.html,
235
235
  text: email.text,
@@ -303,22 +303,154 @@ var VlyEmail = class extends VlyClient {
303
303
  }
304
304
  };
305
305
 
306
+ // src/project-thumbnail/screenshot.ts
307
+ function initScreenshotListener() {
308
+ console.log("[VLY Runtime] Screenshot listener initialized");
309
+ if (typeof window.html2canvas === "undefined") {
310
+ const script = document.createElement("script");
311
+ script.src = "https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js";
312
+ script.async = true;
313
+ document.head.appendChild(script);
314
+ }
315
+ window.addEventListener("message", async (event) => {
316
+ const message = event.data;
317
+ if (message.type !== "vly-screenshot-request") return;
318
+ try {
319
+ if (typeof window.html2canvas === "undefined") {
320
+ throw new Error("html2canvas not loaded yet");
321
+ }
322
+ const html2canvas = window.html2canvas;
323
+ const canvas = await html2canvas(document.body, {
324
+ useCORS: true,
325
+ allowTaint: false,
326
+ backgroundColor: "#ffffff",
327
+ logging: false,
328
+ scale: 0.5,
329
+ width: window.innerWidth,
330
+ height: window.innerHeight
331
+ });
332
+ const format = message.format || "jpeg";
333
+ const quality = message.quality || 0.85;
334
+ const mimeType = `image/${format}`;
335
+ canvas.toBlob((blob) => {
336
+ if (!blob) {
337
+ throw new Error("Failed to convert canvas to blob");
338
+ }
339
+ const reader = new FileReader();
340
+ reader.onload = () => {
341
+ window.parent.postMessage({
342
+ type: "vly-screenshot-response",
343
+ requestId: message.requestId,
344
+ dataUrl: reader.result
345
+ }, "*");
346
+ console.log("[VLY Runtime] Screenshot sent to parent");
347
+ };
348
+ reader.onerror = () => {
349
+ throw new Error("FileReader error");
350
+ };
351
+ reader.readAsDataURL(blob);
352
+ }, mimeType, quality);
353
+ } catch (error) {
354
+ console.error("[VLY Runtime] Screenshot failed:", error);
355
+ window.parent.postMessage({
356
+ type: "vly-screenshot-error",
357
+ requestId: message.requestId,
358
+ error: error instanceof Error ? error.message : "Unknown error"
359
+ }, "*");
360
+ }
361
+ });
362
+ }
363
+
364
+ // src/project-thumbnail/index.ts
365
+ function isVlyPlatform() {
366
+ if (typeof window === "undefined") return false;
367
+ const hostname = window.location.hostname;
368
+ return hostname.endsWith(".vly.ai") || hostname.endsWith(".vly.sh") || hostname.includes("localhost") || // For dev
369
+ hostname.includes("127.0.0.1");
370
+ }
371
+ function initVly() {
372
+ if (!isVlyPlatform()) {
373
+ console.log("[VLY Runtime] Not on VLY platform, skipping initialization");
374
+ return;
375
+ }
376
+ console.log("[VLY Runtime] Initializing...");
377
+ initScreenshotListener();
378
+ initHmrErrorReporting();
379
+ console.log("[VLY Runtime] Ready");
380
+ }
381
+ function initHmrErrorReporting() {
382
+ if (import.meta.hot) {
383
+ import.meta.hot.on("vite:error", (payload) => {
384
+ window.parent.postMessage(
385
+ {
386
+ type: "vly-vite-hmr-error",
387
+ error: {
388
+ message: payload.err?.message || String(payload.err || payload),
389
+ stack: payload.err?.stack,
390
+ plugin: payload.err?.plugin,
391
+ loc: payload.err?.loc
392
+ },
393
+ timestamp: Date.now()
394
+ },
395
+ "*"
396
+ );
397
+ });
398
+ import.meta.hot.on("vite:beforeFullReload", () => {
399
+ window.parent.postMessage(
400
+ {
401
+ type: "vly-vite-hmr-success",
402
+ timestamp: Date.now()
403
+ },
404
+ "*"
405
+ );
406
+ });
407
+ }
408
+ }
409
+ if (typeof window !== "undefined") {
410
+ if (document.readyState === "loading") {
411
+ document.addEventListener("DOMContentLoaded", initVly);
412
+ } else {
413
+ initVly();
414
+ }
415
+ }
416
+
417
+ // src/vite-plugin.ts
418
+ function vlyPlugin() {
419
+ return {
420
+ name: "vly-plugin",
421
+ transformIndexHtml() {
422
+ return [
423
+ {
424
+ tag: "script",
425
+ attrs: { type: "module" },
426
+ children: `import '@vly-ai/integrations';`,
427
+ injectTo: "head"
428
+ }
429
+ ];
430
+ }
431
+ };
432
+ }
433
+
306
434
  // src/index.ts
435
+ var DEFAULT_DEPLOYMENT_TOKEN = "vlytomoonF2024";
307
436
  var VlyIntegrations = class {
308
437
  ai;
309
438
  email;
439
+ config;
310
440
  constructor(config) {
311
- if (!config.deploymentToken) {
312
- throw new Error("Deployment token is required");
313
- }
314
- this.ai = new VlyAI(config);
315
- this.email = new VlyEmail(config);
441
+ const normalizedToken = config.deploymentToken && config.deploymentToken.trim().length > 0 ? config.deploymentToken : DEFAULT_DEPLOYMENT_TOKEN;
442
+ this.config = {
443
+ deploymentToken: normalizedToken,
444
+ debug: config.debug ?? false
445
+ };
446
+ this.ai = new VlyAI(this.config);
447
+ this.email = new VlyEmail(this.config);
316
448
  }
317
449
  };
318
450
  function createVlyIntegrations(config) {
319
451
  return new VlyIntegrations(config);
320
452
  }
321
453
 
322
- export { VlyAI, VlyEmail, VlyIntegrations, createVlyIntegrations };
454
+ export { VlyAI, VlyEmail, VlyIntegrations, createVlyIntegrations, initScreenshotListener, initVly, vlyPlugin };
323
455
  //# sourceMappingURL=index.mjs.map
324
456
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/ai/index.ts","../src/client.ts","../src/email/index.ts","../src/index.ts"],"names":[],"mappings":";;;;AAUO,IAAM,QAAN,MAAY;AAAA,EACT,QAAA;AAAA,EACA,MAAA;AAAA,EAER,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AACd,IAAA,IAAA,CAAK,WAAW,sBAAA,CAAuB;AAAA,MACrC,IAAA,EAAM,aAAA;AAAA,MACN,OAAA,EAAS,oCAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP,eAAA,EAAiB,CAAA,OAAA,EAAU,MAAA,CAAO,eAAe,CAAA;AAAA;AACnD,KACD,CAAA;AAAA,EACH;AAAA,EAEQ,SAAS,SAAA,EAAoB;AACnC,IAAA,OAAO,IAAA,CAAK,QAAA,CAAS,SAAA,IAAa,OAAO,CAAA;AAAA,EAC3C;AAAA,EAEQ,YAAY,QAAA,EAA0D;AAC5E,IAAA,OAAO,QAAA,CAAS,IAAI,CAAA,GAAA,MAAQ;AAAA,MAC1B,MAAM,GAAA,CAAI,IAAA;AAAA,MACV,SAAS,GAAA,CAAI;AAAA,KACf,CAAE,CAAA;AAAA,EACJ;AAAA,EAEA,MAAM,UAAA,CACJ,OAAA,EACA,QAAA,EAC4C;AAC5C,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,IAAI,8BAAA,EAAgC,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,IACtE;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,QAAQ,CAAA;AAElD,MAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa;AAAA,QAChC,KAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,iBAAiB,OAAA,CAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,MAAM,YAAA,GAAqC;AAAA,QACzC,EAAA,EAAI,CAAA,IAAA,EAAO,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QACrB,SAAS,CAAC;AAAA,UACR,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,WAAA;AAAA,YACN,SAAS,MAAA,CAAO;AAAA,WAClB;AAAA,UACA,YAAA,EAAc,OAAO,YAAA,IAAgB;AAAA,SACtC,CAAA;AAAA,QACD,KAAA,EAAO;AAAA,UACL,YAAA,EAAc,MAAA,CAAO,KAAA,EAAO,WAAA,IAAe,CAAA;AAAA,UAC3C,gBAAA,EAAkB,MAAA,CAAO,KAAA,EAAO,YAAA,IAAgB,CAAA;AAAA,UAChD,WAAA,EAAa,MAAA,CAAO,KAAA,EAAO,WAAA,IAAe;AAAA;AAC5C,OACF;AAEA,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,IAAI,gCAAA,EAAkC;AAAA,UAC5C,UAAA,EAAY,aAAa,KAAA,CAAM;AAAA,SAChC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,MAAM,4BAAA,EAA8B,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,MACtE;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,gBAAA,CACJ,OAAA,EACA,OAAA,EACA,QAAA,EAC4C;AAC5C,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,IAAI,wCAAA,EAA0C,EAAE,KAAA,EAAO,OAAA,CAAQ,OAAO,CAAA;AAAA,IAChF;AAEA,IAAA,IAAI;AACF,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,QAAA,CAAS,OAAA,CAAQ,KAAK,CAAA;AACzC,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,OAAA,CAAQ,QAAQ,CAAA;AAElD,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW;AAAA,QAC9B,KAAA;AAAA,QACA,QAAA;AAAA,QACA,aAAa,OAAA,CAAQ,WAAA;AAAA,QACrB,iBAAiB,OAAA,CAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,IAAI,YAAA,GAAe,EAAA;AAEnB,MAAA,WAAA,MAAiB,KAAA,IAAS,OAAO,UAAA,EAAY;AAC3C,QAAA,YAAA,IAAgB,KAAA;AAChB,QAAA,OAAA,CAAQ,KAAK,CAAA;AAAA,MACf;AAGA,MAAA,MAAM,KAAA,GAAQ,MAAM,MAAA,CAAO,KAAA;AAE3B,MAAA,MAAM,YAAA,GAAqC;AAAA,QACzC,EAAA,EAAI,CAAA,WAAA,EAAc,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,QAC5B,SAAS,CAAC;AAAA,UACR,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,WAAA;AAAA,YACN,OAAA,EAAS;AAAA,WACX;AAAA,UACA,YAAA,EAAc;AAAA,SACf,CAAA;AAAA,QACD,KAAA,EAAO;AAAA,UACL,YAAA,EAAc,OAAO,WAAA,IAAe,CAAA;AAAA,UACpC,gBAAA,EAAkB,OAAO,YAAA,IAAgB,CAAA;AAAA,UACzC,WAAA,EAAa,OAAO,WAAA,IAAe;AAAA;AACrC,OACF;AAEA,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,IAAI,0CAAA,EAA4C;AAAA,UACtD,UAAA,EAAY,aAAa,KAAA,CAAM;AAAA,SAChC,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,IAAA;AAAA,QACT,IAAA,EAAM;AAAA,OACR;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,MAAM,sCAAA,EAAwC,EAAE,KAAA,EAAO,KAAA,CAAM,SAAS,CAAA;AAAA,MAChF;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,MAAM,OAAA,IAAW;AAAA,OAC1B;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAM,UAAA,CACJ,KAAA,EACA,QAAA,EAC8D;AAC9D,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,2BAAA,EAA6B,EAAE,UAAA,EAAY,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,CAAA;AAAA,IAClG;AAIA,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO;AAAA,KACT;AAAA,EACF;AAAA;AAAA,EAGA,WAAA,GAAc;AACZ,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AACF;;;ACnLO,IAAM,YAAN,MAAgB;AAAA,EACX,MAAA;AAAA,EAEV,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,iBAAiB,MAAA,CAAO,eAAA;AAAA,MACxB,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,KACzB;AAAA,EACF;AAAA,EAEA,MAAgB,OAAA,CACd,QAAA,EACA,MAAA,EACA,MACA,OAAA,EACyB;AACzB,IAAA,MAAM,GAAA,GAAM,8BAA8B,QAAQ,CAAA,CAAA;AAClD,IAAA,MAAM,OAAA,GAAkC;AAAA,MACtC,eAAA,EAAiB,CAAA,OAAA,EAAU,IAAA,CAAK,MAAA,CAAO,eAAe,CAAA,CAAA;AAAA,MACtD,cAAA,EAAgB,kBAAA;AAAA,MAChB,eAAA,EAAiB;AAAA,KACnB;AAEA,IAAA,MAAM,YAAA,GAA4B;AAAA,MAChC,MAAA;AAAA,MACA,OAAA;AAAA,MACA,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,KACtC;AAGA,IAAA,MAAM,UAAA,GAAa,IAAI,eAAA,EAAgB;AACvC,IAAA,MAAM,OAAA,GAAU,SAAS,OAAA,IAAW,GAAA;AACpC,IAAA,MAAM,YAAY,UAAA,CAAW,MAAM,UAAA,CAAW,KAAA,IAAS,OAAO,CAAA;AAC9D,IAAA,YAAA,CAAa,SAAS,UAAA,CAAW,MAAA;AAEjC,IAAA,IAAI;AACF,MAAA,MAAM,QAAA,GAAW,MAAM,KAAA,CAAM,GAAA,EAAK,YAAY,CAAA;AAC9C,MAAA,YAAA,CAAa,SAAS,CAAA;AAEtB,MAAA,MAAM,YAAA,GAAe,MAAM,QAAA,CAAS,IAAA,GAAO,KAAA,CAAM,OAAO,EAAC,CAAE,CAAA;AAE3D,MAAA,IAAI,SAAS,EAAA,EAAI;AACf,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,IAAA;AAAA,UACT,IAAA,EAAM,YAAA;AAAA,UACN,OAAO,YAAA,EAAc;AAAA,SACvB;AAAA,MACF,CAAA,MAAO;AACL,QAAA,MAAM,KAAA,GAAQ,YAAA,EAAc,KAAA,IAAS,CAAA,2BAAA,EAA8B,SAAS,MAAM,CAAA,CAAA;AAElF,QAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,KAAK,CAAA,CAAA,EAAI;AAAA,YACvC,QAAA;AAAA,YACA,QAAQ,QAAA,CAAS,MAAA;AAAA,YACjB,IAAA,EAAM;AAAA,WACP,CAAA;AAAA,QACH;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,KAAA;AAAA,UACT;AAAA,SACF;AAAA,MACF;AAAA,IACF,SAAS,KAAA,EAAY;AACnB,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,MAAM,eAAe,KAAA,CAAM,IAAA,KAAS,YAAA,GAAe,iBAAA,GAAoB,MAAM,OAAA,IAAW,wBAAA;AAExF,MAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,QAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,wBAAA,EAA2B,YAAY,CAAA,CAAA,EAAI;AAAA,UACvD,QAAA;AAAA,UACA;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,OAAA,EAAS,OAAA,IAAW,OAAA,CAAQ,OAAA,GAAU,CAAA,EAAG;AAC3C,QAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,qBAAA,EAAwB,OAAA,CAAQ,OAAO,CAAA,cAAA,CAAgB,CAAA;AAAA,QACrE;AAEA,QAAA,MAAM,IAAI,OAAA,CAAQ,CAAA,OAAA,KAAW,UAAA,CAAW,OAAA,EAAS,GAAI,CAAC,CAAA;AACtD,QAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,QAAA,EAAU,MAAA,EAAQ,IAAA,EAAM;AAAA,UAC1C,GAAG,OAAA;AAAA,UACH,OAAA,EAAS,QAAQ,OAAA,GAAU;AAAA,SAC5B,CAAA;AAAA,MACH;AAEA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO;AAAA,OACT;AAAA,IACF;AAAA,EACF;AAAA,EAEU,GAAA,CAAI,SAAiB,IAAA,EAAY;AACzC,IAAA,IAAI,IAAA,CAAK,OAAO,KAAA,EAAO;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,MAAA,EAAS,OAAO,CAAA,CAAA,EAAI,QAAQ,EAAE,CAAA;AAAA,IAC5C;AAAA,EACF;AACF,CAAA;;;AC5FO,IAAM,QAAA,GAAN,cAAuB,SAAA,CAAU;AAAA,EACtC,MAAM,IAAA,CACJ,KAAA,EACA,OAAA,EACqC;AACrC,IAAA,IAAA,CAAK,IAAI,eAAA,EAAiB;AAAA,MACxB,IAAI,KAAA,CAAM,EAAA;AAAA,MACV,SAAS,KAAA,CAAM;AAAA,KAChB,CAAA;AAED,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,EAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,IAAI,KAAA,CAAM,EAAA,GAAK,CAAC,KAAA,CAAM,EAAE,CAAA;AAAA,MAClD,IAAA,EAAM,MAAM,IAAA,IAAQ,gBAAA;AAAA,MACpB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,MAAM,KAAA,CAAM,IAAA;AAAA,MACZ,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,SAAS,KAAA,CAAM,OAAA;AAAA,MACf,EAAA,EAAI,KAAA,CAAM,EAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA,CAAM,EAAA,GAAK,CAAC,KAAA,CAAM,EAAE,CAAA,GAAK,MAAA;AAAA,MACnE,GAAA,EAAK,KAAA,CAAM,GAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,GAAA,GAAM,CAAC,KAAA,CAAM,GAAG,CAAA,GAAK;AAAA,KAC1E;AAEA,IAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,OAAA;AAAA,MAC1B,gBAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAEA,IAAA,IAAI,SAAS,OAAA,EAAS;AACpB,MAAA,IAAA,CAAK,IAAI,yBAAA,EAA2B;AAAA,QAClC,EAAA,EAAI,SAAS,IAAA,EAAM,EAAA;AAAA,QACnB,MAAA,EAAQ,SAAS,IAAA,EAAM;AAAA,OACxB,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,QAAA;AAAA,EACT;AAAA,EAEA,MAAM,SAAA,CACJ,MAAA,EACA,OAAA,EACuC;AACvC,IAAA,IAAA,CAAK,IAAI,sBAAA,EAAwB,EAAE,KAAA,EAAO,MAAA,CAAO,QAAQ,CAAA;AAEzD,IAAA,MAAM,OAAA,GAAU;AAAA,MACd,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,QAC3B,EAAA,EAAI,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,IAAI,KAAA,CAAM,EAAA,GAAK,CAAC,KAAA,CAAM,EAAE,CAAA;AAAA,QAClD,IAAA,EAAM,MAAM,IAAA,IAAQ,gBAAA;AAAA,QACpB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,MAAM,KAAA,CAAM,IAAA;AAAA,QACZ,aAAa,KAAA,CAAM,WAAA;AAAA,QACnB,SAAS,KAAA,CAAM,OAAA;AAAA,QACf,EAAA,EAAI,KAAA,CAAM,EAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,EAAE,CAAA,GAAI,KAAA,CAAM,EAAA,GAAK,CAAC,KAAA,CAAM,EAAE,CAAA,GAAK,MAAA;AAAA,QACnE,GAAA,EAAK,KAAA,CAAM,GAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,GAAI,KAAA,CAAM,GAAA,GAAM,CAAC,KAAA,CAAM,GAAG,CAAA,GAAK;AAAA,OAC1E,CAAE;AAAA,KACJ;AAEA,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,iBAAA;AAAA,MACA,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,SAAA,CACJ,OAAA,EACA,OAAA,EACqC;AACrC,IAAA,IAAA,CAAK,GAAA,CAAI,sBAAA,EAAwB,EAAE,OAAA,EAAS,CAAA;AAE5C,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,oBAAoB,OAAO,CAAA,CAAA;AAAA,MAC3B,KAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,YAAA,CACJ,MAAA,EACA,OAAA,EAUE;AACF,IAAA,IAAA,CAAK,GAAA,CAAI,kBAAA,EAAoB,EAAE,MAAA,EAAQ,CAAA;AAEvC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,0BAAA;AAAA,MACA,MAAA;AAAA,MACA,EAAE,MAAA,EAAO;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAAA,EAEA,MAAM,YACJ,OAAA,EAMG;AACH,IAAA,IAAA,CAAK,IAAI,uBAAuB,CAAA;AAEhC,IAAA,OAAO,IAAA,CAAK,OAAA;AAAA,MACV,mBAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;;;ACvHO,IAAM,kBAAN,MAAsB;AAAA,EACpB,EAAA;AAAA,EACA,KAAA;AAAA,EAEP,YAAY,MAAA,EAAmB;AAC7B,IAAA,IAAI,CAAC,OAAO,eAAA,EAAiB;AAC3B,MAAA,MAAM,IAAI,MAAM,8BAA8B,CAAA;AAAA,IAChD;AAEA,IAAA,IAAA,CAAK,EAAA,GAAK,IAAI,KAAA,CAAM,MAAM,CAAA;AAC1B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAI,QAAA,CAAS,MAAM,CAAA;AAAA,EAClC;AACF;AAEO,SAAS,sBAAsB,MAAA,EAAoC;AACxE,EAAA,OAAO,IAAI,gBAAgB,MAAM,CAAA;AACnC","file":"index.mjs","sourcesContent":["import { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { generateText, streamText, type CoreMessage } from 'ai';\nimport type { \n AICompletionRequest, \n AICompletionResponse,\n RequestOptions,\n ApiResponse,\n VlyConfig\n} from '../types';\n\nexport class VlyAI {\n private provider: ReturnType<typeof createOpenAICompatible>;\n private config: VlyConfig;\n\n constructor(config: VlyConfig) {\n this.config = config;\n this.provider = createOpenAICompatible({\n name: 'vly-gateway',\n baseURL: 'https://integrations.vly.ai/v1/llm',\n headers: {\n 'Authorization': `Bearer ${config.deploymentToken}`,\n },\n });\n }\n\n private getModel(modelName?: string) {\n return this.provider(modelName || 'gpt-5');\n }\n\n private mapMessages(messages: AICompletionRequest['messages']): CoreMessage[] {\n return messages.map(msg => ({\n role: msg.role,\n content: msg.content,\n }));\n }\n\n async completion(\n request: AICompletionRequest, \n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await generateText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n const responseData: AICompletionResponse = {\n id: `vly-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: result.text\n },\n finishReason: result.finishReason || 'stop'\n }],\n usage: {\n promptTokens: result.usage?.inputTokens || 0,\n completionTokens: result.usage?.outputTokens || 0,\n totalTokens: result.usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Request failed'\n };\n }\n }\n\n async streamCompletion(\n request: AICompletionRequest,\n onChunk: (chunk: string) => void,\n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating streaming AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await streamText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n let fullResponse = '';\n\n for await (const delta of result.textStream) {\n fullResponse += delta;\n onChunk(delta);\n }\n\n // Wait for the stream to complete and get usage info\n const usage = await result.usage;\n\n const responseData: AICompletionResponse = {\n id: `vly-stream-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: fullResponse\n },\n finishReason: 'stop'\n }],\n usage: {\n promptTokens: usage?.inputTokens || 0,\n completionTokens: usage?.outputTokens || 0,\n totalTokens: usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] Streaming AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] Streaming AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Streaming request failed'\n };\n }\n }\n\n async embeddings(\n input: string | string[],\n _options?: RequestOptions & { model?: string }\n ): Promise<ApiResponse<{ embeddings: number[][]; usage: any }>> {\n if (this.config.debug) {\n console.log('[Vly] Creating embeddings', { inputCount: Array.isArray(input) ? input.length : 1 });\n }\n \n // Note: AI SDK doesn't have embeddings support for OpenAI-compatible providers yet\n // This would need to be implemented separately or use a different approach\n return {\n success: false,\n error: 'Embeddings not yet supported with AI SDK OpenAI-compatible provider'\n };\n }\n\n // Helper method to get the provider for direct AI SDK usage\n getProvider() {\n return this.provider;\n }\n}","import type { VlyConfig, RequestOptions, ApiResponse } from './types';\n\nexport class VlyClient {\n protected config: Required<VlyConfig>;\n\n constructor(config: VlyConfig) {\n this.config = {\n deploymentToken: config.deploymentToken,\n debug: config.debug || false\n };\n }\n\n protected async request<T = any>(\n endpoint: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n data?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n const url = `https://integrations.vly.ai${endpoint}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.config.deploymentToken}`,\n 'Content-Type': 'application/json',\n 'X-Vly-Version': '0.1.0'\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n body: data ? JSON.stringify(data) : undefined,\n };\n\n // Add timeout using AbortController\n const controller = new AbortController();\n const timeout = options?.timeout || 30000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n fetchOptions.signal = controller.signal;\n\n try {\n const response = await fetch(url, fetchOptions);\n clearTimeout(timeoutId);\n \n const responseData = await response.json().catch(() => ({})) as any;\n\n if (response.ok) {\n return {\n success: true,\n data: responseData as T,\n usage: responseData?.usage\n };\n } else {\n const error = responseData?.error || `Request failed with status ${response.status}`;\n \n if (this.config.debug) {\n console.error(`Vly API Error: ${error}`, {\n endpoint,\n status: response.status,\n data: responseData\n });\n }\n\n return {\n success: false,\n error\n };\n }\n } catch (error: any) {\n clearTimeout(timeoutId);\n const errorMessage = error.name === 'AbortError' ? 'Request timeout' : error.message || 'Unknown error occurred';\n \n if (this.config.debug) {\n console.error(`Vly API Request Failed: ${errorMessage}`, {\n endpoint,\n error\n });\n }\n\n if (options?.retries && options.retries > 0) {\n if (this.config.debug) {\n console.log(`Retrying request... (${options.retries} retries left)`);\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000));\n return this.request(endpoint, method, data, { \n ...options, \n retries: options.retries - 1 \n });\n }\n\n return {\n success: false,\n error: errorMessage\n };\n }\n }\n\n protected log(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[Vly] ${message}`, data || '');\n }\n }\n}","import { VlyClient } from '../client';\nimport type { \n EmailRequest, \n EmailResponse,\n RequestOptions,\n ApiResponse\n} from '../types';\n\nexport class VlyEmail extends VlyClient {\n async send(\n email: EmailRequest, \n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Sending email', { \n to: email.to, \n subject: email.subject \n });\n\n const payload = {\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@vly.io',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n };\n\n const response = await this.request<EmailResponse>(\n '/v1/email/send',\n 'POST',\n payload,\n options\n );\n\n if (response.success) {\n this.log('Email sent successfully', { \n id: response.data?.id,\n status: response.data?.status \n });\n }\n\n return response;\n }\n\n async sendBatch(\n emails: EmailRequest[],\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse[]>> {\n this.log('Sending batch emails', { count: emails.length });\n\n const payload = {\n emails: emails.map(email => ({\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@vly.io',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n }))\n };\n\n return this.request<EmailResponse[]>(\n '/v1/email/batch',\n 'POST',\n payload,\n options\n );\n }\n\n async getStatus(\n emailId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Getting email status', { emailId });\n\n return this.request<EmailResponse>(\n `/v1/email/status/${emailId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async verifyDomain(\n domain: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n domain: string;\n verified: boolean;\n dnsRecords: Array<{\n type: string;\n name: string;\n value: string;\n verified: boolean;\n }>;\n }>> {\n this.log('Verifying domain', { domain });\n\n return this.request(\n '/v1/email/domains/verify',\n 'POST',\n { domain },\n options\n );\n }\n\n async listDomains(\n options?: RequestOptions\n ): Promise<ApiResponse<Array<{\n domain: string;\n verified: boolean;\n createdAt: string;\n verifiedAt?: string;\n }>>> {\n this.log('Listing email domains');\n\n return this.request(\n '/v1/email/domains',\n 'GET',\n undefined,\n options\n );\n }\n}","import type { VlyConfig } from './types';\nimport { VlyAI } from './ai';\nimport { VlyEmail } from './email';\n\nexport * from './types';\nexport type { AIModel } from './types';\n\n// Re-export AI SDK types for convenience\nexport type { CoreMessage } from 'ai';\n\nexport class VlyIntegrations {\n public ai: VlyAI;\n public email: VlyEmail;\n\n constructor(config: VlyConfig) {\n if (!config.deploymentToken) {\n throw new Error('Deployment token is required');\n }\n\n this.ai = new VlyAI(config);\n this.email = new VlyEmail(config);\n }\n}\n\nexport function createVlyIntegrations(config: VlyConfig): VlyIntegrations {\n return new VlyIntegrations(config);\n}\n\nexport { VlyAI, VlyEmail };"]}
1
+ {"version":3,"sources":["../src/ai/index.ts","../src/client.ts","../src/email/index.ts","../src/project-thumbnail/screenshot.ts","../src/project-thumbnail/index.ts","../src/vite-plugin.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["import { createOpenAICompatible } from '@ai-sdk/openai-compatible';\nimport { generateText, streamText, type CoreMessage } from 'ai';\nimport type { \n AICompletionRequest, \n AICompletionResponse,\n RequestOptions,\n ApiResponse,\n VlyConfig\n} from '../types';\n\nexport class VlyAI {\n private provider: ReturnType<typeof createOpenAICompatible>;\n private config: VlyConfig;\n\n constructor(config: VlyConfig) {\n this.config = config;\n this.provider = createOpenAICompatible({\n name: 'vly-gateway',\n baseURL: 'https://integrations.vly.ai/v1/llm',\n headers: {\n 'Authorization': `Bearer ${config.deploymentToken}`,\n },\n });\n }\n\n private getModel(modelName?: string) {\n return this.provider(modelName || 'gpt-5');\n }\n\n private mapMessages(messages: AICompletionRequest['messages']): CoreMessage[] {\n return messages.map(msg => ({\n role: msg.role,\n content: msg.content,\n }));\n }\n\n async completion(\n request: AICompletionRequest, \n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await generateText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n const responseData: AICompletionResponse = {\n id: `vly-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: result.text\n },\n finishReason: result.finishReason || 'stop'\n }],\n usage: {\n promptTokens: result.usage?.inputTokens || 0,\n completionTokens: result.usage?.outputTokens || 0,\n totalTokens: result.usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Request failed'\n };\n }\n }\n\n async streamCompletion(\n request: AICompletionRequest,\n onChunk: (chunk: string) => void,\n _options?: RequestOptions\n ): Promise<ApiResponse<AICompletionResponse>> {\n if (this.config.debug) {\n console.log('[Vly] Creating streaming AI completion', { model: request.model });\n }\n\n try {\n const model = this.getModel(request.model);\n const messages = this.mapMessages(request.messages);\n\n const result = await streamText({\n model: model as any,\n messages,\n temperature: request.temperature,\n maxOutputTokens: request.maxTokens,\n });\n\n let fullResponse = '';\n\n for await (const delta of result.textStream) {\n fullResponse += delta;\n onChunk(delta);\n }\n\n // Wait for the stream to complete and get usage info\n const usage = await result.usage;\n\n const responseData: AICompletionResponse = {\n id: `vly-stream-${Date.now()}`,\n choices: [{\n message: {\n role: 'assistant',\n content: fullResponse\n },\n finishReason: 'stop'\n }],\n usage: {\n promptTokens: usage?.inputTokens || 0,\n completionTokens: usage?.outputTokens || 0,\n totalTokens: usage?.totalTokens || 0\n }\n };\n\n if (this.config.debug) {\n console.log('[Vly] Streaming AI completion successful', { \n tokensUsed: responseData.usage.totalTokens \n });\n }\n\n return {\n success: true,\n data: responseData\n };\n } catch (error: any) {\n if (this.config.debug) {\n console.error('[Vly] Streaming AI completion failed', { error: error.message });\n }\n \n return {\n success: false,\n error: error.message || 'Streaming request failed'\n };\n }\n }\n\n async embeddings(\n input: string | string[],\n _options?: RequestOptions & { model?: string }\n ): Promise<ApiResponse<{ embeddings: number[][]; usage: any }>> {\n if (this.config.debug) {\n console.log('[Vly] Creating embeddings', { inputCount: Array.isArray(input) ? input.length : 1 });\n }\n \n // Note: AI SDK doesn't have embeddings support for OpenAI-compatible providers yet\n // This would need to be implemented separately or use a different approach\n return {\n success: false,\n error: 'Embeddings not yet supported with AI SDK OpenAI-compatible provider'\n };\n }\n\n // Helper method to get the provider for direct AI SDK usage\n getProvider() {\n return this.provider;\n }\n}","import type { VlyConfig, RequestOptions, ApiResponse } from './types';\n\nexport class VlyClient {\n protected config: Required<VlyConfig>;\n\n constructor(config: VlyConfig) {\n this.config = {\n deploymentToken: config.deploymentToken || 'vlytomoonF2024',\n debug: config.debug ?? false\n };\n }\n\n protected async request<T = any>(\n endpoint: string,\n method: 'GET' | 'POST' | 'PUT' | 'DELETE',\n data?: any,\n options?: RequestOptions\n ): Promise<ApiResponse<T>> {\n const url = `https://integrations.vly.ai${endpoint}`;\n const headers: Record<string, string> = {\n 'Authorization': `Bearer ${this.config.deploymentToken}`,\n 'Content-Type': 'application/json',\n 'X-Vly-Version': '0.1.0'\n };\n\n const fetchOptions: RequestInit = {\n method,\n headers,\n body: data ? JSON.stringify(data) : undefined,\n };\n\n // Add timeout using AbortController\n const controller = new AbortController();\n const timeout = options?.timeout || 30000;\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n fetchOptions.signal = controller.signal;\n\n try {\n const response = await fetch(url, fetchOptions);\n clearTimeout(timeoutId);\n \n const responseData = await response.json().catch(() => ({})) as any;\n\n if (response.ok) {\n return {\n success: true,\n data: responseData as T,\n usage: responseData?.usage\n };\n } else {\n const error = responseData?.error || `Request failed with status ${response.status}`;\n \n if (this.config.debug) {\n console.error(`Vly API Error: ${error}`, {\n endpoint,\n status: response.status,\n data: responseData\n });\n }\n\n return {\n success: false,\n error\n };\n }\n } catch (error: any) {\n clearTimeout(timeoutId);\n const errorMessage = error.name === 'AbortError' ? 'Request timeout' : error.message || 'Unknown error occurred';\n \n if (this.config.debug) {\n console.error(`Vly API Request Failed: ${errorMessage}`, {\n endpoint,\n error\n });\n }\n\n if (options?.retries && options.retries > 0) {\n if (this.config.debug) {\n console.log(`Retrying request... (${options.retries} retries left)`);\n }\n \n await new Promise(resolve => setTimeout(resolve, 1000));\n return this.request(endpoint, method, data, { \n ...options, \n retries: options.retries - 1 \n });\n }\n\n return {\n success: false,\n error: errorMessage\n };\n }\n }\n\n protected log(message: string, data?: any) {\n if (this.config.debug) {\n console.log(`[Vly] ${message}`, data || '');\n }\n }\n}","import { VlyClient } from '../client';\nimport type { \n EmailRequest, \n EmailResponse,\n RequestOptions,\n ApiResponse\n} from '../types';\n\nexport class VlyEmail extends VlyClient {\n async send(\n email: EmailRequest, \n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Sending email', { \n to: email.to, \n subject: email.subject \n });\n\n const payload = {\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@project.vly.sh',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n };\n\n const response = await this.request<EmailResponse>(\n '/v1/email/send',\n 'POST',\n payload,\n options\n );\n\n if (response.success) {\n this.log('Email sent successfully', { \n id: response.data?.id,\n status: response.data?.status \n });\n }\n\n return response;\n }\n\n async sendBatch(\n emails: EmailRequest[],\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse[]>> {\n this.log('Sending batch emails', { count: emails.length });\n\n const payload = {\n emails: emails.map(email => ({\n to: Array.isArray(email.to) ? email.to : [email.to],\n from: email.from || 'noreply@vly.io',\n subject: email.subject,\n html: email.html,\n text: email.text,\n attachments: email.attachments,\n replyTo: email.replyTo,\n cc: email.cc ? (Array.isArray(email.cc) ? email.cc : [email.cc]) : undefined,\n bcc: email.bcc ? (Array.isArray(email.bcc) ? email.bcc : [email.bcc]) : undefined\n }))\n };\n\n return this.request<EmailResponse[]>(\n '/v1/email/batch',\n 'POST',\n payload,\n options\n );\n }\n\n async getStatus(\n emailId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<EmailResponse>> {\n this.log('Getting email status', { emailId });\n\n return this.request<EmailResponse>(\n `/v1/email/status/${emailId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async verifyDomain(\n domain: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n domain: string;\n verified: boolean;\n dnsRecords: Array<{\n type: string;\n name: string;\n value: string;\n verified: boolean;\n }>;\n }>> {\n this.log('Verifying domain', { domain });\n\n return this.request(\n '/v1/email/domains/verify',\n 'POST',\n { domain },\n options\n );\n }\n\n async listDomains(\n options?: RequestOptions\n ): Promise<ApiResponse<Array<{\n domain: string;\n verified: boolean;\n createdAt: string;\n verifiedAt?: string;\n }>>> {\n this.log('Listing email domains');\n\n return this.request(\n '/v1/email/domains',\n 'GET',\n undefined,\n options\n );\n }\n}","export interface ScreenshotMessage {\n type: 'vly-screenshot-request' | 'vly-screenshot-response' | 'vly-screenshot-error';\n requestId?: string;\n dataUrl?: string;\n error?: string;\n format?: 'png' | 'jpeg' | 'webp';\n quality?: number;\n}\n\nexport function initScreenshotListener() {\n console.log('[VLY Runtime] Screenshot listener initialized');\n\n // Load html2canvas-pro from CDN (supports modern CSS like oklch)\n if (typeof (window as any).html2canvas === 'undefined') {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js';\n script.async = true\n document.head.appendChild(script);\n }\n\n // Listen for screenshot requests from parent\n window.addEventListener('message', async (event) => {\n const message = event.data as ScreenshotMessage;\n\n if (message.type !== 'vly-screenshot-request') return;\n\n try {\n // Wait for html2canvas to load\n if (typeof (window as any).html2canvas === 'undefined') {\n throw new Error('html2canvas not loaded yet');\n }\n\n const html2canvas = (window as any).html2canvas;\n\n // Capture screenshot\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n allowTaint: false,\n backgroundColor: '#ffffff',\n logging: false,\n scale: 0.5,\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n // Convert to blob and data URL\n const format = message.format || 'jpeg';\n const quality = message.quality || 0.85;\n const mimeType = `image/${format}`;\n\n canvas.toBlob((blob: Blob | null) => {\n if (!blob) {\n throw new Error('Failed to convert canvas to blob');\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n window.parent.postMessage({\n type: 'vly-screenshot-response',\n requestId: message.requestId,\n dataUrl: reader.result as string,\n } as ScreenshotMessage, '*');\n\n console.log('[VLY Runtime] Screenshot sent to parent');\n };\n reader.onerror = () => {\n throw new Error('FileReader error');\n };\n reader.readAsDataURL(blob);\n }, mimeType, quality);\n\n } catch (error) {\n console.error('[VLY Runtime] Screenshot failed:', error);\n\n window.parent.postMessage({\n type: 'vly-screenshot-error',\n requestId: message.requestId,\n error: error instanceof Error ? error.message : 'Unknown error',\n } as ScreenshotMessage, '*');\n }\n });\n}\n","/// <reference types=\"vite/client\" />\nimport { initScreenshotListener } from './screenshot';\n\nfunction isVlyPlatform(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hostname = window.location.hostname;\n return (\n hostname.endsWith('.vly.ai') ||\n hostname.endsWith('.vly.sh') ||\n hostname.includes('localhost') || // For dev\n hostname.includes('127.0.0.1')\n );\n}\n\nexport function initVly() {\n if (!isVlyPlatform()) {\n console.log('[VLY Runtime] Not on VLY platform, skipping initialization');\n return;\n }\n\n console.log('[VLY Runtime] Initializing...');\n initScreenshotListener();\n initHmrErrorReporting();\n console.log('[VLY Runtime] Ready');\n}\n\n/**\n * Initialize HMR error reporting\n * Sends Vite HMR errors to parent window via postMessage\n */\nfunction initHmrErrorReporting() {\n if (import.meta.hot) {\n import.meta.hot.on('vite:error', (payload: any) => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-error',\n error: {\n message: payload.err?.message || String(payload.err || payload),\n stack: payload.err?.stack,\n plugin: payload.err?.plugin,\n loc: payload.err?.loc,\n },\n timestamp: Date.now(),\n },\n '*'\n );\n });\n\n import.meta.hot.on('vite:beforeFullReload', () => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-success',\n timestamp: Date.now(),\n },\n '*'\n );\n });\n }\n}\n\n// Auto-initialize on import\nif (typeof window !== 'undefined') {\n // Wait for DOM to be ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initVly);\n } else {\n initVly();\n }\n}\n\nexport { initScreenshotListener } from './screenshot';\nexport type { ScreenshotMessage } from './screenshot';\n","import type { Plugin } from 'vite';\n\n/**\n * VLY Vite Plugin\n *\n * Injects the @vly-ai/integrations runtime into the page.\n * This includes:\n * - HMR error reporting\n * - Other VLY platform integrations\n *\n * Usage in vite.config.ts:\n * ```typescript\n * import { vlyPlugin } from '@vly-ai/integrations';\n *\n * export default defineConfig({\n * plugins: [vlyPlugin()],\n * });\n * ```\n */\nexport function vlyPlugin(): Plugin {\n return {\n name: 'vly-plugin',\n transformIndexHtml() {\n return [\n {\n tag: 'script',\n attrs: { type: 'module' },\n children: `import '@vly-ai/integrations';`,\n injectTo: 'head',\n },\n ];\n },\n };\n}\n","import type { VlyConfig } from './types';\nimport { VlyAI } from './ai';\nimport { VlyEmail } from './email';\nimport './project-thumbnail';\n\nexport * from './types';\nexport type { AIModel } from './types';\n\n// Vite plugin export\nexport { vlyPlugin } from './vite-plugin';\n\n// Re-export AI SDK types for convenience\nexport type { CoreMessage } from 'ai';\n\n// Re-export project thumbnail types\nexport type { ScreenshotMessage } from './project-thumbnail';\nexport { initScreenshotListener, initVly } from './project-thumbnail';\n\nconst DEFAULT_DEPLOYMENT_TOKEN = 'vlytomoonF2024';\n\nexport class VlyIntegrations {\n public readonly ai: VlyAI;\n public readonly email: VlyEmail;\n public readonly config: Required<VlyConfig>;\n\n constructor(config: VlyConfig) {\n const normalizedToken =\n config.deploymentToken && config.deploymentToken.trim().length > 0\n ? config.deploymentToken\n : DEFAULT_DEPLOYMENT_TOKEN;\n\n this.config = {\n deploymentToken: normalizedToken,\n debug: config.debug ?? false,\n };\n\n this.ai = new VlyAI(this.config);\n this.email = new VlyEmail(this.config);\n }\n}\n\nexport function createVlyIntegrations(config: VlyConfig): VlyIntegrations {\n return new VlyIntegrations(config);\n}\n\nexport { VlyAI, VlyEmail };"]}
@@ -0,0 +1,13 @@
1
+ interface ScreenshotMessage {
2
+ type: 'vly-screenshot-request' | 'vly-screenshot-response' | 'vly-screenshot-error';
3
+ requestId?: string;
4
+ dataUrl?: string;
5
+ error?: string;
6
+ format?: 'png' | 'jpeg' | 'webp';
7
+ quality?: number;
8
+ }
9
+ declare function initScreenshotListener(): void;
10
+
11
+ declare function initVly(): void;
12
+
13
+ export { type ScreenshotMessage, initScreenshotListener, initVly };
@@ -0,0 +1,13 @@
1
+ interface ScreenshotMessage {
2
+ type: 'vly-screenshot-request' | 'vly-screenshot-response' | 'vly-screenshot-error';
3
+ requestId?: string;
4
+ dataUrl?: string;
5
+ error?: string;
6
+ format?: 'png' | 'jpeg' | 'webp';
7
+ quality?: number;
8
+ }
9
+ declare function initScreenshotListener(): void;
10
+
11
+ declare function initVly(): void;
12
+
13
+ export { type ScreenshotMessage, initScreenshotListener, initVly };
@@ -0,0 +1,117 @@
1
+ 'use strict';
2
+
3
+ // src/project-thumbnail/screenshot.ts
4
+ function initScreenshotListener() {
5
+ console.log("[VLY Runtime] Screenshot listener initialized");
6
+ if (typeof window.html2canvas === "undefined") {
7
+ const script = document.createElement("script");
8
+ script.src = "https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js";
9
+ script.async = true;
10
+ document.head.appendChild(script);
11
+ }
12
+ window.addEventListener("message", async (event) => {
13
+ const message = event.data;
14
+ if (message.type !== "vly-screenshot-request") return;
15
+ try {
16
+ if (typeof window.html2canvas === "undefined") {
17
+ throw new Error("html2canvas not loaded yet");
18
+ }
19
+ const html2canvas = window.html2canvas;
20
+ const canvas = await html2canvas(document.body, {
21
+ useCORS: true,
22
+ allowTaint: false,
23
+ backgroundColor: "#ffffff",
24
+ logging: false,
25
+ scale: 0.5,
26
+ width: window.innerWidth,
27
+ height: window.innerHeight
28
+ });
29
+ const format = message.format || "jpeg";
30
+ const quality = message.quality || 0.85;
31
+ const mimeType = `image/${format}`;
32
+ canvas.toBlob((blob) => {
33
+ if (!blob) {
34
+ throw new Error("Failed to convert canvas to blob");
35
+ }
36
+ const reader = new FileReader();
37
+ reader.onload = () => {
38
+ window.parent.postMessage({
39
+ type: "vly-screenshot-response",
40
+ requestId: message.requestId,
41
+ dataUrl: reader.result
42
+ }, "*");
43
+ console.log("[VLY Runtime] Screenshot sent to parent");
44
+ };
45
+ reader.onerror = () => {
46
+ throw new Error("FileReader error");
47
+ };
48
+ reader.readAsDataURL(blob);
49
+ }, mimeType, quality);
50
+ } catch (error) {
51
+ console.error("[VLY Runtime] Screenshot failed:", error);
52
+ window.parent.postMessage({
53
+ type: "vly-screenshot-error",
54
+ requestId: message.requestId,
55
+ error: error instanceof Error ? error.message : "Unknown error"
56
+ }, "*");
57
+ }
58
+ });
59
+ }
60
+
61
+ // src/project-thumbnail/index.ts
62
+ function isVlyPlatform() {
63
+ if (typeof window === "undefined") return false;
64
+ const hostname = window.location.hostname;
65
+ return hostname.endsWith(".vly.ai") || hostname.endsWith(".vly.sh") || hostname.includes("localhost") || // For dev
66
+ hostname.includes("127.0.0.1");
67
+ }
68
+ function initVly() {
69
+ if (!isVlyPlatform()) {
70
+ console.log("[VLY Runtime] Not on VLY platform, skipping initialization");
71
+ return;
72
+ }
73
+ console.log("[VLY Runtime] Initializing...");
74
+ initScreenshotListener();
75
+ initHmrErrorReporting();
76
+ console.log("[VLY Runtime] Ready");
77
+ }
78
+ function initHmrErrorReporting() {
79
+ if (undefined) {
80
+ undefined.on("vite:error", (payload) => {
81
+ window.parent.postMessage(
82
+ {
83
+ type: "vly-vite-hmr-error",
84
+ error: {
85
+ message: payload.err?.message || String(payload.err || payload),
86
+ stack: payload.err?.stack,
87
+ plugin: payload.err?.plugin,
88
+ loc: payload.err?.loc
89
+ },
90
+ timestamp: Date.now()
91
+ },
92
+ "*"
93
+ );
94
+ });
95
+ undefined.on("vite:beforeFullReload", () => {
96
+ window.parent.postMessage(
97
+ {
98
+ type: "vly-vite-hmr-success",
99
+ timestamp: Date.now()
100
+ },
101
+ "*"
102
+ );
103
+ });
104
+ }
105
+ }
106
+ if (typeof window !== "undefined") {
107
+ if (document.readyState === "loading") {
108
+ document.addEventListener("DOMContentLoaded", initVly);
109
+ } else {
110
+ initVly();
111
+ }
112
+ }
113
+
114
+ exports.initScreenshotListener = initScreenshotListener;
115
+ exports.initVly = initVly;
116
+ //# sourceMappingURL=index.js.map
117
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/project-thumbnail/screenshot.ts","../../src/project-thumbnail/index.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["export interface ScreenshotMessage {\n type: 'vly-screenshot-request' | 'vly-screenshot-response' | 'vly-screenshot-error';\n requestId?: string;\n dataUrl?: string;\n error?: string;\n format?: 'png' | 'jpeg' | 'webp';\n quality?: number;\n}\n\nexport function initScreenshotListener() {\n console.log('[VLY Runtime] Screenshot listener initialized');\n\n // Load html2canvas-pro from CDN (supports modern CSS like oklch)\n if (typeof (window as any).html2canvas === 'undefined') {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js';\n script.async = true\n document.head.appendChild(script);\n }\n\n // Listen for screenshot requests from parent\n window.addEventListener('message', async (event) => {\n const message = event.data as ScreenshotMessage;\n\n if (message.type !== 'vly-screenshot-request') return;\n\n try {\n // Wait for html2canvas to load\n if (typeof (window as any).html2canvas === 'undefined') {\n throw new Error('html2canvas not loaded yet');\n }\n\n const html2canvas = (window as any).html2canvas;\n\n // Capture screenshot\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n allowTaint: false,\n backgroundColor: '#ffffff',\n logging: false,\n scale: 0.5,\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n // Convert to blob and data URL\n const format = message.format || 'jpeg';\n const quality = message.quality || 0.85;\n const mimeType = `image/${format}`;\n\n canvas.toBlob((blob: Blob | null) => {\n if (!blob) {\n throw new Error('Failed to convert canvas to blob');\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n window.parent.postMessage({\n type: 'vly-screenshot-response',\n requestId: message.requestId,\n dataUrl: reader.result as string,\n } as ScreenshotMessage, '*');\n\n console.log('[VLY Runtime] Screenshot sent to parent');\n };\n reader.onerror = () => {\n throw new Error('FileReader error');\n };\n reader.readAsDataURL(blob);\n }, mimeType, quality);\n\n } catch (error) {\n console.error('[VLY Runtime] Screenshot failed:', error);\n\n window.parent.postMessage({\n type: 'vly-screenshot-error',\n requestId: message.requestId,\n error: error instanceof Error ? error.message : 'Unknown error',\n } as ScreenshotMessage, '*');\n }\n });\n}\n","/// <reference types=\"vite/client\" />\nimport { initScreenshotListener } from './screenshot';\n\nfunction isVlyPlatform(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hostname = window.location.hostname;\n return (\n hostname.endsWith('.vly.ai') ||\n hostname.endsWith('.vly.sh') ||\n hostname.includes('localhost') || // For dev\n hostname.includes('127.0.0.1')\n );\n}\n\nexport function initVly() {\n if (!isVlyPlatform()) {\n console.log('[VLY Runtime] Not on VLY platform, skipping initialization');\n return;\n }\n\n console.log('[VLY Runtime] Initializing...');\n initScreenshotListener();\n initHmrErrorReporting();\n console.log('[VLY Runtime] Ready');\n}\n\n/**\n * Initialize HMR error reporting\n * Sends Vite HMR errors to parent window via postMessage\n */\nfunction initHmrErrorReporting() {\n if (import.meta.hot) {\n import.meta.hot.on('vite:error', (payload: any) => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-error',\n error: {\n message: payload.err?.message || String(payload.err || payload),\n stack: payload.err?.stack,\n plugin: payload.err?.plugin,\n loc: payload.err?.loc,\n },\n timestamp: Date.now(),\n },\n '*'\n );\n });\n\n import.meta.hot.on('vite:beforeFullReload', () => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-success',\n timestamp: Date.now(),\n },\n '*'\n );\n });\n }\n}\n\n// Auto-initialize on import\nif (typeof window !== 'undefined') {\n // Wait for DOM to be ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initVly);\n } else {\n initVly();\n }\n}\n\nexport { initScreenshotListener } from './screenshot';\nexport type { ScreenshotMessage } from './screenshot';\n"]}
@@ -0,0 +1,114 @@
1
+ // src/project-thumbnail/screenshot.ts
2
+ function initScreenshotListener() {
3
+ console.log("[VLY Runtime] Screenshot listener initialized");
4
+ if (typeof window.html2canvas === "undefined") {
5
+ const script = document.createElement("script");
6
+ script.src = "https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js";
7
+ script.async = true;
8
+ document.head.appendChild(script);
9
+ }
10
+ window.addEventListener("message", async (event) => {
11
+ const message = event.data;
12
+ if (message.type !== "vly-screenshot-request") return;
13
+ try {
14
+ if (typeof window.html2canvas === "undefined") {
15
+ throw new Error("html2canvas not loaded yet");
16
+ }
17
+ const html2canvas = window.html2canvas;
18
+ const canvas = await html2canvas(document.body, {
19
+ useCORS: true,
20
+ allowTaint: false,
21
+ backgroundColor: "#ffffff",
22
+ logging: false,
23
+ scale: 0.5,
24
+ width: window.innerWidth,
25
+ height: window.innerHeight
26
+ });
27
+ const format = message.format || "jpeg";
28
+ const quality = message.quality || 0.85;
29
+ const mimeType = `image/${format}`;
30
+ canvas.toBlob((blob) => {
31
+ if (!blob) {
32
+ throw new Error("Failed to convert canvas to blob");
33
+ }
34
+ const reader = new FileReader();
35
+ reader.onload = () => {
36
+ window.parent.postMessage({
37
+ type: "vly-screenshot-response",
38
+ requestId: message.requestId,
39
+ dataUrl: reader.result
40
+ }, "*");
41
+ console.log("[VLY Runtime] Screenshot sent to parent");
42
+ };
43
+ reader.onerror = () => {
44
+ throw new Error("FileReader error");
45
+ };
46
+ reader.readAsDataURL(blob);
47
+ }, mimeType, quality);
48
+ } catch (error) {
49
+ console.error("[VLY Runtime] Screenshot failed:", error);
50
+ window.parent.postMessage({
51
+ type: "vly-screenshot-error",
52
+ requestId: message.requestId,
53
+ error: error instanceof Error ? error.message : "Unknown error"
54
+ }, "*");
55
+ }
56
+ });
57
+ }
58
+
59
+ // src/project-thumbnail/index.ts
60
+ function isVlyPlatform() {
61
+ if (typeof window === "undefined") return false;
62
+ const hostname = window.location.hostname;
63
+ return hostname.endsWith(".vly.ai") || hostname.endsWith(".vly.sh") || hostname.includes("localhost") || // For dev
64
+ hostname.includes("127.0.0.1");
65
+ }
66
+ function initVly() {
67
+ if (!isVlyPlatform()) {
68
+ console.log("[VLY Runtime] Not on VLY platform, skipping initialization");
69
+ return;
70
+ }
71
+ console.log("[VLY Runtime] Initializing...");
72
+ initScreenshotListener();
73
+ initHmrErrorReporting();
74
+ console.log("[VLY Runtime] Ready");
75
+ }
76
+ function initHmrErrorReporting() {
77
+ if (import.meta.hot) {
78
+ import.meta.hot.on("vite:error", (payload) => {
79
+ window.parent.postMessage(
80
+ {
81
+ type: "vly-vite-hmr-error",
82
+ error: {
83
+ message: payload.err?.message || String(payload.err || payload),
84
+ stack: payload.err?.stack,
85
+ plugin: payload.err?.plugin,
86
+ loc: payload.err?.loc
87
+ },
88
+ timestamp: Date.now()
89
+ },
90
+ "*"
91
+ );
92
+ });
93
+ import.meta.hot.on("vite:beforeFullReload", () => {
94
+ window.parent.postMessage(
95
+ {
96
+ type: "vly-vite-hmr-success",
97
+ timestamp: Date.now()
98
+ },
99
+ "*"
100
+ );
101
+ });
102
+ }
103
+ }
104
+ if (typeof window !== "undefined") {
105
+ if (document.readyState === "loading") {
106
+ document.addEventListener("DOMContentLoaded", initVly);
107
+ } else {
108
+ initVly();
109
+ }
110
+ }
111
+
112
+ export { initScreenshotListener, initVly };
113
+ //# sourceMappingURL=index.mjs.map
114
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/project-thumbnail/screenshot.ts","../../src/project-thumbnail/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["export interface ScreenshotMessage {\n type: 'vly-screenshot-request' | 'vly-screenshot-response' | 'vly-screenshot-error';\n requestId?: string;\n dataUrl?: string;\n error?: string;\n format?: 'png' | 'jpeg' | 'webp';\n quality?: number;\n}\n\nexport function initScreenshotListener() {\n console.log('[VLY Runtime] Screenshot listener initialized');\n\n // Load html2canvas-pro from CDN (supports modern CSS like oklch)\n if (typeof (window as any).html2canvas === 'undefined') {\n const script = document.createElement('script');\n script.src = 'https://cdn.jsdelivr.net/npm/html2canvas-pro@1.5.8/dist/html2canvas-pro.min.js';\n script.async = true\n document.head.appendChild(script);\n }\n\n // Listen for screenshot requests from parent\n window.addEventListener('message', async (event) => {\n const message = event.data as ScreenshotMessage;\n\n if (message.type !== 'vly-screenshot-request') return;\n\n try {\n // Wait for html2canvas to load\n if (typeof (window as any).html2canvas === 'undefined') {\n throw new Error('html2canvas not loaded yet');\n }\n\n const html2canvas = (window as any).html2canvas;\n\n // Capture screenshot\n const canvas = await html2canvas(document.body, {\n useCORS: true,\n allowTaint: false,\n backgroundColor: '#ffffff',\n logging: false,\n scale: 0.5,\n width: window.innerWidth,\n height: window.innerHeight,\n });\n\n // Convert to blob and data URL\n const format = message.format || 'jpeg';\n const quality = message.quality || 0.85;\n const mimeType = `image/${format}`;\n\n canvas.toBlob((blob: Blob | null) => {\n if (!blob) {\n throw new Error('Failed to convert canvas to blob');\n }\n\n const reader = new FileReader();\n reader.onload = () => {\n window.parent.postMessage({\n type: 'vly-screenshot-response',\n requestId: message.requestId,\n dataUrl: reader.result as string,\n } as ScreenshotMessage, '*');\n\n console.log('[VLY Runtime] Screenshot sent to parent');\n };\n reader.onerror = () => {\n throw new Error('FileReader error');\n };\n reader.readAsDataURL(blob);\n }, mimeType, quality);\n\n } catch (error) {\n console.error('[VLY Runtime] Screenshot failed:', error);\n\n window.parent.postMessage({\n type: 'vly-screenshot-error',\n requestId: message.requestId,\n error: error instanceof Error ? error.message : 'Unknown error',\n } as ScreenshotMessage, '*');\n }\n });\n}\n","/// <reference types=\"vite/client\" />\nimport { initScreenshotListener } from './screenshot';\n\nfunction isVlyPlatform(): boolean {\n if (typeof window === 'undefined') return false;\n\n const hostname = window.location.hostname;\n return (\n hostname.endsWith('.vly.ai') ||\n hostname.endsWith('.vly.sh') ||\n hostname.includes('localhost') || // For dev\n hostname.includes('127.0.0.1')\n );\n}\n\nexport function initVly() {\n if (!isVlyPlatform()) {\n console.log('[VLY Runtime] Not on VLY platform, skipping initialization');\n return;\n }\n\n console.log('[VLY Runtime] Initializing...');\n initScreenshotListener();\n initHmrErrorReporting();\n console.log('[VLY Runtime] Ready');\n}\n\n/**\n * Initialize HMR error reporting\n * Sends Vite HMR errors to parent window via postMessage\n */\nfunction initHmrErrorReporting() {\n if (import.meta.hot) {\n import.meta.hot.on('vite:error', (payload: any) => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-error',\n error: {\n message: payload.err?.message || String(payload.err || payload),\n stack: payload.err?.stack,\n plugin: payload.err?.plugin,\n loc: payload.err?.loc,\n },\n timestamp: Date.now(),\n },\n '*'\n );\n });\n\n import.meta.hot.on('vite:beforeFullReload', () => {\n window.parent.postMessage(\n {\n type: 'vly-vite-hmr-success',\n timestamp: Date.now(),\n },\n '*'\n );\n });\n }\n}\n\n// Auto-initialize on import\nif (typeof window !== 'undefined') {\n // Wait for DOM to be ready\n if (document.readyState === 'loading') {\n document.addEventListener('DOMContentLoaded', initVly);\n } else {\n initVly();\n }\n}\n\nexport { initScreenshotListener } from './screenshot';\nexport type { ScreenshotMessage } from './screenshot';\n"]}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vly-ai/integrations",
3
- "version": "0.6.1",
4
- "description": "Access AI models and email services through vly.ai without managing multiple API keys or accounts",
3
+ "version": "0.6.3",
4
+ "description": "Access AI models, email services, and project thumbnail capture through vly.ai without managing multiple API keys or accounts",
5
5
  "main": "./dist/index.js",
6
6
  "module": "./dist/index.mjs",
7
7
  "types": "./dist/index.d.ts",
@@ -10,16 +10,32 @@
10
10
  "types": "./dist/index.d.ts",
11
11
  "import": "./dist/index.mjs",
12
12
  "require": "./dist/index.js"
13
+ },
14
+ "./project-thumbnail": {
15
+ "types": "./dist/project-thumbnail/index.d.ts",
16
+ "import": "./dist/project-thumbnail/index.mjs",
17
+ "require": "./dist/project-thumbnail/index.js"
13
18
  }
14
19
  },
15
20
  "files": [
16
21
  "dist"
17
22
  ],
23
+ "scripts": {
24
+ "build": "tsup",
25
+ "dev": "tsup --watch",
26
+ "test": "vitest",
27
+ "test:watch": "vitest --watch",
28
+ "test:coverage": "vitest --coverage",
29
+ "prepublishOnly": "npm run build",
30
+ "type-check": "tsc --noEmit"
31
+ },
18
32
  "keywords": [
19
33
  "vly",
20
34
  "integrations",
21
35
  "ai",
22
36
  "email",
37
+ "project-thumbnail",
38
+ "screenshot",
23
39
  "autumn"
24
40
  ],
25
41
  "author": "",
@@ -29,22 +45,16 @@
29
45
  "@vitest/coverage-v8": "^2.0.0",
30
46
  "tsup": "^8.0.1",
31
47
  "typescript": "^5.3.3",
48
+ "vite": "^5.0.0",
32
49
  "vitest": "^2.0.0"
33
50
  },
34
51
  "dependencies": {
35
52
  "ai": "^5.0.0",
36
53
  "@ai-sdk/openai-compatible": "^1.0.0",
54
+ "html2canvas": "^1.4.1",
37
55
  "zod": "^3.22.4"
38
56
  },
39
57
  "engines": {
40
58
  "node": ">=18"
41
- },
42
- "scripts": {
43
- "build": "tsup",
44
- "dev": "tsup --watch",
45
- "test": "vitest",
46
- "test:watch": "vitest --watch",
47
- "test:coverage": "vitest --coverage",
48
- "type-check": "tsc --noEmit"
49
59
  }
50
- }
60
+ }