veryfront 0.0.64 → 0.0.65

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.
@@ -1,3 +1,30 @@
1
+ // src/_shims/deno-env.ts
2
+ var denoEnvShim = {
3
+ get(key) {
4
+ return process.env[key];
5
+ },
6
+ set(key, value) {
7
+ process.env[key] = value;
8
+ },
9
+ delete(key) {
10
+ delete process.env[key];
11
+ },
12
+ has(key) {
13
+ return key in process.env;
14
+ },
15
+ toObject() {
16
+ return { ...process.env };
17
+ }
18
+ };
19
+ if (typeof globalThis.Deno === "undefined") {
20
+ globalThis.Deno = {
21
+ env: denoEnvShim,
22
+ cwd: () => process.cwd()
23
+ };
24
+ } else if (typeof globalThis.Deno.env === "undefined") {
25
+ globalThis.Deno.env = denoEnvShim;
26
+ }
27
+
1
28
  // src/ai/react/primitives/chat-container.tsx
2
29
  import * as React from "react";
3
30
  import { jsx } from "react/jsx-runtime";
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../../src/ai/react/primitives/chat-container.tsx", "../../../src/ai/react/primitives/message-list.tsx", "../../../src/ai/react/primitives/input-box.tsx", "../../../src/ai/react/primitives/agent-primitives.tsx", "../../../src/ai/react/primitives/tool-primitives.tsx"],
4
- "sourcesContent": ["/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { Message } from \"../../types/agent.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: Message[\"role\"];\n\n /** Message content (can be children or prop) */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading/streaming state - shows stop button */\n isLoading?: boolean;\n\n /** Whether input has text - determines voice vs submit icon */\n hasInput?: boolean;\n\n /** Handler for stop action */\n onStop?: () => void;\n\n /** Handler for voice input */\n onVoice?: () => void;\n\n /** Custom icons */\n icons?: {\n submit?: React.ReactNode;\n stop?: React.ReactNode;\n voice?: React.ReactNode;\n };\n\n children?: React.ReactNode;\n}\n\n/** Default submit icon (paper plane) */\nconst SubmitIcon = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\n/** Default stop icon (square) */\nconst StopIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n\n/** Default voice icon (microphone) */\nconst VoiceIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n);\n\n/**\n * SubmitButton - Smart submit button with three states\n *\n * States:\n * 1. **Voice** (no input): Shows microphone icon, triggers onVoice\n * 2. **Submit** (has input): Shows arrow icon, submits form\n * 3. **Stop** (loading): Shows stop icon, triggers onStop\n *\n * @example\n * ```tsx\n * <SubmitButton\n * hasInput={!!input.trim()}\n * isLoading={isLoading}\n * onStop={stop}\n * onVoice={() => console.log('Voice input')}\n * className=\"w-9 h-9 bg-blue-500 text-white rounded-full\"\n * />\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>((\n { className, isLoading, hasInput, onStop, onVoice, icons, disabled, children, ...props },\n ref,\n) => {\n // Determine button state and behavior\n const showStop = isLoading;\n const showVoice = !isLoading && !hasInput && onVoice;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (showStop && onStop) {\n e.preventDefault();\n onStop();\n } else if (showVoice && onVoice) {\n e.preventDefault();\n onVoice();\n }\n // For submit, let form handle it naturally\n };\n\n // Determine icon to show\n let icon: React.ReactNode;\n let ariaLabel: string;\n\n if (showStop) {\n icon = icons?.stop || <StopIcon />;\n ariaLabel = \"Stop generating\";\n } else if (showVoice) {\n icon = icons?.voice || <VoiceIcon />;\n ariaLabel = \"Voice input\";\n } else {\n icon = icons?.submit || <SubmitIcon />;\n ariaLabel = \"Send message\";\n }\n\n return (\n <button\n ref={ref}\n type={showStop || showVoice ? \"button\" : \"submit\"}\n className={className}\n disabled={disabled && !showStop}\n onClick={handleClick}\n data-submit-button=\"\"\n data-state={showStop ? \"stop\" : showVoice ? \"voice\" : \"submit\"}\n data-loading={isLoading}\n aria-label={ariaLabel}\n {...props}\n >\n {children || icon}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { ToolCall } from \"../../types/agent.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args?: Record<string, unknown>;\n\n /** Tool status */\n status?: ToolCall[\"status\"];\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={tool.name}\n * args={tool.args}\n * status={tool.status}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>(({ className, name, args, status, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-status={status}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {status && <span data-tool-status=\"\">({status})</span>}\n </div>\n\n {args && (\n <div data-tool-args=\"\">\n <pre>{JSON.stringify(args, null, 2)}</pre>\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool result data */\n result: unknown;\n\n /** Custom renderer */\n renderResult?: (result: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display\n *\n * @example\n * ```tsx\n * <ToolResult\n * result={tool.result}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, result, renderResult, ...props }, ref) => {\n const content = renderResult ? renderResult(result) : JSON.stringify(result, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n\n /** Render each tool */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * ToolList - Display list of tool calls\n *\n * @example\n * ```tsx\n * <ToolList\n * toolCalls={agent.toolCalls}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation {...tool}>\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, toolCalls, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {toolCalls.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.id}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.id}\n name={tool.name}\n args={tool.args}\n status={tool.status}\n >\n {tool.result !== undefined && <ToolResult result={tool.result} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n"],
5
- "mappings": "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",
3
+ "sources": ["../../../src/_shims/deno-env.ts", "../../../src/ai/react/primitives/chat-container.tsx", "../../../src/ai/react/primitives/message-list.tsx", "../../../src/ai/react/primitives/input-box.tsx", "../../../src/ai/react/primitives/agent-primitives.tsx", "../../../src/ai/react/primitives/tool-primitives.tsx"],
4
+ "sourcesContent": ["/**\n * Shim for Deno.env.get() to work in Node.js\n * This provides a proper function that reads from process.env\n */\n\n// Create a shim that matches Deno.env.get(key) signature\nconst denoEnvShim = {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n};\n\n// Assign to globalThis.Deno if it doesn't exist\nif (typeof globalThis.Deno === \"undefined\") {\n (globalThis as any).Deno = {\n env: denoEnvShim,\n cwd: () => process.cwd(),\n };\n} else if (typeof (globalThis as any).Deno.env === \"undefined\") {\n (globalThis as any).Deno.env = denoEnvShim;\n}\n\nexport { denoEnvShim };\n", "/**\n * ChatContainer Primitive - Layer 2 (Unstyled)\n *\n * Root container for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface ChatContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * ChatContainer - Root chat component\n *\n * Provides minimal structure. Bring your own styles.\n *\n * @example\n * ```tsx\n * <ChatContainer className=\"flex flex-col h-screen\">\n * <YourHeader />\n * <MessageList messages={messages} />\n * <YourInput />\n * </ChatContainer>\n * ```\n */\nexport const ChatContainer = React.forwardRef<HTMLDivElement, ChatContainerProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-chat-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nChatContainer.displayName = \"ChatContainer\";\n", "/**\n * MessageList & MessageItem Primitives - Layer 2 (Unstyled)\n *\n * Message rendering primitives.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { Message } from \"../../types/agent.ts\";\n\nexport interface MessageListProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageList - Container for messages\n *\n * @example\n * ```tsx\n * <MessageList className=\"flex-1 overflow-y-auto space-y-4\">\n * {messages.map((msg) => (\n * <MessageItem key={msg.id} role={msg.role}>\n * {msg.content}\n * </MessageItem>\n * ))}\n * </MessageList>\n * ```\n */\nexport const MessageList = React.forwardRef<HTMLDivElement, MessageListProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-list=\"\"\n role=\"log\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n },\n);\n\nMessageList.displayName = \"MessageList\";\n\nexport interface MessageItemProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Message role */\n role: Message[\"role\"];\n\n /** Message content (can be children or prop) */\n content?: string;\n\n children?: React.ReactNode;\n}\n\n/**\n * MessageItem - Individual message\n *\n * @example\n * ```tsx\n * <MessageItem role=\"user\" className=\"flex justify-end\">\n * <div className=\"bg-blue-500 text-white rounded-lg px-4 py-2\">\n * {message.content}\n * </div>\n * </MessageItem>\n * ```\n */\nexport const MessageItem = React.forwardRef<HTMLDivElement, MessageItemProps>(\n ({ className, role, content, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-item=\"\"\n data-role={role}\n {...props}\n >\n {children || content}\n </div>\n );\n },\n);\n\nMessageItem.displayName = \"MessageItem\";\n\nexport interface MessageRoleProps extends React.HTMLAttributes<HTMLSpanElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageRole - Role indicator\n *\n * @example\n * ```tsx\n * <MessageRole className=\"font-semibold text-sm\">\n * {message.role}\n * </MessageRole>\n * ```\n */\nexport const MessageRole = React.forwardRef<HTMLSpanElement, MessageRoleProps>(\n ({ className, children, ...props }, ref) => {\n return (\n <span\n ref={ref}\n className={className}\n data-message-role=\"\"\n {...props}\n >\n {children}\n </span>\n );\n },\n);\n\nMessageRole.displayName = \"MessageRole\";\n\nexport interface MessageContentProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * MessageContent - Message content wrapper\n *\n * @example\n * ```tsx\n * <MessageContent className=\"prose\">\n * {message.content}\n * </MessageContent>\n * ```\n */\nexport const MessageContent = React.forwardRef<\n HTMLDivElement,\n MessageContentProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-message-content=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nMessageContent.displayName = \"MessageContent\";\n", "/**\n * InputBox & SubmitButton Primitives - Layer 2 (Unstyled)\n *\n * Input primitives for chat interfaces.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\n\nexport interface InputBoxProps extends\n Omit<\n React.InputHTMLAttributes<HTMLInputElement | HTMLTextAreaElement>,\n \"onChange\" | \"onSubmit\"\n > {\n /** Current value */\n value: string;\n\n /** Change handler */\n onChange: (e: React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement>) => void;\n\n /** Submit handler */\n onSubmit?: () => void;\n\n /** Use textarea instead of input */\n multiline?: boolean;\n}\n\n/**\n * InputBox - Text input primitive\n *\n * @example\n * ```tsx\n * <InputBox\n * value={input}\n * onChange={(e) => setInput(e.target.value)}\n * onSubmit={handleSubmit}\n * placeholder=\"Type a message...\"\n * className=\"w-full px-4 py-2 border rounded-lg\"\n * />\n * ```\n */\nexport const InputBox = React.forwardRef<\n HTMLInputElement | HTMLTextAreaElement,\n InputBoxProps\n>(({ className, value, onChange, onSubmit, multiline, ...props }, ref) => {\n const handleKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement | HTMLTextAreaElement>,\n ) => {\n if (e.key === \"Enter\" && !e.shiftKey && onSubmit) {\n e.preventDefault();\n onSubmit();\n }\n };\n\n if (multiline) {\n return (\n <textarea\n ref={ref as React.Ref<HTMLTextAreaElement>}\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n data-multiline=\"true\"\n rows={3}\n {...(props as React.TextareaHTMLAttributes<HTMLTextAreaElement>)}\n />\n );\n }\n\n return (\n <input\n ref={ref as React.Ref<HTMLInputElement>}\n type=\"text\"\n className={className}\n value={value}\n onChange={onChange}\n onKeyDown={handleKeyDown}\n data-input-box=\"\"\n {...props}\n />\n );\n});\n\nInputBox.displayName = \"InputBox\";\n\nexport interface SubmitButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Loading/streaming state - shows stop button */\n isLoading?: boolean;\n\n /** Whether input has text - determines voice vs submit icon */\n hasInput?: boolean;\n\n /** Handler for stop action */\n onStop?: () => void;\n\n /** Handler for voice input */\n onVoice?: () => void;\n\n /** Custom icons */\n icons?: {\n submit?: React.ReactNode;\n stop?: React.ReactNode;\n voice?: React.ReactNode;\n };\n\n children?: React.ReactNode;\n}\n\n/** Default submit icon (paper plane) */\nconst SubmitIcon = () => (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path d=\"M2.01 21L23 12 2.01 3 2 10l15 2-15 2z\" />\n </svg>\n);\n\n/** Default stop icon (square) */\nconst StopIcon = () => (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"2\" />\n </svg>\n);\n\n/** Default voice icon (microphone) */\nconst VoiceIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 2a3 3 0 0 0-3 3v7a3 3 0 0 0 6 0V5a3 3 0 0 0-3-3Z\" />\n <path d=\"M19 10v2a7 7 0 0 1-14 0v-2\" />\n <line x1=\"12\" x2=\"12\" y1=\"19\" y2=\"22\" />\n </svg>\n);\n\n/**\n * SubmitButton - Smart submit button with three states\n *\n * States:\n * 1. **Voice** (no input): Shows microphone icon, triggers onVoice\n * 2. **Submit** (has input): Shows arrow icon, submits form\n * 3. **Stop** (loading): Shows stop icon, triggers onStop\n *\n * @example\n * ```tsx\n * <SubmitButton\n * hasInput={!!input.trim()}\n * isLoading={isLoading}\n * onStop={stop}\n * onVoice={() => console.log('Voice input')}\n * className=\"w-9 h-9 bg-blue-500 text-white rounded-full\"\n * />\n * ```\n */\nexport const SubmitButton = React.forwardRef<\n HTMLButtonElement,\n SubmitButtonProps\n>((\n { className, isLoading, hasInput, onStop, onVoice, icons, disabled, children, ...props },\n ref,\n) => {\n // Determine button state and behavior\n const showStop = isLoading;\n const showVoice = !isLoading && !hasInput && onVoice;\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n if (showStop && onStop) {\n e.preventDefault();\n onStop();\n } else if (showVoice && onVoice) {\n e.preventDefault();\n onVoice();\n }\n // For submit, let form handle it naturally\n };\n\n // Determine icon to show\n let icon: React.ReactNode;\n let ariaLabel: string;\n\n if (showStop) {\n icon = icons?.stop || <StopIcon />;\n ariaLabel = \"Stop generating\";\n } else if (showVoice) {\n icon = icons?.voice || <VoiceIcon />;\n ariaLabel = \"Voice input\";\n } else {\n icon = icons?.submit || <SubmitIcon />;\n ariaLabel = \"Send message\";\n }\n\n return (\n <button\n ref={ref}\n type={showStop || showVoice ? \"button\" : \"submit\"}\n className={className}\n disabled={disabled && !showStop}\n onClick={handleClick}\n data-submit-button=\"\"\n data-state={showStop ? \"stop\" : showVoice ? \"voice\" : \"submit\"}\n data-loading={isLoading}\n aria-label={ariaLabel}\n {...props}\n >\n {children || icon}\n </button>\n );\n});\n\nSubmitButton.displayName = \"SubmitButton\";\n\nexport interface LoadingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * LoadingIndicator - Loading spinner primitive\n *\n * @example\n * ```tsx\n * {isLoading && (\n * <LoadingIndicator className=\"animate-spin h-4 w-4\" />\n * )}\n * ```\n */\nexport const LoadingIndicator = React.forwardRef<\n HTMLDivElement,\n LoadingIndicatorProps\n>(({ className, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-loading-indicator=\"\"\n role=\"status\"\n aria-label=\"Loading\"\n {...props}\n />\n );\n});\n\nLoadingIndicator.displayName = \"LoadingIndicator\";\n", "/**\n * Agent Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying agent status and execution.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { AgentStatus as AgentStatusType } from \"../../types/agent.ts\";\n\nexport interface AgentContainerProps extends React.HTMLAttributes<HTMLDivElement> {\n children: React.ReactNode;\n}\n\n/**\n * AgentContainer - Root agent UI container\n *\n * @example\n * ```tsx\n * <AgentContainer className=\"border rounded-lg p-4\">\n * <AgentStatus status={agent.status} />\n * <AgentMessages messages={agent.messages} />\n * </AgentContainer>\n * ```\n */\nexport const AgentContainer = React.forwardRef<\n HTMLDivElement,\n AgentContainerProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-agent-container=\"\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nAgentContainer.displayName = \"AgentContainer\";\n\nexport interface AgentStatusProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Current agent status */\n status: AgentStatusType;\n\n /** Custom label */\n label?: string;\n}\n\n/**\n * AgentStatus - Status indicator\n *\n * @example\n * ```tsx\n * <AgentStatus\n * status={agent.status}\n * className=\"text-sm font-medium\"\n * />\n * ```\n */\nexport const AgentStatus = React.forwardRef<HTMLDivElement, AgentStatusProps>(\n ({ className, status, label, ...props }, ref) => {\n const displayLabel = label || formatStatus(status);\n\n return (\n <div\n ref={ref}\n className={className}\n data-agent-status=\"\"\n data-status={status}\n role=\"status\"\n aria-label={`Agent status: ${displayLabel}`}\n {...props}\n >\n {displayLabel}\n </div>\n );\n },\n);\n\nAgentStatus.displayName = \"AgentStatus\";\n\nexport interface ThinkingIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Thinking text */\n children?: React.ReactNode;\n}\n\n/**\n * ThinkingIndicator - Shows when agent is thinking\n *\n * @example\n * ```tsx\n * {agent.thinking && (\n * <ThinkingIndicator className=\"italic text-gray-600\">\n * {agent.thinking}\n * </ThinkingIndicator>\n * )}\n * ```\n */\nexport const ThinkingIndicator = React.forwardRef<\n HTMLDivElement,\n ThinkingIndicatorProps\n>(({ className, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-thinking-indicator=\"\"\n role=\"status\"\n aria-live=\"polite\"\n {...props}\n >\n {children}\n </div>\n );\n});\n\nThinkingIndicator.displayName = \"ThinkingIndicator\";\n\n/**\n * Format status for display\n */\nfunction formatStatus(status: AgentStatusType): string {\n switch (status) {\n case \"idle\":\n return \"Idle\";\n case \"thinking\":\n return \"Thinking...\";\n case \"tool_execution\":\n return \"Using tools...\";\n case \"streaming\":\n return \"Responding...\";\n case \"completed\":\n return \"Completed\";\n case \"error\":\n return \"Error\";\n default:\n return String(status);\n }\n}\n", "/**\n * Tool Primitives - Layer 2 (Unstyled)\n *\n * Primitives for displaying tool invocations and results.\n * Built on Radix UI patterns (shadcn-compatible).\n */\n\nimport * as React from \"react\";\nimport type { ToolCall } from \"../../types/agent.ts\";\n\nexport interface ToolInvocationProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool name */\n name: string;\n\n /** Tool arguments */\n args?: Record<string, unknown>;\n\n /** Tool status */\n status?: ToolCall[\"status\"];\n\n children?: React.ReactNode;\n}\n\n/**\n * ToolInvocation - Tool call display\n *\n * @example\n * ```tsx\n * <ToolInvocation\n * name={tool.name}\n * args={tool.args}\n * status={tool.status}\n * className=\"border-l-4 border-blue-500 pl-4\"\n * >\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * ```\n */\nexport const ToolInvocation = React.forwardRef<\n HTMLDivElement,\n ToolInvocationProps\n>(({ className, name, args, status, children, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-invocation=\"\"\n data-tool-name={name}\n data-status={status}\n {...props}\n >\n <div data-tool-header=\"\">\n <span data-tool-name=\"\">{name}</span>\n {status && <span data-tool-status=\"\">({status})</span>}\n </div>\n\n {args && (\n <div data-tool-args=\"\">\n <pre>{JSON.stringify(args, null, 2)}</pre>\n </div>\n )}\n\n {children}\n </div>\n );\n});\n\nToolInvocation.displayName = \"ToolInvocation\";\n\nexport interface ToolResultProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool result data */\n result: unknown;\n\n /** Custom renderer */\n renderResult?: (result: unknown) => React.ReactNode;\n}\n\n/**\n * ToolResult - Tool result display\n *\n * @example\n * ```tsx\n * <ToolResult\n * result={tool.result}\n * className=\"mt-2 p-2 bg-gray-100 rounded\"\n * />\n * ```\n */\nexport const ToolResult = React.forwardRef<HTMLDivElement, ToolResultProps>(\n ({ className, result, renderResult, ...props }, ref) => {\n const content = renderResult ? renderResult(result) : JSON.stringify(result, null, 2);\n\n return (\n <div\n ref={ref}\n className={className}\n data-tool-result=\"\"\n {...props}\n >\n {typeof content === \"string\" ? <pre>{content}</pre> : content}\n </div>\n );\n },\n);\n\nToolResult.displayName = \"ToolResult\";\n\nexport interface ToolListProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Tool calls to display */\n toolCalls: ToolCall[];\n\n /** Render each tool */\n renderTool?: (toolCall: ToolCall) => React.ReactNode;\n}\n\n/**\n * ToolList - Display list of tool calls\n *\n * @example\n * ```tsx\n * <ToolList\n * toolCalls={agent.toolCalls}\n * className=\"space-y-2\"\n * renderTool={(tool) => (\n * <ToolInvocation {...tool}>\n * <ToolResult result={tool.result} />\n * </ToolInvocation>\n * )}\n * />\n * ```\n */\nexport const ToolList = React.forwardRef<HTMLDivElement, ToolListProps>(\n ({ className, toolCalls, renderTool, ...props }, ref) => {\n return (\n <div\n ref={ref}\n className={className}\n data-tool-list=\"\"\n {...props}\n >\n {toolCalls.map((tool) =>\n renderTool\n ? <React.Fragment key={tool.id}>{renderTool(tool)}</React.Fragment>\n : (\n <ToolInvocation\n key={tool.id}\n name={tool.name}\n args={tool.args}\n status={tool.status}\n >\n {tool.result !== undefined && <ToolResult result={tool.result} />}\n </ToolInvocation>\n )\n )}\n </div>\n );\n },\n);\n\nToolList.displayName = \"ToolList\";\n"],
5
+ "mappings": "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",
6
6
  "names": ["React", "jsx", "React", "jsx", "React", "jsx", "React", "jsx", "jsxs"]
7
7
  }
@@ -1,3 +1,30 @@
1
+ // src/_shims/deno-env.ts
2
+ var denoEnvShim = {
3
+ get(key) {
4
+ return process.env[key];
5
+ },
6
+ set(key, value) {
7
+ process.env[key] = value;
8
+ },
9
+ delete(key) {
10
+ delete process.env[key];
11
+ },
12
+ has(key) {
13
+ return key in process.env;
14
+ },
15
+ toObject() {
16
+ return { ...process.env };
17
+ }
18
+ };
19
+ if (typeof globalThis.Deno === "undefined") {
20
+ globalThis.Deno = {
21
+ env: denoEnvShim,
22
+ cwd: () => process.cwd()
23
+ };
24
+ } else if (typeof globalThis.Deno.env === "undefined") {
25
+ globalThis.Deno.env = denoEnvShim;
26
+ }
27
+
1
28
  // src/core/errors/veryfront-error.ts
2
29
  function createError(error) {
3
30
  return error;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 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 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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",
3
+ "sources": ["../../../src/_shims/deno-env.ts", "../../../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": ["/**\n * Shim for Deno.env.get() to work in Node.js\n * This provides a proper function that reads from process.env\n */\n\n// Create a shim that matches Deno.env.get(key) signature\nconst denoEnvShim = {\n get(key: string): string | undefined {\n return process.env[key];\n },\n set(key: string, value: string): void {\n process.env[key] = value;\n },\n delete(key: string): void {\n delete process.env[key];\n },\n has(key: string): boolean {\n return key in process.env;\n },\n toObject(): Record<string, string> {\n return { ...process.env } as Record<string, string>;\n },\n};\n\n// Assign to globalThis.Deno if it doesn't exist\nif (typeof globalThis.Deno === \"undefined\") {\n (globalThis as any).Deno = {\n env: denoEnvShim,\n cwd: () => process.cwd(),\n };\n} else if (typeof (globalThis as any).Deno.env === \"undefined\") {\n (globalThis as any).Deno.env = denoEnvShim;\n}\n\nexport { denoEnvShim };\n", "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
  }
package/dist/ai/react.js CHANGED
@@ -1,3 +1,30 @@
1
+ // src/_shims/deno-env.ts
2
+ var denoEnvShim = {
3
+ get(key) {
4
+ return process.env[key];
5
+ },
6
+ set(key, value) {
7
+ process.env[key] = value;
8
+ },
9
+ delete(key) {
10
+ delete process.env[key];
11
+ },
12
+ has(key) {
13
+ return key in process.env;
14
+ },
15
+ toObject() {
16
+ return { ...process.env };
17
+ }
18
+ };
19
+ if (typeof globalThis.Deno === "undefined") {
20
+ globalThis.Deno = {
21
+ env: denoEnvShim,
22
+ cwd: () => process.cwd()
23
+ };
24
+ } else if (typeof globalThis.Deno.env === "undefined") {
25
+ globalThis.Deno.env = denoEnvShim;
26
+ }
27
+
1
28
  // src/ai/react/hooks/use-chat.ts
2
29
  import { useCallback, useRef, useState } from "react";
3
30