veryfront 0.0.5 → 0.0.7
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 +24 -65
- package/dist/ai/client.d.ts +2 -0
- package/dist/ai/components.d.ts +11 -0
- package/dist/ai/dev.d.ts +7 -0
- package/dist/ai/dev.js +4 -5
- package/dist/ai/dev.js.map +2 -2
- package/dist/ai/index.d.ts +40 -0
- package/dist/ai/index.js +98 -43
- package/dist/ai/index.js.map +2 -2
- package/dist/ai/primitives.d.ts +29 -0
- package/dist/ai/production.d.ts +13 -0
- package/dist/ai/production.js +22 -10
- package/dist/ai/production.js.map +2 -2
- package/dist/ai/react.d.ts +3 -0
- package/dist/cli.js +1491 -1679
- package/dist/components.d.ts +33 -0
- package/dist/components.js +60 -68
- package/dist/components.js.map +3 -3
- package/dist/config.d.ts +23 -0
- package/dist/config.js +4 -5
- package/dist/config.js.map +2 -2
- package/dist/data.d.ts +21 -0
- package/dist/data.js +14 -15
- package/dist/data.js.map +2 -2
- package/dist/index.d.ts +11 -0
- package/dist/index.js +42 -105
- package/dist/index.js.map +3 -3
- package/package.json +17 -16
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
// AI primitive components type definitions
|
|
2
|
+
import type { ReactNode, HTMLAttributes } from 'react';
|
|
3
|
+
import type { UseChatHelpers } from '@ai-sdk/react';
|
|
4
|
+
|
|
5
|
+
export interface ChatContainerProps extends HTMLAttributes<HTMLDivElement> {
|
|
6
|
+
children?: ReactNode;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export interface MessageListProps extends HTMLAttributes<HTMLDivElement> {
|
|
10
|
+
messages: Array<{ id: string; role: string; content: string }>;
|
|
11
|
+
renderMessage?: (message: { id: string; role: string; content: string }) => ReactNode;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface MessageItemProps extends HTMLAttributes<HTMLDivElement> {
|
|
15
|
+
message: { id: string; role: string; content: string };
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export interface InputFormProps extends HTMLAttributes<HTMLFormElement> {
|
|
19
|
+
input: string;
|
|
20
|
+
handleInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;
|
|
21
|
+
handleSubmit: (e: React.FormEvent<HTMLFormElement>) => void;
|
|
22
|
+
isLoading?: boolean;
|
|
23
|
+
placeholder?: string;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export declare function ChatContainer(props: ChatContainerProps): JSX.Element;
|
|
27
|
+
export declare function MessageList(props: MessageListProps): JSX.Element;
|
|
28
|
+
export declare function MessageItem(props: MessageItemProps): JSX.Element;
|
|
29
|
+
export declare function InputForm(props: InputFormProps): JSX.Element;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// AI production utilities type definitions
|
|
2
|
+
export interface RateLimitConfig {
|
|
3
|
+
windowMs?: number;
|
|
4
|
+
maxRequests?: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export interface CostTrackingConfig {
|
|
8
|
+
enabled?: boolean;
|
|
9
|
+
budgetLimit?: number;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export declare function withRateLimit(config: RateLimitConfig): (handler: (req: Request) => Promise<Response>) => (req: Request) => Promise<Response>;
|
|
13
|
+
export declare function withCostTracking(config: CostTrackingConfig): (handler: (req: Request) => Promise<Response>) => (req: Request) => Promise<Response>;
|
package/dist/ai/production.js
CHANGED
|
@@ -241,6 +241,7 @@ var LRUCache = class {
|
|
|
241
241
|
var TTLCache = class {
|
|
242
242
|
constructor(ttl = 3e5) {
|
|
243
243
|
this.cache = /* @__PURE__ */ new Map();
|
|
244
|
+
this.cleanupInterval = null;
|
|
244
245
|
this.ttl = ttl;
|
|
245
246
|
this.startCleanup();
|
|
246
247
|
}
|
|
@@ -285,8 +286,15 @@ var TTLCache = class {
|
|
|
285
286
|
size() {
|
|
286
287
|
return this.cache.size;
|
|
287
288
|
}
|
|
289
|
+
destroy() {
|
|
290
|
+
if (this.cleanupInterval) {
|
|
291
|
+
clearInterval(this.cleanupInterval);
|
|
292
|
+
this.cleanupInterval = null;
|
|
293
|
+
}
|
|
294
|
+
this.cache.clear();
|
|
295
|
+
}
|
|
288
296
|
startCleanup() {
|
|
289
|
-
setInterval(() => {
|
|
297
|
+
this.cleanupInterval = setInterval(() => {
|
|
290
298
|
const now = Date.now();
|
|
291
299
|
for (const [key, entry] of this.cache.entries()) {
|
|
292
300
|
if (entry.expiresAt && now >= entry.expiresAt) {
|
|
@@ -404,8 +412,7 @@ function getEnvironmentVariable(name) {
|
|
|
404
412
|
const value = globalThis.process?.env[name];
|
|
405
413
|
return value === "" ? void 0 : value;
|
|
406
414
|
}
|
|
407
|
-
} catch
|
|
408
|
-
console.debug(`Failed to get environment variable ${name}:`, error);
|
|
415
|
+
} catch {
|
|
409
416
|
return void 0;
|
|
410
417
|
}
|
|
411
418
|
return void 0;
|
|
@@ -457,10 +464,10 @@ var ConsoleLogger = class {
|
|
|
457
464
|
const end = performance.now();
|
|
458
465
|
this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);
|
|
459
466
|
return result;
|
|
460
|
-
} catch (
|
|
467
|
+
} catch (error) {
|
|
461
468
|
const end = performance.now();
|
|
462
|
-
this.error(`${label} failed after ${(end - start).toFixed(2)}ms`,
|
|
463
|
-
throw
|
|
469
|
+
this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, error);
|
|
470
|
+
throw error;
|
|
464
471
|
}
|
|
465
472
|
}
|
|
466
473
|
};
|
|
@@ -512,6 +519,7 @@ var CostTracker = class {
|
|
|
512
519
|
this.monthlyTotal = 0;
|
|
513
520
|
this.lastDayReset = Date.now();
|
|
514
521
|
this.lastMonthReset = Date.now();
|
|
522
|
+
this.resetInterval = null;
|
|
515
523
|
this.config = config;
|
|
516
524
|
this.startPeriodicReset();
|
|
517
525
|
}
|
|
@@ -631,11 +639,8 @@ var CostTracker = class {
|
|
|
631
639
|
}
|
|
632
640
|
}
|
|
633
641
|
}
|
|
634
|
-
/**
|
|
635
|
-
* Reset periodic totals
|
|
636
|
-
*/
|
|
637
642
|
startPeriodicReset() {
|
|
638
|
-
setInterval(() => {
|
|
643
|
+
this.resetInterval = setInterval(() => {
|
|
639
644
|
const now = Date.now();
|
|
640
645
|
if (now - this.lastDayReset >= 24 * 60 * 60 * 1e3) {
|
|
641
646
|
this.dailyTotal = 0;
|
|
@@ -647,6 +652,13 @@ var CostTracker = class {
|
|
|
647
652
|
}
|
|
648
653
|
}, 6e4);
|
|
649
654
|
}
|
|
655
|
+
destroy() {
|
|
656
|
+
if (this.resetInterval) {
|
|
657
|
+
clearInterval(this.resetInterval);
|
|
658
|
+
this.resetInterval = null;
|
|
659
|
+
}
|
|
660
|
+
this.records = [];
|
|
661
|
+
}
|
|
650
662
|
/**
|
|
651
663
|
* Create empty record
|
|
652
664
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/core/errors/veryfront-error.ts", "../../../src/ai/production/rate-limit/limiter.ts", "../../../src/ai/production/cache/cache.ts", "../../../src/core/utils/runtime-guards.ts", "../../../src/core/utils/logger/env.ts", "../../../src/core/utils/logger/logger.ts", "../../../src/ai/production/cost-tracking/tracker.ts", "../../../src/ai/production/security/validator.ts"],
|
|
4
|
-
"sourcesContent": ["export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?: \"parse\" | \"transform\" | \"bundle\" | \"optimize\";\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "import { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Rate Limiting System\n *\n * Prevents abuse and ensures fair usage of AI resources.\n * Supports multiple strategies: fixed window, sliding window, token bucket.\n */\n\nexport interface RateLimitConfig {\n /** Strategy type */\n strategy: \"fixed-window\" | \"sliding-window\" | \"token-bucket\";\n\n /** Maximum requests */\n maxRequests: number;\n\n /** Time window in milliseconds */\n windowMs: number;\n\n /** Identifier function (e.g., user ID, IP address) */\n identify?: (context: Record<string, unknown>) => string;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\nexport interface RateLimitResult {\n /** Allowed or not */\n allowed: boolean;\n\n /** Requests remaining */\n remaining: number;\n\n /** Reset time (timestamp) */\n resetAt: number;\n\n /** Retry after (seconds) */\n retryAfter?: number;\n}\n\n/**\n * Fixed Window Rate Limiter\n */\nclass FixedWindowLimiter {\n private requests = new Map<string, { count: number; resetAt: number }>();\n private config: RateLimitConfig;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n const entry = this.requests.get(identifier);\n\n // No previous requests or window expired\n if (!entry || now >= entry.resetAt) {\n const resetAt = now + this.config.windowMs;\n\n this.requests.set(identifier, {\n count: 1,\n resetAt,\n });\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - 1,\n resetAt,\n };\n }\n\n // Within window\n if (entry.count < this.config.maxRequests) {\n entry.count++;\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - entry.count,\n resetAt: entry.resetAt,\n };\n }\n\n // Limit exceeded\n return {\n allowed: false,\n remaining: 0,\n resetAt: entry.resetAt,\n retryAfter: Math.ceil((entry.resetAt - now) / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.requests.delete(identifier);\n }\n\n clear(): void {\n this.requests.clear();\n }\n}\n\n/**\n * Token Bucket Rate Limiter (more flexible)\n */\nclass TokenBucketLimiter {\n private buckets = new Map<\n string,\n { tokens: number; lastRefill: number }\n >();\n private config: RateLimitConfig;\n private refillRate: number;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n // Refill rate: tokens per millisecond\n this.refillRate = config.maxRequests / config.windowMs;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n let bucket = this.buckets.get(identifier);\n\n // Initialize bucket if not exists\n if (!bucket) {\n bucket = {\n tokens: this.config.maxRequests - 1,\n lastRefill: now,\n };\n this.buckets.set(identifier, bucket);\n\n return {\n allowed: true,\n remaining: bucket.tokens,\n resetAt: now + this.config.windowMs,\n };\n }\n\n // Refill tokens based on time passed\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * this.refillRate;\n\n bucket.tokens = Math.min(\n this.config.maxRequests,\n bucket.tokens + tokensToAdd,\n );\n bucket.lastRefill = now;\n\n // Check if we have tokens\n if (bucket.tokens >= 1) {\n bucket.tokens--;\n\n return {\n allowed: true,\n remaining: Math.floor(bucket.tokens),\n resetAt: now + this.config.windowMs,\n };\n }\n\n // No tokens available\n const timeUntilToken = (1 - bucket.tokens) / this.refillRate;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt: now + this.config.windowMs,\n retryAfter: Math.ceil(timeUntilToken / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.buckets.delete(identifier);\n }\n\n clear(): void {\n this.buckets.clear();\n }\n}\n\n/**\n * Create a rate limiter\n */\nexport function createRateLimiter(config: RateLimitConfig) {\n let limiter: FixedWindowLimiter | TokenBucketLimiter;\n\n switch (config.strategy) {\n case \"fixed-window\":\n limiter = new FixedWindowLimiter(config);\n break;\n case \"token-bucket\":\n limiter = new TokenBucketLimiter(config);\n break;\n case \"sliding-window\":\n // Use token bucket as approximation for sliding window\n limiter = new TokenBucketLimiter(config);\n break;\n default:\n limiter = new FixedWindowLimiter(config);\n }\n\n return {\n /**\n * Check if request is allowed\n */\n check(context?: Record<string, unknown>): RateLimitResult {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n return limiter.check(identifier);\n },\n\n /**\n * Reset rate limit for identifier\n */\n reset(context?: Record<string, unknown>): void {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n limiter.reset(identifier);\n },\n\n /**\n * Clear all rate limits\n */\n clear(): void {\n limiter.clear();\n },\n };\n}\n\n/**\n * Create rate limit middleware for agents\n */\nexport function rateLimitMiddleware(config: RateLimitConfig) {\n const limiter = createRateLimiter(config);\n\n return <T>(context: Record<string, unknown>, next: () => Promise<T>): Promise<T> => {\n const result = limiter.check(context);\n\n if (!result.allowed) {\n throw toError(createError({\n type: \"agent\",\n message: config.errorMessage ||\n `Rate limit exceeded. Try again in ${result.retryAfter} seconds.`,\n }));\n }\n\n return next();\n };\n}\n", "/**\n * Response Caching System\n *\n * Cache agent responses to reduce API calls and improve performance.\n */\n\nimport type { AgentResponse } from \"../../types/agent.ts\";\n\nexport interface CacheConfig {\n /** Cache strategy */\n strategy: \"memory\" | \"lru\" | \"ttl\";\n\n /** Maximum cache size (for LRU) */\n maxSize?: number;\n\n /** Time to live in milliseconds (for TTL) */\n ttl?: number;\n\n /** Generate cache key */\n keyGenerator?: (input: string, context?: Record<string, unknown>) => string;\n}\n\nexport interface CacheEntry {\n /** Cached response */\n response: AgentResponse;\n\n /** Timestamp when cached */\n cachedAt: number;\n\n /** Expiration timestamp (for TTL) */\n expiresAt?: number;\n\n /** Access count */\n accessCount: number;\n\n /** Last accessed timestamp */\n lastAccessedAt: number;\n}\n\n/**\n * Memory Cache (simple in-memory storage)\n */\nclass MemoryCache {\n private cache = new Map<string, CacheEntry>();\n\n set(key: string, response: AgentResponse): void {\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * LRU Cache (Least Recently Used eviction)\n */\nclass LRUCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n set(key: string, response: AgentResponse): void {\n // If key exists, delete it first (will re-add to end)\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // If at max size, remove least recently used (first entry)\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Move to end (mark as recently used)\n this.cache.delete(key);\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n this.cache.set(key, entry);\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * TTL Cache (Time To Live eviction)\n */\nclass TTLCache {\n private cache = new Map<string, CacheEntry>();\n private ttl: number;\n\n constructor(ttl: number = 300000) {\n // Default: 5 minutes\n this.ttl = ttl;\n\n // Start cleanup interval\n this.startCleanup();\n }\n\n set(key: string, response: AgentResponse): void {\n const now = Date.now();\n\n this.cache.set(key, {\n response,\n cachedAt: now,\n expiresAt: now + this.ttl,\n accessCount: 0,\n lastAccessedAt: now,\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return null;\n }\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n\n if (!entry) return false;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n\n private startCleanup(): void {\n // Clean up expired entries every minute\n setInterval(() => {\n const now = Date.now();\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.expiresAt && now >= entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }, 60000);\n }\n}\n\n/**\n * Create a cache instance\n */\nexport function createCache(config: CacheConfig) {\n let cache: MemoryCache | LRUCache | TTLCache;\n\n switch (config.strategy) {\n case \"memory\":\n cache = new MemoryCache();\n break;\n case \"lru\":\n cache = new LRUCache(config.maxSize || 100);\n break;\n case \"ttl\":\n cache = new TTLCache(config.ttl || 300000);\n break;\n default:\n cache = new MemoryCache();\n }\n\n const keyGenerator = config.keyGenerator || ((input: string) => `cache_${hashString(input)}`);\n\n return {\n /**\n * Get cached response\n */\n get(input: string, context?: Record<string, unknown>): AgentResponse | null {\n const key = keyGenerator(input, context);\n return cache.get(key);\n },\n\n /**\n * Set cached response\n */\n set(input: string, response: AgentResponse, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.set(key, response);\n },\n\n /**\n * Check if cached\n */\n has(input: string, context?: Record<string, unknown>): boolean {\n const key = keyGenerator(input, context);\n return cache.has(key);\n },\n\n /**\n * Delete cached entry\n */\n delete(input: string, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.delete(key);\n },\n\n /**\n * Clear all cache\n */\n clear(): void {\n cache.clear();\n },\n\n /**\n * Get cache size\n */\n size(): number {\n return cache.size();\n },\n };\n}\n\n/**\n * Simple string hash function\n */\nfunction hashString(str: string): string {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Cache middleware for agents\n */\nexport function cacheMiddleware(config: CacheConfig) {\n const cache = createCache(config);\n\n return async (\n context: Record<string, unknown>,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n // Check cache\n const cached = cache.get(inputString, context);\n\n if (cached) {\n return {\n ...cached,\n metadata: {\n ...cached.metadata,\n fromCache: true,\n cachedAt: Date.now(),\n },\n };\n }\n\n // Execute and cache\n const result = await next();\n cache.set(inputString, result, context);\n\n return result;\n };\n}\n", "export interface GlobalWithDeno {\n Deno?: {\n env: {\n get(key: string): string | undefined;\n };\n };\n}\n\nexport interface GlobalWithProcess {\n process?: {\n env: Record<string, string | undefined>;\n version?: string;\n versions?: Record<string, string>;\n };\n}\n\nexport interface GlobalWithBun {\n Bun?: {\n version: string;\n };\n}\n\nexport function hasDenoRuntime(global: unknown): global is GlobalWithDeno {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Deno\" in global &&\n typeof (global as GlobalWithDeno).Deno?.env?.get === \"function\"\n );\n}\n\nexport function hasNodeProcess(global: unknown): global is GlobalWithProcess {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"process\" in global &&\n typeof (global as GlobalWithProcess).process?.env === \"object\"\n );\n}\n\nexport function hasBunRuntime(global: unknown): global is GlobalWithBun {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Bun\" in global &&\n typeof (global as GlobalWithBun).Bun !== \"undefined\"\n );\n}\n", "import type { GlobalWithDeno, GlobalWithProcess } from \"../runtime-guards.ts\";\nimport { hasDenoRuntime, hasNodeProcess } from \"../runtime-guards.ts\";\n\nexport function getEnvironmentVariable(name: string): string | undefined {\n try {\n if (typeof Deno !== \"undefined\" && hasDenoRuntime(globalThis)) {\n const value = (globalThis as GlobalWithDeno).Deno?.env.get(name);\n return value === \"\" ? undefined : value;\n }\n if (hasNodeProcess(globalThis)) {\n const value = (globalThis as GlobalWithProcess).process?.env[name];\n return value === \"\" ? undefined : value;\n }\n } catch (error) {\n // Note: Can't use logger here due to circular dependency (logger imports env.ts)\n console.debug(`Failed to get environment variable ${name}:`, error);\n return undefined;\n }\n return undefined;\n}\n\nexport function isTestEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"test\";\n}\n\nexport function isProductionEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"production\";\n}\n\nexport function isDevelopmentEnvironment(): boolean {\n const env = getEnvironmentVariable(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n", "import { getEnvironmentVariable } from \"./env.ts\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n time<T>(label: string, fn: () => Promise<T>): Promise<T>;\n}\n\nconst originalConsole = {\n debug: console.debug,\n log: console.log,\n warn: console.warn,\n error: console.error,\n};\n\nlet cachedLogLevel: LogLevel | undefined;\n\nfunction resolveLogLevel(force = false): LogLevel {\n if (force || cachedLogLevel === undefined) {\n cachedLogLevel = getDefaultLevel();\n }\n return cachedLogLevel;\n}\n\nclass ConsoleLogger implements Logger {\n constructor(\n private prefix: string,\n private level: LogLevel = resolveLogLevel(),\n ) {}\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.log(`[${this.prefix}] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN: ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR: ${message}`, ...args);\n }\n }\n\n async time<T>(label: string, fn: () => Promise<T>): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);\n return result;\n } catch (_error) {\n const end = performance.now();\n this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, _error);\n throw _error;\n }\n }\n}\n\nfunction parseLogLevel(levelString: string | undefined): LogLevel | undefined {\n if (!levelString) return undefined;\n const upper = levelString.toUpperCase();\n switch (upper) {\n case \"DEBUG\":\n return LogLevel.DEBUG;\n case \"WARN\":\n return LogLevel.WARN;\n case \"ERROR\":\n return LogLevel.ERROR;\n case \"INFO\":\n return LogLevel.INFO;\n default:\n return undefined;\n }\n}\n\nconst getDefaultLevel = (): LogLevel => {\n const envLevel = getEnvironmentVariable(\"LOG_LEVEL\");\n const parsedLevel = parseLogLevel(envLevel);\n if (parsedLevel !== undefined) return parsedLevel;\n\n const debugFlag = getEnvironmentVariable(\"VERYFRONT_DEBUG\");\n if (debugFlag === \"1\" || debugFlag === \"true\") return LogLevel.DEBUG;\n\n return LogLevel.INFO;\n};\n\nconst trackedLoggers = new Set<ConsoleLogger>();\n\nfunction createLogger(prefix: string): ConsoleLogger {\n const logger = new ConsoleLogger(prefix);\n trackedLoggers.add(logger);\n return logger;\n}\n\nexport const cliLogger = createLogger(\"CLI\");\nexport const serverLogger = createLogger(\"SERVER\");\nexport const rendererLogger = createLogger(\"RENDERER\");\nexport const bundlerLogger = createLogger(\"BUNDLER\");\nexport const agentLogger = createLogger(\"AGENT\");\n\nexport const logger = createLogger(\"VERYFRONT\");\n\ntype LoggerResetOptions = {\n restoreConsole?: boolean;\n};\n\nexport function __loggerResetForTests(options: LoggerResetOptions = {}): void {\n const updatedLevel = resolveLogLevel(true);\n for (const instance of trackedLoggers) {\n instance.setLevel(updatedLevel);\n }\n\n if (options.restoreConsole) {\n console.debug = originalConsole.debug;\n console.log = originalConsole.log;\n console.warn = originalConsole.warn;\n console.error = originalConsole.error;\n }\n}\n", "/**\n * Cost Tracking System\n *\n * Track API usage and costs for monitoring and billing.\n */\n\nimport type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { agentLogger } from \"@veryfront/utils/logger/logger.ts\";\n\nexport interface CostConfig {\n /** Provider pricing (per 1M tokens) */\n pricing: {\n [provider: string]: {\n input: number; // Cost per 1M input tokens\n output: number; // Cost per 1M output tokens\n };\n };\n\n /** Budget limits */\n limits?: {\n daily?: number;\n monthly?: number;\n };\n\n /** Callback when limit exceeded */\n onLimitExceeded?: (usage: UsageSummary) => void;\n}\n\nexport interface UsageRecord {\n /** Timestamp */\n timestamp: number;\n\n /** Agent ID */\n agentId: string;\n\n /** Model used */\n model: string;\n\n /** Provider */\n provider: string;\n\n /** Token usage */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Estimated cost */\n cost: number;\n\n /** User/session identifier */\n userId?: string;\n}\n\nexport interface UsageSummary {\n /** Total requests */\n requests: number;\n\n /** Total tokens */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Total cost */\n cost: number;\n\n /** Cost by provider */\n byProvider: Record<\n string,\n {\n requests: number;\n tokens: number;\n cost: number;\n }\n >;\n\n /** Period */\n period: {\n start: number;\n end: number;\n };\n}\n\n/**\n * Cost Tracker\n */\nclass CostTracker {\n private records: UsageRecord[] = [];\n private config: CostConfig;\n private dailyTotal = 0;\n private monthlyTotal = 0;\n private lastDayReset = Date.now();\n private lastMonthReset = Date.now();\n\n constructor(config: CostConfig) {\n this.config = config;\n this.startPeriodicReset();\n }\n\n /**\n * Track an agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n if (!response.usage) {\n agentLogger.warn(\"No usage data in response, cannot track costs\");\n return this.createEmptyRecord(agentId, model);\n }\n\n // Parse provider from model string\n const provider = model.split(\"/\")[0] || \"unknown\";\n\n // Calculate cost\n const cost = this.calculateCost(\n provider,\n response.usage.promptTokens,\n response.usage.completionTokens,\n );\n\n // Create record\n const record: UsageRecord = {\n timestamp: Date.now(),\n agentId,\n model,\n provider,\n tokens: {\n prompt: response.usage.promptTokens,\n completion: response.usage.completionTokens,\n total: response.usage.totalTokens,\n },\n cost,\n userId,\n };\n\n // Add to records\n this.records.push(record);\n\n // Update totals\n this.dailyTotal += cost;\n this.monthlyTotal += cost;\n\n // Check limits\n this.checkLimits();\n\n return record;\n }\n\n /**\n * Calculate cost based on token usage\n */\n private calculateCost(\n provider: string,\n inputTokens: number,\n outputTokens: number,\n ): number {\n const pricing = this.config.pricing[provider];\n\n if (!pricing) {\n agentLogger.warn(`No pricing configured for provider: ${provider}`);\n return 0;\n }\n\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n }\n\n /**\n * Get usage summary for a period\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n const start = startTime || 0;\n const end = endTime || Date.now();\n\n const relevantRecords = this.records.filter(\n (r) => r.timestamp >= start && r.timestamp <= end,\n );\n\n const summary: UsageSummary = {\n requests: relevantRecords.length,\n tokens: {\n prompt: 0,\n completion: 0,\n total: 0,\n },\n cost: 0,\n byProvider: {},\n period: { start, end },\n };\n\n for (const record of relevantRecords) {\n summary.tokens.prompt += record.tokens.prompt;\n summary.tokens.completion += record.tokens.completion;\n summary.tokens.total += record.tokens.total;\n summary.cost += record.cost;\n\n if (!summary.byProvider[record.provider]) {\n summary.byProvider[record.provider] = {\n requests: 0,\n tokens: 0,\n cost: 0,\n };\n }\n\n const providerStats = summary.byProvider[record.provider]!;\n providerStats.requests++;\n providerStats.tokens += record.tokens.total;\n providerStats.cost += record.cost;\n }\n\n return summary;\n }\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n const now = Date.now();\n const dayStart = now - 24 * 60 * 60 * 1000;\n return this.getSummary(dayStart, now);\n }\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n const now = Date.now();\n const monthStart = now - 30 * 24 * 60 * 60 * 1000;\n return this.getSummary(monthStart, now);\n }\n\n /**\n * Check if limits are exceeded\n */\n private checkLimits(): void {\n if (this.config.limits?.daily && this.dailyTotal > this.config.limits.daily) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getDailySummary());\n }\n }\n\n if (\n this.config.limits?.monthly &&\n this.monthlyTotal > this.config.limits.monthly\n ) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getMonthlySummary());\n }\n }\n }\n\n /**\n * Reset periodic totals\n */\n private startPeriodicReset(): void {\n setInterval(() => {\n const now = Date.now();\n\n // Reset daily (every 24 hours)\n if (now - this.lastDayReset >= 24 * 60 * 60 * 1000) {\n this.dailyTotal = 0;\n this.lastDayReset = now;\n }\n\n // Reset monthly (every 30 days)\n if (now - this.lastMonthReset >= 30 * 24 * 60 * 60 * 1000) {\n this.monthlyTotal = 0;\n this.lastMonthReset = now;\n }\n }, 60000); // Check every minute\n }\n\n /**\n * Create empty record\n */\n private createEmptyRecord(agentId: string, model: string): UsageRecord {\n return {\n timestamp: Date.now(),\n agentId,\n model,\n provider: model.split(\"/\")[0] || \"unknown\",\n tokens: { prompt: 0, completion: 0, total: 0 },\n cost: 0,\n };\n }\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return [...this.records];\n }\n\n /**\n * Clear all records\n */\n clear(): void {\n this.records = [];\n this.dailyTotal = 0;\n this.monthlyTotal = 0;\n }\n}\n\n/**\n * Create a cost tracker\n */\nexport function createCostTracker(config: CostConfig) {\n const tracker = new CostTracker(config);\n\n return {\n /**\n * Track agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n return tracker.track(agentId, model, response, userId);\n },\n\n /**\n * Get usage summary\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n return tracker.getSummary(startTime, endTime);\n },\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n return tracker.getDailySummary();\n },\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n return tracker.getMonthlySummary();\n },\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return tracker.getAllRecords();\n },\n\n /**\n * Clear all data\n */\n clear(): void {\n tracker.clear();\n },\n };\n}\n\n/**\n * Cost tracking middleware for agents\n */\nexport function costTrackingMiddleware(config: CostConfig) {\n const tracker = createCostTracker(config);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const result = await next();\n\n // Track cost\n tracker.track(\n context.agentId,\n context.model || \"unknown\",\n result,\n (context.data as Record<string, unknown>)?.userId as string | undefined,\n );\n\n return result;\n };\n}\n", "import type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Input Validation and Output Filtering\n *\n * Security features to prevent prompt injection, data leakage, and harmful content.\n */\n\nexport interface SecurityConfig {\n /** Input validation rules */\n input?: {\n /** Maximum input length */\n maxLength?: number;\n\n /** Blocked patterns (regex) */\n blockedPatterns?: RegExp[];\n\n /** Sanitize input */\n sanitize?: boolean;\n\n /** Custom validator */\n validate?: (input: string) => boolean | Promise<boolean>;\n };\n\n /** Output filtering rules */\n output?: {\n /** Blocked patterns in output */\n blockedPatterns?: RegExp[];\n\n /** Filter PII (Personal Identifiable Information) */\n filterPII?: boolean;\n\n /** Custom filter */\n filter?: (output: string) => string | Promise<string>;\n };\n\n /** Action when violation detected */\n onViolation?: (violation: SecurityViolation) => void;\n}\n\nexport interface SecurityViolation {\n /** Violation type */\n type: \"input\" | \"output\";\n\n /** Violation reason */\n reason: string;\n\n /** Original content */\n content: string;\n\n /** Matched pattern (if any) */\n pattern?: RegExp;\n}\n\n/**\n * Common blocked patterns\n */\nexport const COMMON_BLOCKED_PATTERNS = {\n /** Prompt injection attempts */\n promptInjection: [\n /ignore\\s+previous\\s+instructions/i,\n /ignore\\s+all\\s+previous\\s+prompts/i,\n /you\\s+are\\s+now\\s+a/i,\n /pretend\\s+you\\s+are/i,\n /system:\\s*/i,\n /<\\|im_start\\|>/i,\n /<\\|im_end\\|>/i,\n ],\n\n /** Potential data exfiltration */\n dataExfiltration: [\n /password/i,\n /api[_\\s-]?key/i,\n /secret/i,\n /token/i,\n /credit\\s+card/i,\n ],\n\n /** SQL injection patterns */\n sqlInjection: [\n /(\\bUNION\\b|\\bSELECT\\b).*\\bFROM\\b/i,\n /;\\s*(DROP|DELETE|UPDATE|INSERT)/i,\n ],\n\n /** XSS patterns */\n xss: [\n /<script[^>]*>.*?<\\/script>/gi,\n /javascript:/i,\n /on\\w+\\s*=/i, // Event handlers\n ],\n};\n\n/**\n * PII patterns (email, phone, SSN, etc.)\n */\nconst PII_PATTERNS = {\n email: /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n phone: /\\b(\\+\\d{1,3}[-.\\s]?)?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g,\n ssn: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n creditCard: /\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g,\n};\n\n/**\n * Input Validator\n */\nexport class InputValidator {\n private config: SecurityConfig[\"input\"];\n\n constructor(config?: SecurityConfig[\"input\"]) {\n this.config = config || {};\n }\n\n /**\n * Validate input\n */\n async validate(input: string): Promise<{\n valid: boolean;\n sanitized?: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n\n // Check length\n if (this.config?.maxLength && input.length > this.config.maxLength) {\n violations.push({\n type: \"input\",\n reason: `Input exceeds maximum length of ${this.config.maxLength}`,\n content: input.substring(0, 100) + \"...\",\n });\n }\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(input)) {\n violations.push({\n type: \"input\",\n reason: \"Input matches blocked pattern\",\n content: input,\n pattern,\n });\n }\n }\n }\n\n // Custom validation\n if (this.config?.validate) {\n const customValid = await this.config.validate(input);\n if (!customValid) {\n violations.push({\n type: \"input\",\n reason: \"Custom validation failed\",\n content: input,\n });\n }\n }\n\n // Sanitize if requested\n let sanitized = input;\n if (this.config?.sanitize) {\n sanitized = this.sanitizeInput(input);\n }\n\n return {\n valid: violations.length === 0,\n sanitized: this.config?.sanitize ? sanitized : undefined,\n violations,\n };\n }\n\n /**\n * Sanitize input (remove potentially harmful content)\n */\n private sanitizeInput(input: string): string {\n let sanitized = input;\n\n // Remove script tags\n sanitized = sanitized.replace(/<script[^>]*>.*?<\\/script>/gi, \"\");\n\n // Remove event handlers\n sanitized = sanitized.replace(/on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, \"\");\n\n // Remove javascript: protocol\n sanitized = sanitized.replace(/javascript:/gi, \"\");\n\n return sanitized;\n }\n}\n\n/**\n * Output Filter\n */\nexport class OutputFilter {\n private config: SecurityConfig[\"output\"];\n\n constructor(config?: SecurityConfig[\"output\"]) {\n this.config = config || {};\n }\n\n /**\n * Filter output\n */\n async filter(output: string): Promise<{\n filtered: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n let filtered = output;\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(filtered)) {\n violations.push({\n type: \"output\",\n reason: \"Output contains blocked pattern\",\n content: filtered,\n pattern,\n });\n\n // Redact matched content\n filtered = filtered.replace(pattern, \"[REDACTED]\");\n }\n }\n }\n\n // Filter PII\n if (this.config?.filterPII) {\n filtered = this.filterPII(filtered);\n }\n\n // Custom filter\n if (this.config?.filter) {\n filtered = await this.config.filter(filtered);\n }\n\n return { filtered, violations };\n }\n\n /**\n * Filter PII from output\n */\n private filterPII(output: string): string {\n let filtered = output;\n\n // Replace email addresses\n filtered = filtered.replace(PII_PATTERNS.email, \"[EMAIL]\");\n\n // Replace phone numbers\n filtered = filtered.replace(PII_PATTERNS.phone, \"[PHONE]\");\n\n // Replace SSN\n filtered = filtered.replace(PII_PATTERNS.ssn, \"[SSN]\");\n\n // Replace credit card numbers\n filtered = filtered.replace(PII_PATTERNS.creditCard, \"[CREDIT_CARD]\");\n\n return filtered;\n }\n}\n\n/**\n * Create security middleware for agents\n */\nexport function securityMiddleware(config: SecurityConfig) {\n const inputValidator = new InputValidator(config.input);\n const outputFilter = new OutputFilter(config.output);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n // Validate input\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n const inputValidation = await inputValidator.validate(inputString);\n\n if (!inputValidation.valid) {\n // Report violations\n inputValidation.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n\n const firstViolation = inputValidation.violations[0];\n throw toError(createError({\n type: \"agent\",\n message: `Input validation failed: ${firstViolation?.reason || \"Unknown reason\"}`,\n }));\n }\n\n // Execute with sanitized input if applicable\n if (inputValidation.sanitized) {\n context.input = inputValidation.sanitized;\n }\n\n // Execute\n const result = await next();\n\n // Filter output\n const outputFiltering = await outputFilter.filter(result.text);\n\n if (outputFiltering.violations.length > 0) {\n // Report violations\n outputFiltering.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n }\n\n // Return filtered result\n return {\n ...result,\n text: outputFiltering.filtered,\n };\n };\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
4
|
+
"sourcesContent": ["export interface BuildContext {\n file?: string;\n line?: number;\n column?: number;\n moduleId?: string;\n phase?: \"parse\" | \"transform\" | \"bundle\" | \"optimize\";\n}\n\nexport interface APIContext {\n endpoint?: string;\n method?: string;\n statusCode?: number;\n headers?: Record<string, string>;\n}\n\nexport interface RenderContext {\n component?: string;\n route?: string;\n phase?: \"server\" | \"client\" | \"hydration\";\n props?: unknown;\n}\n\nexport interface ConfigContext {\n configFile?: string;\n field?: string;\n value?: unknown;\n expected?: string;\n}\n\nexport interface AgentContext {\n agentId?: string;\n intent?: string;\n timeout?: number;\n}\n\nexport interface FileContext {\n path?: string;\n operation?: \"read\" | \"write\" | \"delete\" | \"mkdir\";\n permissions?: string;\n}\n\nexport interface NetworkContext {\n url?: string;\n timeout?: number;\n retryCount?: number;\n}\n\nexport type VeryfrontError =\n | { type: \"build\"; message: string; context?: BuildContext }\n | { type: \"api\"; message: string; context?: APIContext }\n | { type: \"render\"; message: string; context?: RenderContext }\n | { type: \"config\"; message: string; context?: ConfigContext }\n | { type: \"agent\"; message: string; context?: AgentContext }\n | { type: \"file\"; message: string; context?: FileContext }\n | { type: \"network\"; message: string; context?: NetworkContext }\n | { type: \"permission\"; message: string; context?: FileContext }\n | { type: \"not_supported\"; message: string; feature?: string };\n\nexport function createError(error: VeryfrontError): VeryfrontError {\n return error;\n}\n\nexport function isBuildError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"build\" }> {\n return error.type === \"build\";\n}\n\nexport function isAPIError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"api\" }> {\n return error.type === \"api\";\n}\n\nexport function isRenderError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"render\" }> {\n return error.type === \"render\";\n}\n\nexport function isConfigError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"config\" }> {\n return error.type === \"config\";\n}\n\nexport function isAgentError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"agent\" }> {\n return error.type === \"agent\";\n}\n\nexport function isFileError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"file\" }> {\n return error.type === \"file\";\n}\n\nexport function isNetworkError(\n error: VeryfrontError,\n): error is Extract<VeryfrontError, { type: \"network\" }> {\n return error.type === \"network\";\n}\n\nexport function toError(veryfrontError: VeryfrontError): Error {\n const error = new Error(veryfrontError.message);\n error.name = `VeryfrontError[${veryfrontError.type}]`;\n Object.defineProperty(error, \"context\", {\n value: veryfrontError,\n enumerable: false,\n configurable: true,\n });\n return error;\n}\n\nexport function fromError(error: unknown): VeryfrontError | null {\n if (error && typeof error === \"object\" && \"context\" in error) {\n // Safe access after 'in' check\n const context = (error as Record<string, unknown>).context;\n if (\n context &&\n typeof context === \"object\" &&\n \"type\" in context &&\n \"message\" in context\n ) {\n return context as VeryfrontError;\n }\n }\n return null;\n}\n\nexport function logError(\n error: VeryfrontError,\n logger?: { error: (msg: string, ...args: unknown[]) => void },\n): void {\n const log = logger || console;\n const context = \"context\" in error ? error.context || {} : {};\n log.error(`[${error.type}] ${error.message}`, context);\n}\n", "import { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Rate Limiting System\n *\n * Prevents abuse and ensures fair usage of AI resources.\n * Supports multiple strategies: fixed window, sliding window, token bucket.\n */\n\nexport interface RateLimitConfig {\n /** Strategy type */\n strategy: \"fixed-window\" | \"sliding-window\" | \"token-bucket\";\n\n /** Maximum requests */\n maxRequests: number;\n\n /** Time window in milliseconds */\n windowMs: number;\n\n /** Identifier function (e.g., user ID, IP address) */\n identify?: (context: Record<string, unknown>) => string;\n\n /** Custom error message */\n errorMessage?: string;\n}\n\nexport interface RateLimitResult {\n /** Allowed or not */\n allowed: boolean;\n\n /** Requests remaining */\n remaining: number;\n\n /** Reset time (timestamp) */\n resetAt: number;\n\n /** Retry after (seconds) */\n retryAfter?: number;\n}\n\n/**\n * Fixed Window Rate Limiter\n */\nclass FixedWindowLimiter {\n private requests = new Map<string, { count: number; resetAt: number }>();\n private config: RateLimitConfig;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n const entry = this.requests.get(identifier);\n\n // No previous requests or window expired\n if (!entry || now >= entry.resetAt) {\n const resetAt = now + this.config.windowMs;\n\n this.requests.set(identifier, {\n count: 1,\n resetAt,\n });\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - 1,\n resetAt,\n };\n }\n\n // Within window\n if (entry.count < this.config.maxRequests) {\n entry.count++;\n\n return {\n allowed: true,\n remaining: this.config.maxRequests - entry.count,\n resetAt: entry.resetAt,\n };\n }\n\n // Limit exceeded\n return {\n allowed: false,\n remaining: 0,\n resetAt: entry.resetAt,\n retryAfter: Math.ceil((entry.resetAt - now) / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.requests.delete(identifier);\n }\n\n clear(): void {\n this.requests.clear();\n }\n}\n\n/**\n * Token Bucket Rate Limiter (more flexible)\n */\nclass TokenBucketLimiter {\n private buckets = new Map<\n string,\n { tokens: number; lastRefill: number }\n >();\n private config: RateLimitConfig;\n private refillRate: number;\n\n constructor(config: RateLimitConfig) {\n this.config = config;\n // Refill rate: tokens per millisecond\n this.refillRate = config.maxRequests / config.windowMs;\n }\n\n check(identifier: string): RateLimitResult {\n const now = Date.now();\n let bucket = this.buckets.get(identifier);\n\n // Initialize bucket if not exists\n if (!bucket) {\n bucket = {\n tokens: this.config.maxRequests - 1,\n lastRefill: now,\n };\n this.buckets.set(identifier, bucket);\n\n return {\n allowed: true,\n remaining: bucket.tokens,\n resetAt: now + this.config.windowMs,\n };\n }\n\n // Refill tokens based on time passed\n const timePassed = now - bucket.lastRefill;\n const tokensToAdd = timePassed * this.refillRate;\n\n bucket.tokens = Math.min(\n this.config.maxRequests,\n bucket.tokens + tokensToAdd,\n );\n bucket.lastRefill = now;\n\n // Check if we have tokens\n if (bucket.tokens >= 1) {\n bucket.tokens--;\n\n return {\n allowed: true,\n remaining: Math.floor(bucket.tokens),\n resetAt: now + this.config.windowMs,\n };\n }\n\n // No tokens available\n const timeUntilToken = (1 - bucket.tokens) / this.refillRate;\n\n return {\n allowed: false,\n remaining: 0,\n resetAt: now + this.config.windowMs,\n retryAfter: Math.ceil(timeUntilToken / 1000),\n };\n }\n\n reset(identifier: string): void {\n this.buckets.delete(identifier);\n }\n\n clear(): void {\n this.buckets.clear();\n }\n}\n\n/**\n * Create a rate limiter\n */\nexport function createRateLimiter(config: RateLimitConfig) {\n let limiter: FixedWindowLimiter | TokenBucketLimiter;\n\n switch (config.strategy) {\n case \"fixed-window\":\n limiter = new FixedWindowLimiter(config);\n break;\n case \"token-bucket\":\n limiter = new TokenBucketLimiter(config);\n break;\n case \"sliding-window\":\n // Use token bucket as approximation for sliding window\n limiter = new TokenBucketLimiter(config);\n break;\n default:\n limiter = new FixedWindowLimiter(config);\n }\n\n return {\n /**\n * Check if request is allowed\n */\n check(context?: Record<string, unknown>): RateLimitResult {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n return limiter.check(identifier);\n },\n\n /**\n * Reset rate limit for identifier\n */\n reset(context?: Record<string, unknown>): void {\n const identifier = config.identify ? config.identify(context!) : \"default\";\n\n limiter.reset(identifier);\n },\n\n /**\n * Clear all rate limits\n */\n clear(): void {\n limiter.clear();\n },\n };\n}\n\n/**\n * Create rate limit middleware for agents\n */\nexport function rateLimitMiddleware(config: RateLimitConfig) {\n const limiter = createRateLimiter(config);\n\n return <T>(context: Record<string, unknown>, next: () => Promise<T>): Promise<T> => {\n const result = limiter.check(context);\n\n if (!result.allowed) {\n throw toError(createError({\n type: \"agent\",\n message: config.errorMessage ||\n `Rate limit exceeded. Try again in ${result.retryAfter} seconds.`,\n }));\n }\n\n return next();\n };\n}\n", "/**\n * Response Caching System\n *\n * Cache agent responses to reduce API calls and improve performance.\n */\n\nimport type { AgentResponse } from \"../../types/agent.ts\";\n\nexport interface CacheConfig {\n /** Cache strategy */\n strategy: \"memory\" | \"lru\" | \"ttl\";\n\n /** Maximum cache size (for LRU) */\n maxSize?: number;\n\n /** Time to live in milliseconds (for TTL) */\n ttl?: number;\n\n /** Generate cache key */\n keyGenerator?: (input: string, context?: Record<string, unknown>) => string;\n}\n\nexport interface CacheEntry {\n /** Cached response */\n response: AgentResponse;\n\n /** Timestamp when cached */\n cachedAt: number;\n\n /** Expiration timestamp (for TTL) */\n expiresAt?: number;\n\n /** Access count */\n accessCount: number;\n\n /** Last accessed timestamp */\n lastAccessedAt: number;\n}\n\n/**\n * Memory Cache (simple in-memory storage)\n */\nclass MemoryCache {\n private cache = new Map<string, CacheEntry>();\n\n set(key: string, response: AgentResponse): void {\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * LRU Cache (Least Recently Used eviction)\n */\nclass LRUCache {\n private cache = new Map<string, CacheEntry>();\n private maxSize: number;\n\n constructor(maxSize: number = 100) {\n this.maxSize = maxSize;\n }\n\n set(key: string, response: AgentResponse): void {\n // If key exists, delete it first (will re-add to end)\n if (this.cache.has(key)) {\n this.cache.delete(key);\n }\n\n // If at max size, remove least recently used (first entry)\n if (this.cache.size >= this.maxSize) {\n const firstKey = this.cache.keys().next().value;\n if (firstKey !== undefined) {\n this.cache.delete(firstKey);\n }\n }\n\n this.cache.set(key, {\n response,\n cachedAt: Date.now(),\n accessCount: 0,\n lastAccessedAt: Date.now(),\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Move to end (mark as recently used)\n this.cache.delete(key);\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n this.cache.set(key, entry);\n\n return entry.response;\n }\n\n has(key: string): boolean {\n return this.cache.has(key);\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n}\n\n/**\n * TTL Cache (Time To Live eviction)\n */\nclass TTLCache {\n private cache = new Map<string, CacheEntry>();\n private ttl: number;\n private cleanupInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(ttl: number = 300000) {\n this.ttl = ttl;\n this.startCleanup();\n }\n\n set(key: string, response: AgentResponse): void {\n const now = Date.now();\n\n this.cache.set(key, {\n response,\n cachedAt: now,\n expiresAt: now + this.ttl,\n accessCount: 0,\n lastAccessedAt: now,\n });\n }\n\n get(key: string): AgentResponse | null {\n const entry = this.cache.get(key);\n\n if (!entry) return null;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return null;\n }\n\n entry.accessCount++;\n entry.lastAccessedAt = Date.now();\n\n return entry.response;\n }\n\n has(key: string): boolean {\n const entry = this.cache.get(key);\n\n if (!entry) return false;\n\n // Check if expired\n if (entry.expiresAt && Date.now() >= entry.expiresAt) {\n this.cache.delete(key);\n return false;\n }\n\n return true;\n }\n\n delete(key: string): void {\n this.cache.delete(key);\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n size(): number {\n return this.cache.size;\n }\n\n destroy(): void {\n if (this.cleanupInterval) {\n clearInterval(this.cleanupInterval);\n this.cleanupInterval = null;\n }\n this.cache.clear();\n }\n\n private startCleanup(): void {\n this.cleanupInterval = setInterval(() => {\n const now = Date.now();\n\n for (const [key, entry] of this.cache.entries()) {\n if (entry.expiresAt && now >= entry.expiresAt) {\n this.cache.delete(key);\n }\n }\n }, 60000);\n }\n}\n\n/**\n * Create a cache instance\n */\nexport function createCache(config: CacheConfig) {\n let cache: MemoryCache | LRUCache | TTLCache;\n\n switch (config.strategy) {\n case \"memory\":\n cache = new MemoryCache();\n break;\n case \"lru\":\n cache = new LRUCache(config.maxSize || 100);\n break;\n case \"ttl\":\n cache = new TTLCache(config.ttl || 300000);\n break;\n default:\n cache = new MemoryCache();\n }\n\n const keyGenerator = config.keyGenerator || ((input: string) => `cache_${hashString(input)}`);\n\n return {\n /**\n * Get cached response\n */\n get(input: string, context?: Record<string, unknown>): AgentResponse | null {\n const key = keyGenerator(input, context);\n return cache.get(key);\n },\n\n /**\n * Set cached response\n */\n set(input: string, response: AgentResponse, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.set(key, response);\n },\n\n /**\n * Check if cached\n */\n has(input: string, context?: Record<string, unknown>): boolean {\n const key = keyGenerator(input, context);\n return cache.has(key);\n },\n\n /**\n * Delete cached entry\n */\n delete(input: string, context?: Record<string, unknown>): void {\n const key = keyGenerator(input, context);\n cache.delete(key);\n },\n\n /**\n * Clear all cache\n */\n clear(): void {\n cache.clear();\n },\n\n /**\n * Get cache size\n */\n size(): number {\n return cache.size();\n },\n };\n}\n\n/**\n * Simple string hash function\n */\nfunction hashString(str: string): string {\n let hash = 0;\n\n for (let i = 0; i < str.length; i++) {\n const char = str.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32-bit integer\n }\n\n return Math.abs(hash).toString(36);\n}\n\n/**\n * Cache middleware for agents\n */\nexport function cacheMiddleware(config: CacheConfig) {\n const cache = createCache(config);\n\n return async (\n context: Record<string, unknown>,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n // Check cache\n const cached = cache.get(inputString, context);\n\n if (cached) {\n return {\n ...cached,\n metadata: {\n ...cached.metadata,\n fromCache: true,\n cachedAt: Date.now(),\n },\n };\n }\n\n // Execute and cache\n const result = await next();\n cache.set(inputString, result, context);\n\n return result;\n };\n}\n", "export interface GlobalWithDeno {\n Deno?: {\n env: {\n get(key: string): string | undefined;\n };\n };\n}\n\nexport interface GlobalWithProcess {\n process?: {\n env: Record<string, string | undefined>;\n version?: string;\n versions?: Record<string, string>;\n };\n}\n\nexport interface GlobalWithBun {\n Bun?: {\n version: string;\n };\n}\n\nexport function hasDenoRuntime(global: unknown): global is GlobalWithDeno {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Deno\" in global &&\n typeof (global as GlobalWithDeno).Deno?.env?.get === \"function\"\n );\n}\n\nexport function hasNodeProcess(global: unknown): global is GlobalWithProcess {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"process\" in global &&\n typeof (global as GlobalWithProcess).process?.env === \"object\"\n );\n}\n\nexport function hasBunRuntime(global: unknown): global is GlobalWithBun {\n return (\n typeof global === \"object\" &&\n global !== null &&\n \"Bun\" in global &&\n typeof (global as GlobalWithBun).Bun !== \"undefined\"\n );\n}\n", "import type { GlobalWithDeno, GlobalWithProcess } from \"../runtime-guards.ts\";\nimport { hasDenoRuntime, hasNodeProcess } from \"../runtime-guards.ts\";\n\nexport function getEnvironmentVariable(name: string): string | undefined {\n try {\n if (typeof Deno !== \"undefined\" && hasDenoRuntime(globalThis)) {\n const value = (globalThis as GlobalWithDeno).Deno?.env.get(name);\n return value === \"\" ? undefined : value;\n }\n if (hasNodeProcess(globalThis)) {\n const value = (globalThis as GlobalWithProcess).process?.env[name];\n return value === \"\" ? undefined : value;\n }\n } catch {\n return undefined;\n }\n return undefined;\n}\n\nexport function isTestEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"test\";\n}\n\nexport function isProductionEnvironment(): boolean {\n return getEnvironmentVariable(\"NODE_ENV\") === \"production\";\n}\n\nexport function isDevelopmentEnvironment(): boolean {\n const env = getEnvironmentVariable(\"NODE_ENV\");\n return env === \"development\" || env === undefined;\n}\n", "import { getEnvironmentVariable } from \"./env.ts\";\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n}\n\nexport interface Logger {\n debug(message: string, ...args: unknown[]): void;\n info(message: string, ...args: unknown[]): void;\n warn(message: string, ...args: unknown[]): void;\n error(message: string, ...args: unknown[]): void;\n time<T>(label: string, fn: () => Promise<T>): Promise<T>;\n}\n\nconst originalConsole = {\n debug: console.debug,\n log: console.log,\n warn: console.warn,\n error: console.error,\n};\n\nlet cachedLogLevel: LogLevel | undefined;\n\nfunction resolveLogLevel(force = false): LogLevel {\n if (force || cachedLogLevel === undefined) {\n cachedLogLevel = getDefaultLevel();\n }\n return cachedLogLevel;\n}\n\nclass ConsoleLogger implements Logger {\n constructor(\n private prefix: string,\n private level: LogLevel = resolveLogLevel(),\n ) {}\n\n setLevel(level: LogLevel): void {\n this.level = level;\n }\n\n getLevel(): LogLevel {\n return this.level;\n }\n\n debug(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.DEBUG) {\n console.debug(`[${this.prefix}] DEBUG: ${message}`, ...args);\n }\n }\n\n info(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.INFO) {\n console.log(`[${this.prefix}] ${message}`, ...args);\n }\n }\n\n warn(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.WARN) {\n console.warn(`[${this.prefix}] WARN: ${message}`, ...args);\n }\n }\n\n error(message: string, ...args: unknown[]): void {\n if (this.level <= LogLevel.ERROR) {\n console.error(`[${this.prefix}] ERROR: ${message}`, ...args);\n }\n }\n\n async time<T>(label: string, fn: () => Promise<T>): Promise<T> {\n const start = performance.now();\n try {\n const result = await fn();\n const end = performance.now();\n this.debug(`${label} completed in ${(end - start).toFixed(2)}ms`);\n return result;\n } catch (error) {\n const end = performance.now();\n this.error(`${label} failed after ${(end - start).toFixed(2)}ms`, error);\n throw error;\n }\n }\n}\n\nfunction parseLogLevel(levelString: string | undefined): LogLevel | undefined {\n if (!levelString) return undefined;\n const upper = levelString.toUpperCase();\n switch (upper) {\n case \"DEBUG\":\n return LogLevel.DEBUG;\n case \"WARN\":\n return LogLevel.WARN;\n case \"ERROR\":\n return LogLevel.ERROR;\n case \"INFO\":\n return LogLevel.INFO;\n default:\n return undefined;\n }\n}\n\nconst getDefaultLevel = (): LogLevel => {\n const envLevel = getEnvironmentVariable(\"LOG_LEVEL\");\n const parsedLevel = parseLogLevel(envLevel);\n if (parsedLevel !== undefined) return parsedLevel;\n\n const debugFlag = getEnvironmentVariable(\"VERYFRONT_DEBUG\");\n if (debugFlag === \"1\" || debugFlag === \"true\") return LogLevel.DEBUG;\n\n return LogLevel.INFO;\n};\n\nconst trackedLoggers = new Set<ConsoleLogger>();\n\nfunction createLogger(prefix: string): ConsoleLogger {\n const logger = new ConsoleLogger(prefix);\n trackedLoggers.add(logger);\n return logger;\n}\n\nexport const cliLogger = createLogger(\"CLI\");\nexport const serverLogger = createLogger(\"SERVER\");\nexport const rendererLogger = createLogger(\"RENDERER\");\nexport const bundlerLogger = createLogger(\"BUNDLER\");\nexport const agentLogger = createLogger(\"AGENT\");\n\nexport const logger = createLogger(\"VERYFRONT\");\n\ntype LoggerResetOptions = {\n restoreConsole?: boolean;\n};\n\nexport function __loggerResetForTests(options: LoggerResetOptions = {}): void {\n const updatedLevel = resolveLogLevel(true);\n for (const instance of trackedLoggers) {\n instance.setLevel(updatedLevel);\n }\n\n if (options.restoreConsole) {\n console.debug = originalConsole.debug;\n console.log = originalConsole.log;\n console.warn = originalConsole.warn;\n console.error = originalConsole.error;\n }\n}\n", "/**\n * Cost Tracking System\n *\n * Track API usage and costs for monitoring and billing.\n */\n\nimport type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { agentLogger } from \"@veryfront/utils/logger/logger.ts\";\n\nexport interface CostConfig {\n /** Provider pricing (per 1M tokens) */\n pricing: {\n [provider: string]: {\n input: number; // Cost per 1M input tokens\n output: number; // Cost per 1M output tokens\n };\n };\n\n /** Budget limits */\n limits?: {\n daily?: number;\n monthly?: number;\n };\n\n /** Callback when limit exceeded */\n onLimitExceeded?: (usage: UsageSummary) => void;\n}\n\nexport interface UsageRecord {\n /** Timestamp */\n timestamp: number;\n\n /** Agent ID */\n agentId: string;\n\n /** Model used */\n model: string;\n\n /** Provider */\n provider: string;\n\n /** Token usage */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Estimated cost */\n cost: number;\n\n /** User/session identifier */\n userId?: string;\n}\n\nexport interface UsageSummary {\n /** Total requests */\n requests: number;\n\n /** Total tokens */\n tokens: {\n prompt: number;\n completion: number;\n total: number;\n };\n\n /** Total cost */\n cost: number;\n\n /** Cost by provider */\n byProvider: Record<\n string,\n {\n requests: number;\n tokens: number;\n cost: number;\n }\n >;\n\n /** Period */\n period: {\n start: number;\n end: number;\n };\n}\n\n/**\n * Cost Tracker\n */\nclass CostTracker {\n private records: UsageRecord[] = [];\n private config: CostConfig;\n private dailyTotal = 0;\n private monthlyTotal = 0;\n private lastDayReset = Date.now();\n private lastMonthReset = Date.now();\n private resetInterval: ReturnType<typeof setInterval> | null = null;\n\n constructor(config: CostConfig) {\n this.config = config;\n this.startPeriodicReset();\n }\n\n /**\n * Track an agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n if (!response.usage) {\n agentLogger.warn(\"No usage data in response, cannot track costs\");\n return this.createEmptyRecord(agentId, model);\n }\n\n // Parse provider from model string\n const provider = model.split(\"/\")[0] || \"unknown\";\n\n // Calculate cost\n const cost = this.calculateCost(\n provider,\n response.usage.promptTokens,\n response.usage.completionTokens,\n );\n\n // Create record\n const record: UsageRecord = {\n timestamp: Date.now(),\n agentId,\n model,\n provider,\n tokens: {\n prompt: response.usage.promptTokens,\n completion: response.usage.completionTokens,\n total: response.usage.totalTokens,\n },\n cost,\n userId,\n };\n\n // Add to records\n this.records.push(record);\n\n // Update totals\n this.dailyTotal += cost;\n this.monthlyTotal += cost;\n\n // Check limits\n this.checkLimits();\n\n return record;\n }\n\n /**\n * Calculate cost based on token usage\n */\n private calculateCost(\n provider: string,\n inputTokens: number,\n outputTokens: number,\n ): number {\n const pricing = this.config.pricing[provider];\n\n if (!pricing) {\n agentLogger.warn(`No pricing configured for provider: ${provider}`);\n return 0;\n }\n\n const inputCost = (inputTokens / 1_000_000) * pricing.input;\n const outputCost = (outputTokens / 1_000_000) * pricing.output;\n\n return inputCost + outputCost;\n }\n\n /**\n * Get usage summary for a period\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n const start = startTime || 0;\n const end = endTime || Date.now();\n\n const relevantRecords = this.records.filter(\n (r) => r.timestamp >= start && r.timestamp <= end,\n );\n\n const summary: UsageSummary = {\n requests: relevantRecords.length,\n tokens: {\n prompt: 0,\n completion: 0,\n total: 0,\n },\n cost: 0,\n byProvider: {},\n period: { start, end },\n };\n\n for (const record of relevantRecords) {\n summary.tokens.prompt += record.tokens.prompt;\n summary.tokens.completion += record.tokens.completion;\n summary.tokens.total += record.tokens.total;\n summary.cost += record.cost;\n\n if (!summary.byProvider[record.provider]) {\n summary.byProvider[record.provider] = {\n requests: 0,\n tokens: 0,\n cost: 0,\n };\n }\n\n const providerStats = summary.byProvider[record.provider]!;\n providerStats.requests++;\n providerStats.tokens += record.tokens.total;\n providerStats.cost += record.cost;\n }\n\n return summary;\n }\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n const now = Date.now();\n const dayStart = now - 24 * 60 * 60 * 1000;\n return this.getSummary(dayStart, now);\n }\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n const now = Date.now();\n const monthStart = now - 30 * 24 * 60 * 60 * 1000;\n return this.getSummary(monthStart, now);\n }\n\n /**\n * Check if limits are exceeded\n */\n private checkLimits(): void {\n if (this.config.limits?.daily && this.dailyTotal > this.config.limits.daily) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getDailySummary());\n }\n }\n\n if (\n this.config.limits?.monthly &&\n this.monthlyTotal > this.config.limits.monthly\n ) {\n if (this.config.onLimitExceeded) {\n this.config.onLimitExceeded(this.getMonthlySummary());\n }\n }\n }\n\n private startPeriodicReset(): void {\n this.resetInterval = setInterval(() => {\n const now = Date.now();\n\n if (now - this.lastDayReset >= 24 * 60 * 60 * 1000) {\n this.dailyTotal = 0;\n this.lastDayReset = now;\n }\n\n if (now - this.lastMonthReset >= 30 * 24 * 60 * 60 * 1000) {\n this.monthlyTotal = 0;\n this.lastMonthReset = now;\n }\n }, 60000);\n }\n\n destroy(): void {\n if (this.resetInterval) {\n clearInterval(this.resetInterval);\n this.resetInterval = null;\n }\n this.records = [];\n }\n\n /**\n * Create empty record\n */\n private createEmptyRecord(agentId: string, model: string): UsageRecord {\n return {\n timestamp: Date.now(),\n agentId,\n model,\n provider: model.split(\"/\")[0] || \"unknown\",\n tokens: { prompt: 0, completion: 0, total: 0 },\n cost: 0,\n };\n }\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return [...this.records];\n }\n\n /**\n * Clear all records\n */\n clear(): void {\n this.records = [];\n this.dailyTotal = 0;\n this.monthlyTotal = 0;\n }\n}\n\n/**\n * Create a cost tracker\n */\nexport function createCostTracker(config: CostConfig) {\n const tracker = new CostTracker(config);\n\n return {\n /**\n * Track agent response\n */\n track(\n agentId: string,\n model: string,\n response: AgentResponse,\n userId?: string,\n ): UsageRecord {\n return tracker.track(agentId, model, response, userId);\n },\n\n /**\n * Get usage summary\n */\n getSummary(startTime?: number, endTime?: number): UsageSummary {\n return tracker.getSummary(startTime, endTime);\n },\n\n /**\n * Get daily summary\n */\n getDailySummary(): UsageSummary {\n return tracker.getDailySummary();\n },\n\n /**\n * Get monthly summary\n */\n getMonthlySummary(): UsageSummary {\n return tracker.getMonthlySummary();\n },\n\n /**\n * Get all records\n */\n getAllRecords(): UsageRecord[] {\n return tracker.getAllRecords();\n },\n\n /**\n * Clear all data\n */\n clear(): void {\n tracker.clear();\n },\n };\n}\n\n/**\n * Cost tracking middleware for agents\n */\nexport function costTrackingMiddleware(config: CostConfig) {\n const tracker = createCostTracker(config);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n const result = await next();\n\n // Track cost\n tracker.track(\n context.agentId,\n context.model || \"unknown\",\n result,\n (context.data as Record<string, unknown>)?.userId as string | undefined,\n );\n\n return result;\n };\n}\n", "import type { AgentContext, AgentResponse } from \"../../types/agent.ts\";\nimport { createError, toError } from \"../../../core/errors/veryfront-error.ts\";\n/**\n * Input Validation and Output Filtering\n *\n * Security features to prevent prompt injection, data leakage, and harmful content.\n */\n\nexport interface SecurityConfig {\n /** Input validation rules */\n input?: {\n /** Maximum input length */\n maxLength?: number;\n\n /** Blocked patterns (regex) */\n blockedPatterns?: RegExp[];\n\n /** Sanitize input */\n sanitize?: boolean;\n\n /** Custom validator */\n validate?: (input: string) => boolean | Promise<boolean>;\n };\n\n /** Output filtering rules */\n output?: {\n /** Blocked patterns in output */\n blockedPatterns?: RegExp[];\n\n /** Filter PII (Personal Identifiable Information) */\n filterPII?: boolean;\n\n /** Custom filter */\n filter?: (output: string) => string | Promise<string>;\n };\n\n /** Action when violation detected */\n onViolation?: (violation: SecurityViolation) => void;\n}\n\nexport interface SecurityViolation {\n /** Violation type */\n type: \"input\" | \"output\";\n\n /** Violation reason */\n reason: string;\n\n /** Original content */\n content: string;\n\n /** Matched pattern (if any) */\n pattern?: RegExp;\n}\n\n/**\n * Common blocked patterns\n */\nexport const COMMON_BLOCKED_PATTERNS = {\n /** Prompt injection attempts */\n promptInjection: [\n /ignore\\s+previous\\s+instructions/i,\n /ignore\\s+all\\s+previous\\s+prompts/i,\n /you\\s+are\\s+now\\s+a/i,\n /pretend\\s+you\\s+are/i,\n /system:\\s*/i,\n /<\\|im_start\\|>/i,\n /<\\|im_end\\|>/i,\n ],\n\n /** Potential data exfiltration */\n dataExfiltration: [\n /password/i,\n /api[_\\s-]?key/i,\n /secret/i,\n /token/i,\n /credit\\s+card/i,\n ],\n\n /** SQL injection patterns */\n sqlInjection: [\n /(\\bUNION\\b|\\bSELECT\\b).*\\bFROM\\b/i,\n /;\\s*(DROP|DELETE|UPDATE|INSERT)/i,\n ],\n\n /** XSS patterns */\n xss: [\n /<script[^>]*>.*?<\\/script>/gi,\n /javascript:/i,\n /on\\w+\\s*=/i, // Event handlers\n ],\n};\n\n/**\n * PII patterns (email, phone, SSN, etc.)\n */\nconst PII_PATTERNS = {\n email: /\\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\\.[A-Z]{2,}\\b/gi,\n phone: /\\b(\\+\\d{1,3}[-.\\s]?)?\\(?\\d{3}\\)?[-.\\s]?\\d{3}[-.\\s]?\\d{4}\\b/g,\n ssn: /\\b\\d{3}-\\d{2}-\\d{4}\\b/g,\n creditCard: /\\b\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}[-\\s]?\\d{4}\\b/g,\n};\n\n/**\n * Input Validator\n */\nexport class InputValidator {\n private config: SecurityConfig[\"input\"];\n\n constructor(config?: SecurityConfig[\"input\"]) {\n this.config = config || {};\n }\n\n /**\n * Validate input\n */\n async validate(input: string): Promise<{\n valid: boolean;\n sanitized?: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n\n // Check length\n if (this.config?.maxLength && input.length > this.config.maxLength) {\n violations.push({\n type: \"input\",\n reason: `Input exceeds maximum length of ${this.config.maxLength}`,\n content: input.substring(0, 100) + \"...\",\n });\n }\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(input)) {\n violations.push({\n type: \"input\",\n reason: \"Input matches blocked pattern\",\n content: input,\n pattern,\n });\n }\n }\n }\n\n // Custom validation\n if (this.config?.validate) {\n const customValid = await this.config.validate(input);\n if (!customValid) {\n violations.push({\n type: \"input\",\n reason: \"Custom validation failed\",\n content: input,\n });\n }\n }\n\n // Sanitize if requested\n let sanitized = input;\n if (this.config?.sanitize) {\n sanitized = this.sanitizeInput(input);\n }\n\n return {\n valid: violations.length === 0,\n sanitized: this.config?.sanitize ? sanitized : undefined,\n violations,\n };\n }\n\n /**\n * Sanitize input (remove potentially harmful content)\n */\n private sanitizeInput(input: string): string {\n let sanitized = input;\n\n // Remove script tags\n sanitized = sanitized.replace(/<script[^>]*>.*?<\\/script>/gi, \"\");\n\n // Remove event handlers\n sanitized = sanitized.replace(/on\\w+\\s*=\\s*[\"'][^\"']*[\"']/gi, \"\");\n\n // Remove javascript: protocol\n sanitized = sanitized.replace(/javascript:/gi, \"\");\n\n return sanitized;\n }\n}\n\n/**\n * Output Filter\n */\nexport class OutputFilter {\n private config: SecurityConfig[\"output\"];\n\n constructor(config?: SecurityConfig[\"output\"]) {\n this.config = config || {};\n }\n\n /**\n * Filter output\n */\n async filter(output: string): Promise<{\n filtered: string;\n violations: SecurityViolation[];\n }> {\n const violations: SecurityViolation[] = [];\n let filtered = output;\n\n // Check blocked patterns\n if (this.config?.blockedPatterns) {\n for (const pattern of this.config.blockedPatterns) {\n if (pattern.test(filtered)) {\n violations.push({\n type: \"output\",\n reason: \"Output contains blocked pattern\",\n content: filtered,\n pattern,\n });\n\n // Redact matched content\n filtered = filtered.replace(pattern, \"[REDACTED]\");\n }\n }\n }\n\n // Filter PII\n if (this.config?.filterPII) {\n filtered = this.filterPII(filtered);\n }\n\n // Custom filter\n if (this.config?.filter) {\n filtered = await this.config.filter(filtered);\n }\n\n return { filtered, violations };\n }\n\n /**\n * Filter PII from output\n */\n private filterPII(output: string): string {\n let filtered = output;\n\n // Replace email addresses\n filtered = filtered.replace(PII_PATTERNS.email, \"[EMAIL]\");\n\n // Replace phone numbers\n filtered = filtered.replace(PII_PATTERNS.phone, \"[PHONE]\");\n\n // Replace SSN\n filtered = filtered.replace(PII_PATTERNS.ssn, \"[SSN]\");\n\n // Replace credit card numbers\n filtered = filtered.replace(PII_PATTERNS.creditCard, \"[CREDIT_CARD]\");\n\n return filtered;\n }\n}\n\n/**\n * Create security middleware for agents\n */\nexport function securityMiddleware(config: SecurityConfig) {\n const inputValidator = new InputValidator(config.input);\n const outputFilter = new OutputFilter(config.output);\n\n return async (\n context: AgentContext,\n next: () => Promise<AgentResponse>,\n ): Promise<AgentResponse> => {\n // Validate input\n const inputString = typeof context.input === \"string\"\n ? context.input\n : JSON.stringify(context.input);\n\n const inputValidation = await inputValidator.validate(inputString);\n\n if (!inputValidation.valid) {\n // Report violations\n inputValidation.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n\n const firstViolation = inputValidation.violations[0];\n throw toError(createError({\n type: \"agent\",\n message: `Input validation failed: ${firstViolation?.reason || \"Unknown reason\"}`,\n }));\n }\n\n // Execute with sanitized input if applicable\n if (inputValidation.sanitized) {\n context.input = inputValidation.sanitized;\n }\n\n // Execute\n const result = await next();\n\n // Filter output\n const outputFiltering = await outputFilter.filter(result.text);\n\n if (outputFiltering.violations.length > 0) {\n // Report violations\n outputFiltering.violations.forEach((v) => {\n if (config.onViolation) {\n config.onViolation(v);\n }\n });\n }\n\n // Return filtered result\n return {\n ...result,\n text: outputFiltering.filtered,\n };\n };\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["logger"]
|
|
7
7
|
}
|