@vly-ai/integrations 0.5.2 → 0.6.1-beta.1
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/README.md +22 -62
- package/dist/index.d.mts +6 -135
- package/dist/index.d.ts +6 -135
- package/dist/index.js +98 -209
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +97 -209
- package/dist/index.mjs.map +1 -1
- package/dist/project-thumbnail/index.d.mts +13 -0
- package/dist/project-thumbnail/index.d.ts +13 -0
- package/dist/project-thumbnail/index.js +95 -0
- package/dist/project-thumbnail/index.js.map +1 -0
- package/dist/project-thumbnail/index.mjs +92 -0
- package/dist/project-thumbnail/index.mjs.map +1 -0
- package/package.json +10 -4
package/dist/index.mjs
CHANGED
|
@@ -9,7 +9,7 @@ var VlyAI = class {
|
|
|
9
9
|
this.config = config;
|
|
10
10
|
this.provider = createOpenAICompatible({
|
|
11
11
|
name: "vly-gateway",
|
|
12
|
-
baseURL: "https://
|
|
12
|
+
baseURL: "https://integrations.vly.ai/v1/llm",
|
|
13
13
|
headers: {
|
|
14
14
|
"Authorization": `Bearer ${config.deploymentToken}`
|
|
15
15
|
}
|
|
@@ -144,12 +144,12 @@ var VlyClient = class {
|
|
|
144
144
|
config;
|
|
145
145
|
constructor(config) {
|
|
146
146
|
this.config = {
|
|
147
|
-
deploymentToken: config.deploymentToken,
|
|
148
|
-
debug: config.debug
|
|
147
|
+
deploymentToken: config.deploymentToken || "vlytomoonF2024",
|
|
148
|
+
debug: config.debug ?? false
|
|
149
149
|
};
|
|
150
150
|
}
|
|
151
151
|
async request(endpoint, method, data, options) {
|
|
152
|
-
const url = `https://
|
|
152
|
+
const url = `https://integrations.vly.ai${endpoint}`;
|
|
153
153
|
const headers = {
|
|
154
154
|
"Authorization": `Bearer ${this.config.deploymentToken}`,
|
|
155
155
|
"Content-Type": "application/json",
|
|
@@ -303,227 +303,115 @@ var VlyEmail = class extends VlyClient {
|
|
|
303
303
|
}
|
|
304
304
|
};
|
|
305
305
|
|
|
306
|
-
// src/
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
currency: intent.currency || "usd",
|
|
316
|
-
description: intent.description,
|
|
317
|
-
metadata: intent.metadata,
|
|
318
|
-
customer: intent.customer
|
|
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
|
+
script.onload = () => {
|
|
314
|
+
console.log("[VLY Runtime] html2canvas-pro loaded");
|
|
319
315
|
};
|
|
320
|
-
|
|
321
|
-
"
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
options
|
|
325
|
-
);
|
|
326
|
-
if (response.success) {
|
|
327
|
-
this.log("Payment intent created", {
|
|
328
|
-
id: response.data?.id,
|
|
329
|
-
status: response.data?.status
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
return response;
|
|
333
|
-
}
|
|
334
|
-
async confirmPaymentIntent(intentId, paymentMethodId, options) {
|
|
335
|
-
this.log("Confirming payment intent", { intentId });
|
|
336
|
-
return this.request(
|
|
337
|
-
`/payments/intents/${intentId}/confirm`,
|
|
338
|
-
"POST",
|
|
339
|
-
{ paymentMethodId },
|
|
340
|
-
options
|
|
341
|
-
);
|
|
342
|
-
}
|
|
343
|
-
async getPaymentIntent(intentId, options) {
|
|
344
|
-
this.log("Getting payment intent", { intentId });
|
|
345
|
-
return this.request(
|
|
346
|
-
`/payments/intents/${intentId}`,
|
|
347
|
-
"GET",
|
|
348
|
-
void 0,
|
|
349
|
-
options
|
|
350
|
-
);
|
|
351
|
-
}
|
|
352
|
-
async cancelPaymentIntent(intentId, options) {
|
|
353
|
-
this.log("Canceling payment intent", { intentId });
|
|
354
|
-
return this.request(
|
|
355
|
-
`/payments/intents/${intentId}/cancel`,
|
|
356
|
-
"POST",
|
|
357
|
-
void 0,
|
|
358
|
-
options
|
|
359
|
-
);
|
|
360
|
-
}
|
|
361
|
-
async createSubscription(subscription, options) {
|
|
362
|
-
this.log("Creating subscription", {
|
|
363
|
-
customerId: subscription.customerId,
|
|
364
|
-
priceId: subscription.priceId
|
|
365
|
-
});
|
|
366
|
-
const response = await this.request(
|
|
367
|
-
"/payments/subscriptions",
|
|
368
|
-
"POST",
|
|
369
|
-
subscription,
|
|
370
|
-
options
|
|
371
|
-
);
|
|
372
|
-
if (response.success) {
|
|
373
|
-
this.log("Subscription created", {
|
|
374
|
-
id: response.data?.id,
|
|
375
|
-
status: response.data?.status
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
return response;
|
|
379
|
-
}
|
|
380
|
-
async updateSubscription(subscriptionId, updates, options) {
|
|
381
|
-
this.log("Updating subscription", { subscriptionId });
|
|
382
|
-
return this.request(
|
|
383
|
-
`/payments/subscriptions/${subscriptionId}`,
|
|
384
|
-
"PUT",
|
|
385
|
-
updates,
|
|
386
|
-
options
|
|
387
|
-
);
|
|
388
|
-
}
|
|
389
|
-
async cancelSubscription(subscriptionId, immediately, options) {
|
|
390
|
-
this.log("Canceling subscription", {
|
|
391
|
-
subscriptionId,
|
|
392
|
-
immediately
|
|
393
|
-
});
|
|
394
|
-
return this.request(
|
|
395
|
-
`/payments/subscriptions/${subscriptionId}/cancel`,
|
|
396
|
-
"POST",
|
|
397
|
-
{ immediately },
|
|
398
|
-
options
|
|
399
|
-
);
|
|
400
|
-
}
|
|
401
|
-
async getSubscription(subscriptionId, options) {
|
|
402
|
-
this.log("Getting subscription", { subscriptionId });
|
|
403
|
-
return this.request(
|
|
404
|
-
`/payments/subscriptions/${subscriptionId}`,
|
|
405
|
-
"GET",
|
|
406
|
-
void 0,
|
|
407
|
-
options
|
|
408
|
-
);
|
|
409
|
-
}
|
|
410
|
-
async listSubscriptions(customerId, options) {
|
|
411
|
-
this.log("Listing subscriptions", { customerId });
|
|
412
|
-
const params = new URLSearchParams();
|
|
413
|
-
if (customerId) params.append("customerId", customerId);
|
|
414
|
-
if (options?.limit) params.append("limit", options.limit.toString());
|
|
415
|
-
if (options?.offset) params.append("offset", options.offset.toString());
|
|
416
|
-
const queryString = params.toString();
|
|
417
|
-
const endpoint = `/payments/subscriptions${queryString ? `?${queryString}` : ""}`;
|
|
418
|
-
return this.request(endpoint, "GET", void 0, options);
|
|
316
|
+
script.onerror = () => {
|
|
317
|
+
console.error("[VLY Runtime] Failed to load html2canvas-pro");
|
|
318
|
+
};
|
|
319
|
+
document.head.appendChild(script);
|
|
419
320
|
}
|
|
420
|
-
async
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
"
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
321
|
+
window.addEventListener("message", async (event) => {
|
|
322
|
+
const message = event.data;
|
|
323
|
+
if (message.type !== "vly-screenshot-request") return;
|
|
324
|
+
console.log("[VLY Runtime] Screenshot request received:", message.requestId);
|
|
325
|
+
try {
|
|
326
|
+
if (typeof window.html2canvas === "undefined") {
|
|
327
|
+
throw new Error("html2canvas not loaded yet");
|
|
328
|
+
}
|
|
329
|
+
const html2canvas = window.html2canvas;
|
|
330
|
+
const canvas = await html2canvas(document.body, {
|
|
331
|
+
useCORS: true,
|
|
332
|
+
allowTaint: false,
|
|
333
|
+
backgroundColor: "#ffffff",
|
|
334
|
+
logging: false,
|
|
335
|
+
scale: 1
|
|
434
336
|
});
|
|
337
|
+
console.log("[VLY Runtime] Canvas created:", `${canvas.width}x${canvas.height}`);
|
|
338
|
+
const format = message.format || "jpeg";
|
|
339
|
+
const quality = message.quality || 0.85;
|
|
340
|
+
const mimeType = `image/${format}`;
|
|
341
|
+
canvas.toBlob((blob) => {
|
|
342
|
+
if (!blob) {
|
|
343
|
+
throw new Error("Failed to convert canvas to blob");
|
|
344
|
+
}
|
|
345
|
+
console.log("[VLY Runtime] Blob created:", `${(blob.size / 1024).toFixed(2)} KB`);
|
|
346
|
+
const reader = new FileReader();
|
|
347
|
+
reader.onload = () => {
|
|
348
|
+
window.parent.postMessage({
|
|
349
|
+
type: "vly-screenshot-response",
|
|
350
|
+
requestId: message.requestId,
|
|
351
|
+
dataUrl: reader.result
|
|
352
|
+
}, "*");
|
|
353
|
+
console.log("[VLY Runtime] Screenshot sent to parent");
|
|
354
|
+
};
|
|
355
|
+
reader.onerror = () => {
|
|
356
|
+
throw new Error("FileReader error");
|
|
357
|
+
};
|
|
358
|
+
reader.readAsDataURL(blob);
|
|
359
|
+
}, mimeType, quality);
|
|
360
|
+
} catch (error) {
|
|
361
|
+
console.error("[VLY Runtime] Screenshot failed:", error);
|
|
362
|
+
window.parent.postMessage({
|
|
363
|
+
type: "vly-screenshot-error",
|
|
364
|
+
requestId: message.requestId,
|
|
365
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
366
|
+
}, "*");
|
|
435
367
|
}
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
);
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
);
|
|
458
|
-
}
|
|
459
|
-
|
|
460
|
-
this.log("Getting customer", { customerId });
|
|
461
|
-
return this.request(
|
|
462
|
-
`/payments/customers/${customerId}`,
|
|
463
|
-
"GET",
|
|
464
|
-
void 0,
|
|
465
|
-
options
|
|
466
|
-
);
|
|
467
|
-
}
|
|
468
|
-
async updateCustomer(customerId, updates, options) {
|
|
469
|
-
this.log("Updating customer", { customerId });
|
|
470
|
-
return this.request(
|
|
471
|
-
`/payments/customers/${customerId}`,
|
|
472
|
-
"PUT",
|
|
473
|
-
updates,
|
|
474
|
-
options
|
|
475
|
-
);
|
|
476
|
-
}
|
|
477
|
-
async listPaymentMethods(customerId, options) {
|
|
478
|
-
this.log("Listing payment methods", { customerId });
|
|
479
|
-
return this.request(
|
|
480
|
-
`/payments/customers/${customerId}/payment-methods`,
|
|
481
|
-
"GET",
|
|
482
|
-
void 0,
|
|
483
|
-
options
|
|
484
|
-
);
|
|
485
|
-
}
|
|
486
|
-
async attachPaymentMethod(paymentMethodId, customerId, options) {
|
|
487
|
-
this.log("Attaching payment method", {
|
|
488
|
-
paymentMethodId,
|
|
489
|
-
customerId
|
|
490
|
-
});
|
|
491
|
-
return this.request(
|
|
492
|
-
`/payments/payment-methods/${paymentMethodId}/attach`,
|
|
493
|
-
"POST",
|
|
494
|
-
{ customerId },
|
|
495
|
-
options
|
|
496
|
-
);
|
|
497
|
-
}
|
|
498
|
-
async detachPaymentMethod(paymentMethodId, options) {
|
|
499
|
-
this.log("Detaching payment method", { paymentMethodId });
|
|
500
|
-
return this.request(
|
|
501
|
-
`/payments/payment-methods/${paymentMethodId}/detach`,
|
|
502
|
-
"POST",
|
|
503
|
-
void 0,
|
|
504
|
-
options
|
|
505
|
-
);
|
|
368
|
+
});
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
// src/project-thumbnail/index.ts
|
|
372
|
+
function isVlyPlatform() {
|
|
373
|
+
if (typeof window === "undefined") return false;
|
|
374
|
+
const hostname = window.location.hostname;
|
|
375
|
+
return hostname.endsWith(".vly.ai") || hostname.endsWith(".vly.sh") || hostname.includes("localhost") || // For dev
|
|
376
|
+
hostname.includes("127.0.0.1");
|
|
377
|
+
}
|
|
378
|
+
function initVly() {
|
|
379
|
+
if (!isVlyPlatform()) {
|
|
380
|
+
console.log("[VLY Runtime] Not on VLY platform, skipping initialization");
|
|
381
|
+
return;
|
|
382
|
+
}
|
|
383
|
+
console.log("[VLY Runtime] Initializing...");
|
|
384
|
+
initScreenshotListener();
|
|
385
|
+
console.log("[VLY Runtime] Ready");
|
|
386
|
+
}
|
|
387
|
+
if (typeof window !== "undefined") {
|
|
388
|
+
if (document.readyState === "loading") {
|
|
389
|
+
document.addEventListener("DOMContentLoaded", initVly);
|
|
390
|
+
} else {
|
|
391
|
+
initVly();
|
|
506
392
|
}
|
|
507
|
-
}
|
|
393
|
+
}
|
|
508
394
|
|
|
509
395
|
// src/index.ts
|
|
396
|
+
var DEFAULT_DEPLOYMENT_TOKEN = "vlytomoonF2024";
|
|
510
397
|
var VlyIntegrations = class {
|
|
511
398
|
ai;
|
|
512
399
|
email;
|
|
513
|
-
|
|
400
|
+
config;
|
|
514
401
|
constructor(config) {
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
this.
|
|
402
|
+
const normalizedToken = config.deploymentToken && config.deploymentToken.trim().length > 0 ? config.deploymentToken : DEFAULT_DEPLOYMENT_TOKEN;
|
|
403
|
+
this.config = {
|
|
404
|
+
deploymentToken: normalizedToken,
|
|
405
|
+
debug: config.debug ?? false
|
|
406
|
+
};
|
|
407
|
+
this.ai = new VlyAI(this.config);
|
|
408
|
+
this.email = new VlyEmail(this.config);
|
|
521
409
|
}
|
|
522
410
|
};
|
|
523
411
|
function createVlyIntegrations(config) {
|
|
524
412
|
return new VlyIntegrations(config);
|
|
525
413
|
}
|
|
526
414
|
|
|
527
|
-
export { VlyAI, VlyEmail, VlyIntegrations,
|
|
415
|
+
export { VlyAI, VlyEmail, VlyIntegrations, createVlyIntegrations, initScreenshotListener, initVly };
|
|
528
416
|
//# sourceMappingURL=index.mjs.map
|
|
529
417
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ai/index.ts","../src/client.ts","../src/email/index.ts","../src/payments/index.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://ai-gateway.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://ai-gateway.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 { VlyClient } from '../client';\nimport type { \n PaymentIntent,\n PaymentIntentResponse,\n Subscription,\n SubscriptionResponse,\n CustomerPortalSession,\n CustomerPortalResponse,\n RequestOptions,\n ApiResponse\n} from '../types';\n\nexport class VlyPayments extends VlyClient {\n async createPaymentIntent(\n intent: PaymentIntent,\n options?: RequestOptions\n ): Promise<ApiResponse<PaymentIntentResponse>> {\n this.log('Creating payment intent', { \n amount: intent.amount,\n currency: intent.currency \n });\n\n const payload = {\n amount: intent.amount,\n currency: intent.currency || 'usd',\n description: intent.description,\n metadata: intent.metadata,\n customer: intent.customer\n };\n\n const response = await this.request<PaymentIntentResponse>(\n '/payments/intents',\n 'POST',\n payload,\n options\n );\n\n if (response.success) {\n this.log('Payment intent created', { \n id: response.data?.id,\n status: response.data?.status \n });\n }\n\n return response;\n }\n\n async confirmPaymentIntent(\n intentId: string,\n paymentMethodId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<PaymentIntentResponse>> {\n this.log('Confirming payment intent', { intentId });\n\n return this.request<PaymentIntentResponse>(\n `/payments/intents/${intentId}/confirm`,\n 'POST',\n { paymentMethodId },\n options\n );\n }\n\n async getPaymentIntent(\n intentId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<PaymentIntentResponse>> {\n this.log('Getting payment intent', { intentId });\n\n return this.request<PaymentIntentResponse>(\n `/payments/intents/${intentId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async cancelPaymentIntent(\n intentId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<PaymentIntentResponse>> {\n this.log('Canceling payment intent', { intentId });\n\n return this.request<PaymentIntentResponse>(\n `/payments/intents/${intentId}/cancel`,\n 'POST',\n undefined,\n options\n );\n }\n\n async createSubscription(\n subscription: Subscription,\n options?: RequestOptions\n ): Promise<ApiResponse<SubscriptionResponse>> {\n this.log('Creating subscription', { \n customerId: subscription.customerId,\n priceId: subscription.priceId \n });\n\n const response = await this.request<SubscriptionResponse>(\n '/payments/subscriptions',\n 'POST',\n subscription,\n options\n );\n\n if (response.success) {\n this.log('Subscription created', { \n id: response.data?.id,\n status: response.data?.status \n });\n }\n\n return response;\n }\n\n async updateSubscription(\n subscriptionId: string,\n updates: Partial<Subscription>,\n options?: RequestOptions\n ): Promise<ApiResponse<SubscriptionResponse>> {\n this.log('Updating subscription', { subscriptionId });\n\n return this.request<SubscriptionResponse>(\n `/payments/subscriptions/${subscriptionId}`,\n 'PUT',\n updates,\n options\n );\n }\n\n async cancelSubscription(\n subscriptionId: string,\n immediately?: boolean,\n options?: RequestOptions\n ): Promise<ApiResponse<SubscriptionResponse>> {\n this.log('Canceling subscription', { \n subscriptionId,\n immediately \n });\n\n return this.request<SubscriptionResponse>(\n `/payments/subscriptions/${subscriptionId}/cancel`,\n 'POST',\n { immediately },\n options\n );\n }\n\n async getSubscription(\n subscriptionId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<SubscriptionResponse>> {\n this.log('Getting subscription', { subscriptionId });\n\n return this.request<SubscriptionResponse>(\n `/payments/subscriptions/${subscriptionId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async listSubscriptions(\n customerId?: string,\n options?: RequestOptions & { limit?: number; offset?: number }\n ): Promise<ApiResponse<{\n subscriptions: SubscriptionResponse[];\n hasMore: boolean;\n total: number;\n }>> {\n this.log('Listing subscriptions', { customerId });\n\n const params = new URLSearchParams();\n if (customerId) params.append('customerId', customerId);\n if (options?.limit) params.append('limit', options.limit.toString());\n if (options?.offset) params.append('offset', options.offset.toString());\n\n const queryString = params.toString();\n const endpoint = `/payments/subscriptions${queryString ? `?${queryString}` : ''}`;\n\n return this.request(endpoint, 'GET', undefined, options);\n }\n\n async createCustomerPortal(\n session: CustomerPortalSession,\n options?: RequestOptions\n ): Promise<ApiResponse<CustomerPortalResponse>> {\n this.log('Creating customer portal session', { \n customerId: session.customerId \n });\n\n const response = await this.request<CustomerPortalResponse>(\n '/payments/portal',\n 'POST',\n session,\n options\n );\n\n if (response.success) {\n this.log('Customer portal session created', { \n id: response.data?.id,\n url: response.data?.url \n });\n }\n\n return response;\n }\n\n async createCheckoutSession(\n session: {\n customerId?: string;\n customerEmail?: string;\n lineItems: Array<{\n priceId: string;\n quantity: number;\n }>;\n mode: 'payment' | 'subscription';\n successUrl: string;\n cancelUrl: string;\n metadata?: Record<string, any>;\n },\n options?: RequestOptions\n ): Promise<ApiResponse<{\n id: string;\n url: string;\n }>> {\n this.log('Creating checkout session', { \n mode: session.mode,\n lineItems: session.lineItems.length \n });\n\n return this.request(\n '/payments/checkout',\n 'POST',\n session,\n options\n );\n }\n\n async createCustomer(\n customer: {\n email: string;\n name?: string;\n metadata?: Record<string, any>;\n },\n options?: RequestOptions\n ): Promise<ApiResponse<{\n id: string;\n email: string;\n name?: string;\n created: number;\n }>> {\n this.log('Creating customer', { email: customer.email });\n\n return this.request(\n '/payments/customers',\n 'POST',\n customer,\n options\n );\n }\n\n async getCustomer(\n customerId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n id: string;\n email: string;\n name?: string;\n created: number;\n metadata?: Record<string, any>;\n }>> {\n this.log('Getting customer', { customerId });\n\n return this.request(\n `/payments/customers/${customerId}`,\n 'GET',\n undefined,\n options\n );\n }\n\n async updateCustomer(\n customerId: string,\n updates: {\n email?: string;\n name?: string;\n metadata?: Record<string, any>;\n },\n options?: RequestOptions\n ): Promise<ApiResponse<{\n id: string;\n email: string;\n name?: string;\n created: number;\n metadata?: Record<string, any>;\n }>> {\n this.log('Updating customer', { customerId });\n\n return this.request(\n `/payments/customers/${customerId}`,\n 'PUT',\n updates,\n options\n );\n }\n\n async listPaymentMethods(\n customerId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<Array<{\n id: string;\n type: string;\n card?: {\n brand: string;\n last4: string;\n expMonth: number;\n expYear: number;\n };\n created: number;\n }>>> {\n this.log('Listing payment methods', { customerId });\n\n return this.request(\n `/payments/customers/${customerId}/payment-methods`,\n 'GET',\n undefined,\n options\n );\n }\n\n async attachPaymentMethod(\n paymentMethodId: string,\n customerId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n id: string;\n customerId: string;\n attached: boolean;\n }>> {\n this.log('Attaching payment method', { \n paymentMethodId,\n customerId \n });\n\n return this.request(\n `/payments/payment-methods/${paymentMethodId}/attach`,\n 'POST',\n { customerId },\n options\n );\n }\n\n async detachPaymentMethod(\n paymentMethodId: string,\n options?: RequestOptions\n ): Promise<ApiResponse<{\n id: string;\n detached: boolean;\n }>> {\n this.log('Detaching payment method', { paymentMethodId });\n\n return this.request(\n `/payments/payment-methods/${paymentMethodId}/detach`,\n 'POST',\n undefined,\n options\n );\n }\n}","import type { VlyConfig } from './types';\nimport { VlyAI } from './ai';\nimport { VlyEmail } from './email';\nimport { VlyPayments } from './payments';\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 public payments: VlyPayments;\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 this.payments = new VlyPayments(config);\n }\n}\n\nexport function createVlyIntegrations(config: VlyConfig): VlyIntegrations {\n return new VlyIntegrations(config);\n}\n\nexport { VlyAI, VlyEmail, VlyPayments };"]}
|
|
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/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@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}","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 script.onload = () => {\n console.log('[VLY Runtime] html2canvas-pro loaded');\n };\n script.onerror = () => {\n console.error('[VLY Runtime] Failed to load html2canvas-pro');\n };\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 console.log('[VLY Runtime] Screenshot request received:', message.requestId);\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: 1,\n });\n\n console.log('[VLY Runtime] Canvas created:', `${canvas.width}x${canvas.height}`);\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 console.log('[VLY Runtime] Blob created:', `${(blob.size / 1024).toFixed(2)} KB`);\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","import { 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 console.log('[VLY Runtime] Ready');\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 { 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\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,95 @@
|
|
|
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
|
+
script.onload = () => {
|
|
11
|
+
console.log("[VLY Runtime] html2canvas-pro loaded");
|
|
12
|
+
};
|
|
13
|
+
script.onerror = () => {
|
|
14
|
+
console.error("[VLY Runtime] Failed to load html2canvas-pro");
|
|
15
|
+
};
|
|
16
|
+
document.head.appendChild(script);
|
|
17
|
+
}
|
|
18
|
+
window.addEventListener("message", async (event) => {
|
|
19
|
+
const message = event.data;
|
|
20
|
+
if (message.type !== "vly-screenshot-request") return;
|
|
21
|
+
console.log("[VLY Runtime] Screenshot request received:", message.requestId);
|
|
22
|
+
try {
|
|
23
|
+
if (typeof window.html2canvas === "undefined") {
|
|
24
|
+
throw new Error("html2canvas not loaded yet");
|
|
25
|
+
}
|
|
26
|
+
const html2canvas = window.html2canvas;
|
|
27
|
+
const canvas = await html2canvas(document.body, {
|
|
28
|
+
useCORS: true,
|
|
29
|
+
allowTaint: false,
|
|
30
|
+
backgroundColor: "#ffffff",
|
|
31
|
+
logging: false,
|
|
32
|
+
scale: 1
|
|
33
|
+
});
|
|
34
|
+
console.log("[VLY Runtime] Canvas created:", `${canvas.width}x${canvas.height}`);
|
|
35
|
+
const format = message.format || "jpeg";
|
|
36
|
+
const quality = message.quality || 0.85;
|
|
37
|
+
const mimeType = `image/${format}`;
|
|
38
|
+
canvas.toBlob((blob) => {
|
|
39
|
+
if (!blob) {
|
|
40
|
+
throw new Error("Failed to convert canvas to blob");
|
|
41
|
+
}
|
|
42
|
+
console.log("[VLY Runtime] Blob created:", `${(blob.size / 1024).toFixed(2)} KB`);
|
|
43
|
+
const reader = new FileReader();
|
|
44
|
+
reader.onload = () => {
|
|
45
|
+
window.parent.postMessage({
|
|
46
|
+
type: "vly-screenshot-response",
|
|
47
|
+
requestId: message.requestId,
|
|
48
|
+
dataUrl: reader.result
|
|
49
|
+
}, "*");
|
|
50
|
+
console.log("[VLY Runtime] Screenshot sent to parent");
|
|
51
|
+
};
|
|
52
|
+
reader.onerror = () => {
|
|
53
|
+
throw new Error("FileReader error");
|
|
54
|
+
};
|
|
55
|
+
reader.readAsDataURL(blob);
|
|
56
|
+
}, mimeType, quality);
|
|
57
|
+
} catch (error) {
|
|
58
|
+
console.error("[VLY Runtime] Screenshot failed:", error);
|
|
59
|
+
window.parent.postMessage({
|
|
60
|
+
type: "vly-screenshot-error",
|
|
61
|
+
requestId: message.requestId,
|
|
62
|
+
error: error instanceof Error ? error.message : "Unknown error"
|
|
63
|
+
}, "*");
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// src/project-thumbnail/index.ts
|
|
69
|
+
function isVlyPlatform() {
|
|
70
|
+
if (typeof window === "undefined") return false;
|
|
71
|
+
const hostname = window.location.hostname;
|
|
72
|
+
return hostname.endsWith(".vly.ai") || hostname.endsWith(".vly.sh") || hostname.includes("localhost") || // For dev
|
|
73
|
+
hostname.includes("127.0.0.1");
|
|
74
|
+
}
|
|
75
|
+
function initVly() {
|
|
76
|
+
if (!isVlyPlatform()) {
|
|
77
|
+
console.log("[VLY Runtime] Not on VLY platform, skipping initialization");
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
console.log("[VLY Runtime] Initializing...");
|
|
81
|
+
initScreenshotListener();
|
|
82
|
+
console.log("[VLY Runtime] Ready");
|
|
83
|
+
}
|
|
84
|
+
if (typeof window !== "undefined") {
|
|
85
|
+
if (document.readyState === "loading") {
|
|
86
|
+
document.addEventListener("DOMContentLoaded", initVly);
|
|
87
|
+
} else {
|
|
88
|
+
initVly();
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
exports.initScreenshotListener = initScreenshotListener;
|
|
93
|
+
exports.initVly = initVly;
|
|
94
|
+
//# sourceMappingURL=index.js.map
|
|
95
|
+
//# 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 script.onload = () => {\n console.log('[VLY Runtime] html2canvas-pro loaded');\n };\n script.onerror = () => {\n console.error('[VLY Runtime] Failed to load html2canvas-pro');\n };\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 console.log('[VLY Runtime] Screenshot request received:', message.requestId);\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: 1,\n });\n\n console.log('[VLY Runtime] Canvas created:', `${canvas.width}x${canvas.height}`);\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 console.log('[VLY Runtime] Blob created:', `${(blob.size / 1024).toFixed(2)} KB`);\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","import { 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 console.log('[VLY Runtime] Ready');\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"]}
|